Upload
ngokhue
View
227
Download
6
Embed Size (px)
Citation preview
1
RĪGAS TEHNISKĀ UNIVERSITĀTEDatorzinātnes un informācijas tehnoloģijas fakultāte
Lietišķās datorzinātnes institūts
Mācību priekšmets“ Lielu datu bāzu tehnoloģija”
Java tehnoloģiju izmantošana datu bāzes sistēmā
Izstrādāja: Artūrs Solomencevs3. kurss
2013. gads
2
Saturs
1. .java, .class un .jar failu izveidošana.......................................................................................3
2. Loadjava izmantošana.............................................................................................................5
3. Create or replace java izmantošana.........................................................................................7
4. IDE izmantošana. Izveidosim datu bāzes serverī glabājamo procedūru Java valodā, kas
sadarbojas ar tabulām......................................................................................................................9
5. Trigera implementācija ar Java..............................................................................................14
6. MEMBER metode un Java glabājamās procedūras izsaukšana no Java lietotnes.................16
Secinājumi.....................................................................................................................................24
Literatūras saraksts........................................................................................................................25
3
1. .java, .class un .jar failu izveidošana
Vispirms pamēģināšu uzrakstīt divas nelielas klases.
Calc.java:
public class Calc {
public static void main (String[] args) { int sum = 0; for (int i = 1; i < 6; i++) sum += i;
Printer.Print(sum); } }
Printer.java:
public class Printer { static String str = "The sum is: "; static void Print(int number) { System.out.print(str);
System.out.println(number); } }
Calc klase sūta ziņojumu Printer klasei un tā izvada uz ekrāna tekstu un skaitli, kurš tiek padots kā parametrs.
Nokompilēšu šos failus ar komandām:
javac Calc.java
javac Printer.java
Biju ieguvis divus .class failus. Tagad pamēģināšu apvienot tos vienā .jar failā. Lai to izdarītu uzrakstīšu sekojošo komandu:
jar cvfe MyJarTest.jar Calc *.class
4
Komandas rezultātā biju ieguvis .jar failu, kurā bija iekļautās visas mapē atrodamas klases. Calc klase satur main metodi – tātad tas ir ieejas punkts programmā un mēs varam palaist doto iegūto .jar failu:
java -jar MyJarTest.jar
5
2. Loadjava izmantošanaLai ielādēt izveidotu .jar bibliotēku datu bāzē, uzrakstīšu sekojošu komandu:
C:\oracle\product\10.2.0\db_2\bin\loadjava.bat -u system/[email protected]:1521:baze -v -r -t C:\TEMP\javastarter\jar_test_1\MyJarTest.jar
Konsole rāda, ka ielādēšana pārgāja veiksmīgi. Pārbaudīsim:
col OBJECT_NAME format a30;col OBJECT_TYPE format a15;
select OBJECT_NAME, OBJECT_TYPE, STATUSfrom USER_OBJECTSwhere CREATED >= TO_DATE('08-12-2013', 'DD-MM-YYYY');
Redzam, ka datu bāzē tiešām ir gan Calc, gan Printer klases.
6
Izveidošu PL/SQL karkasu un pamēģināšu palaist programmu datu bāzē.
Create or replace procedure Test_Calc as language JAVA name 'Calc.main(java.lang.String[])';
Taču izrādās, ka Oracle 10.2g DB nevar palaist klases, kas bija kompilētas ar javac no JDK 1.7 versijas. Nodzēsīšu klases no datu bāzes un ielādēšu .java failus atsevišķi, un lai Oracle 10.2 pats to kompilē – tad problēmas ar versiju nebūs.
C:\oracle\product\10.2.0\db_2\bin\dropjava -thin -u system/[email protected]:1521:baze C:\TEMP\javastarter\jar_test_1\MyJarTest.jar
Tā kā Calc klase lieto Printer klases metodi, Printer klasi jāielādē pirmo;
C:\oracle\product\10.2.0\db_2\bin\loadjava.bat -u system/[email protected]:1521:baze -v -r -t C:\TEMP\javastarter\jar_test_1\Printer.java
C:\oracle\product\10.2.0\db_2\bin\loadjava.bat -u system/[email protected]:1521:baze -v -r -t C:\TEMP\javastarter\jar_test_1\Calc.java
Create or replace procedure Test_Calc as language JAVA name 'Calc.main(java.lang.String[])';
Palaidīsim:
set serveroutput ON;call DBMS_JAVA.SET_OUTPUT(2000);call Test_Calc();
7
3. Create or replace java izmantošana
Uzrakstīšu programmu, kas varēs aprēķināt faktoriālu:
Create or replace Java source named "Factorial" aspublic class Factorial { public static void main (String[] args) { if (args.length != 1)
System.out.println("Not valid number of parameters. Should be 1 parameter");else{ int number = Integer.parseInt(args[0]); if (number > 20) { System.out.println("Too big number for this program, sorry!");
System.exit(0); } long result = Factorial(number); if (result > 0) System.out.println("Factorial of " + number + " is = " + result); else System.out.println("Not valid parameter for Factorial function");}
} public static long Factorial(int n) { if (n == 1)
return n;else if (n > 1) return n * Factorial(n - 1);else return -1;
}};
Izveidošu karkasu:
Create or replace procedure Factorial_test(num varchar2) as language java name 'Factorial.main(java.lang.String[])';
8
Palaidīsim:
Pamēģināsim ievadīt pārāk lielo skaitli:
Viss strādā kā bija ieplānots.
9
4. IDE izmantošana. Izveidosim datu bāzes serverī glabājamo procedūru Java valodā, kas sadarbojas ar tabulām.
Vispirms izveidosim divas saistītas tabulas JDeveloper vidē:
Create table Komanda_java( Komandas_ID number Primary key, Nosaukums varchar2(30), Pilseta varchar2(25));
Create table Speletajs_java( Speletaja_ID number primary key, Komandas_ID number, Vards varchar2(20), Uzvards varchar2(30), KPD Real Check(KPD > 0), constraint Ierob_fk5 FOREIGN KEY(Komandas_ID) references Komanda_java(Komandas_ID));
Uzrakstīšu Java klasi, kas ievadīs informāciju tabulās un kura izpildīs SELECT vaicājumu:
create or replace JAVA source named "KomandaManager" as import java.sql.*; import java.io.*;
public class KomandaManager
10
{ // šī klases metode atbild par datu ievadi tabulā KOMANDA_JAVA public static void KomandaInsert(int k_id, String k_nos, String k_pils) throws SQLException { String sql = "Insert into KOMANDA_JAVA Values(?,?,?)"; try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, k_id); pstmt.setString(2, k_nos); pstmt.setString(3, k_pils); pstmt.executeUpdate(); pstmt.close(); conn.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } // šī klases metode atbild par datu ievadi tabulā SPELETAJS_JAVA public static void SpeletajsInsert(int sp_id, int k_id, String sp_vards, String sp_uzv, float kpd) throws SQLException { String sql = "Insert into SPELETAJS_JAVA Values(?,?,?,?,?)"; try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, sp_id); pstmt.setInt(2, k_id); pstmt.setString(3, sp_vards); pstmt.setString(4, sp_uzv); pstmt.setFloat(5, kpd); pstmt.executeUpdate(); pstmt.close(); conn.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } // šī klases metode atbild par datu izvadi public static void SelectKomanda() throws SQLException { String sql = "SELECT A.Komandas_ID, A.Nosaukums, A.Pilseta, B.Speletaja_ID, B.Vards, B.Uzvards, B.KPD ";
sql = sql.concat("FROM KOMANDA_JAVA A, SPELETAJS_JAVA B WHERE A.Komandas_ID = B.Komandas_ID"); try {
11
Connection conn = DriverManager.getConnection("jdbc:default:connection:"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql);
int check = 0;while (rs.next()){ int kom_id = rs.getInt("Komandas_ID"); if (check != kom_id) { check = kom_id; String kom_nos = rs.getString("Nosaukums"); String kom_pils = rs.getString("Pilseta"); System.out.println("\nKomandas_ID: " + kom_id + "; Nosaukums: " + kom_nos + ";
Pilseta: " + kom_pils); } int sp_id = rs.getInt("Speletaja_ID"); String sp_vards = rs.getString("Vards"); String sp_uzv = rs.getString("Uzvards"); float sp_kpd = rs.getFloat("KPD"); System.out.println(" Speletaja_ID: " + sp_id + "; Vards: " + sp_vards + "; Uzvards: " +
sp_uzv + "; KPD: " + sp_kpd); } // while (rs.next())
stmt.close(); conn.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } };
Pakete ar PL/SQL procedūrām – java klases karkass:
create or replace package PAKETE_KOM_JAVA as procedure KOMANDA_JAVA_INSERT(k_id number, k_nos varchar2, k_pils varchar2); procedure SPELETAJS_JAVA_INSERT(sp_id number, k_id number, sp_vards varchar2, sp_uzv varchar2, kpd real); procedure KOMANDA_JAVA_SELECT;end PAKETE_KOM_JAVA;/
create or replace package body PAKETE_KOM_JAVA as procedure KOMANDA_JAVA_INSERT(k_id number, k_nos varchar2, k_pils varchar2) as language JAVA name 'KomandaManager.KomandaInsert(int , java.lang.String, java.lang.String)'; procedure SPELETAJS_JAVA_INSERT(sp_id number, k_id number, sp_vards varchar2, sp_uzv varchar2, kpd real) as language JAVA name 'KomandaManager.SpeletajsInsert(int, int, java.lang.String, java.lang.String, float)';
12
procedure KOMANDA_JAVA_SELECT as language JAVA name 'KomandaManager.SelectKomanda()';
end PAKETE_KOM_JAVA;
Ievadīsim datus, lietojot paketes procedūras:
call PAKETE_KOM_JAVA.KOMANDA_JAVA_INSERT(1001, 'Machines', 'Riga');call PAKETE_KOM_JAVA.KOMANDA_JAVA_INSERT(1002, 'V_cs', 'Ventspils');
call PAKETE_KOM_JAVA.SPELETAJS_JAVA_INSERT(11, 1001, 'Vladimirs', 'Ivanovs', 2.47);call PAKETE_KOM_JAVA.SPELETAJS_JAVA_INSERT(12, 1001, 'Maksims', 'Nikolajevs', 1.54);call PAKETE_KOM_JAVA.SPELETAJS_JAVA_INSERT(13, 1001, 'Arturs', 'Priede', 1.23);call PAKETE_KOM_JAVA.SPELETAJS_JAVA_INSERT(14, 1001, 'Anastasija', 'Radionova', 1.74);
Izmantosim procedūru, kas izvada datus:
13
SET SERVEROUTPUT ON;CALL dbms_java.set_output(2000);
call PAKETE_KOM_JAVA.KOMANDA_JAVA_SELECT();
Rezultāts:
Tātad informācija bija izvadīta tā, ka aprakstījām Java klases metodē.
14
5. Trigera implementācija ar Java
Izveidošu trigeri, kas palaidīsies, kad lietotājs ievadīs rakstu tabulā RECTANGULARS_JAVA – tas ierakstīs attiecīga taisnstūra laukumu tabulā RECTANGULARS_Laukumi.
Java kods:
create or replace JAVA source named "RectangularTrigger" asimport java.sql.*;import java.io.*;import oracle.jdbc.*;
public class RectangularTrigger{ public static void rectAreaFill (int id, int a, int b) throws SQLException { String sql = "INSERT INTO Rectangulars_Laukumi Values(?, ?)"; try {
Connection conn = DriverManager.getConnection("jdbc:default:connection:"); PreparedStatement pstmt = conn.prepareStatement(sql);
int area = a * b; pstmt.setInt(1, id); pstmt.setInt(2, area);
pstmt.executeUpdate(); pstmt.close();
conn.close(); } catch (SQLException e) {System.err.println(e.getMessage());} }};
Karkasa izveidošana:
Create or replace procedure RectTrig (rect_id NUMBER, a_mala NUMBER, b_mala NUMBER) as language Java name 'RectangularTrigger.rectAreaFill(int, int, int)';
Tabulas:
Create table Rectangulars_JAVA( rect_ID NUMBER Primary Key, a_mala NUMBER, b_mala NUMBER);
Create table Rectangulars_Laukumi( rect_ID Number Primary key, area NUMBER
15
);
Trigeris, kas izsauc Java procedūru:
Create or replace trigger Rect_triggerBefore Insert on RECTANGULARS_JAVAfor each rowCall RectTrig(:new.rect_ID, :new.a_mala, :new.b_mala)
Ievadīšu dažus ierakstus pirmā tabulā un pārbaudīšu, kas izmainījās otrā tabulā:
begin Insert into RECTANGULARS_JAVA(rect_ID, a_mala, b_mala) Values(1, 5, 10); Insert into RECTANGULARS_JAVA(rect_ID, a_mala, b_mala) Values(2, 2, 3); Insert into RECTANGULARS_JAVA(rect_ID, a_mala, b_mala) Values(3, 5, 4); Insert into RECTANGULARS_JAVA(rect_ID, a_mala, b_mala) Values(4, 1, 11);end;
SELECT * FROM RECTANGULARS_LAUKUMI;
Otrajā tabulā bija ierakstīti attiecīgie laukumi.
SELECT A.rect_ID, A.a_mala, A.b_mala, B.AreaFROM RECTANGULARS_JAVA A, RECTANGULARS_LAUKUMI BWHERE A.rect_id = B.rect_id;
16
6. MEMBER metode un Java glabājamās procedūras izsaukšana no Java lietotnes
Izveidosim objekta tipu, kas apraksta trīsstūri:
Create or replace type TRIANGLE_JAVA as object ( ID number, a_mala number, b_mala number, c_mala number, MEMBER function AREA return real as language Java name 'TriangleClass.area() return float');
MEMBER metode atgriezīs trīsstūrīšu laukumus. Metodi rakstīsim Java valoda. Lai metode varētu tikt pie objekta atribūtiem, vajadzēs implementēt Oracle objekta tipu kā Java klasi. Šo pieeju atradīju resursā [1].
TriangleClass.java:
import java.sql.*;import java.io.*;
public class TriangleClass implements SQLData{ private int id; private int a_mala; private int b_mala; private int c_mala; // mūs interesejošā metode: public double area() { int a = a_mala;
int b = b_mala;int c = c_mala;if ((a + b < c) || (b + c < a) || (a + c < b)) // parbaude vai trissturis var eksistet return (double) -1;double p = ((double) a + b + c) / 2;return Math.sqrt(p * (p - a) * (p - b) * (p - c));
} String sql_type;
// pārējās metodes vajag pārdefinēt, lai implementācija būtu korekta public String getSQLTypeName() throws SQLException { return sql_type; }
17
public void readSQL(SQLInput stream, String typeName) throws SQLException { sql_type = typeName;
id = stream.readInt(); a_mala = stream.readInt(); b_mala = stream.readInt();
c_mala = stream.readInt(); }
public void writeSQL(SQLOutput stream) throws SQLException { stream.writeInt(id); stream.writeInt(a_mala); stream.writeInt(b_mala);
stream.writeInt(c_mala); }
}
Izveidosim objektu tabulu un ievadīsim datus:
Create table TRIANGLES_JAVA of TRIANGLE_JAVA;
begin Insert into TRIANGLES_JAVA Values(TRIANGLE_JAVA(1, 20, 10, 11)); Insert into TRIANGLES_JAVA Values(TRIANGLE_JAVA(2, 3, 4, 5)); Insert into TRIANGLES_JAVA Values(TRIANGLE_JAVA(3, 12, 8, 3)); Insert into TRIANGLES_JAVA Values(TRIANGLE_JAVA(4, 9, 12, 15)); Insert into TRIANGLES_JAVA Values(TRIANGLE_JAVA(5, 10, 8, 9));end;
Pārbaudīsim, vai metode strādā korekti:
Select a_mala as a, b_mala as b, c_mala as c, Value(A).area() as AreaFrom TRIANGLES_JAVA A;
Jā, metode strādā kā vajag: tā atgriež trīsstūra laukuma vērtību un atgriež -1, ja trīsstūris ar tādām malām nevar eksistēt. Tātad es implementēju objekta MEMBER metodi ar Java valodu.
Tagad vajag uzrakstīt procedūru, kas lietos šo metodi. To es arī uzrakstīšu ar Java. Es gribu iegūt procedūru, kas saņem trīsstūra ID un ieraksta parametros malu un laukuma vērtības.
18
import java.sql.*;import java.io.*;
public class TriangleManager{ public static void getTriangleAllAttributes (int tr_id, int[] a, int[] b, int[] c, double[] area)
throws SQLException { try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); PreparedStatement pstmt = null; ResultSet rs = null;
String sql = "Select a_mala, b_mala, c_mala, Value(A).area() as area " + "From TRIANGLES_JAVA A " +
"Where A.ID = ?";
pstmt = conn.prepareStatement(sql); pstmt.setInt(1, tr_id); rs = pstmt.executeQuery();
if (rs.next()) { a[0] = rs.getInt("a_mala");
b[0] = rs.getInt("b_mala"); c[0] = rs.getInt("c_mala"); area[0] = rs.getDouble("area"); } else { a[0] = 0; b[0] = 0; c[0] = 0; area[0] = 0;
} } catch (SQLException e) {System.err.println(e.getMessage());} }}
Izveidosim karkasu:
Create or replace procedure getTriangleAllAttributes (TR_ID IN NUMBER, TR_A OUT NUMBER, TR_B OUT NUMBER, TR_C OUT NUMBER, AREA OUT DOUBLE PRECISION) AS language Java name 'TriangleManager.getTriangleAllAttributes (int, int[], int[], int[], double[])';
19
Procedūra ieraksta rezultātu OUT tipa argumentos. Pirmais arguments – trīsstūra ID.
Pārbaudīsim, vai procedūra strādā, izsaucot to PL/SQL programmiņā:
set serveroutput ON;call DBMS_JAVA.SET_OUTPUT(2000);
declare tr_a Number; tr_b Number; tr_c Number; tr_area DOUBLE PRECISION; BEGIN GETTRIANGLEALLATTRIBUTES(1, tr_a, tr_b, tr_c, tr_area); dbms_output.Put_line('Trisstura malas:'); dbms_output.Put_line(' ' || tr_a || ' ' || tr_b ||' ' || tr_c); dbms_output.Put_line('Trisstura laukums:'); dbms_output.Put_line(' ' || tr_area);end;
Rezultātā iegūsim trīsstūra malu garumus un laukumu:
Tātad gan MEMBER metode, gan procedūra ar OUT parametriem strādā korekti. Pēdējais solis būs uzrakstīt lietojumu, kas izmantos šo procedūru.
Mūsu lietojumam vajadzēs draiveris oracle.jdbc.driver.OracleDriver. Tāpēc, vajadzēs importēt Java bibliotēku projektā:
20
Es lietoju ojdbc14.jar bibliotēku.
Programmas kods:
package Pakete_1;
// 1. solis vajadzigo pakesu importesanaimport java.sql.*;import oracle.jdbc.driver.*;
public class TriangleTest {
21
static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver"; static final String DB_URL = "jdbc:oracle:thin:@169.254.64.172:1521:baze"; static final String USER = "system"; static final String PASS = "qwert"; public TriangleTest() {}
public static void main(String[] args) { Connection conn = null; CallableStatement stmt = null;
try { // 2. solis: JDBC registresana try { Class.forName(JDBC_DRIVER); } catch(ClassNotFoundException ex) { System.out.println("Error: unable to load driver class!"); System.exit(1);}
// 3. solis: Savienojuma ar DB izveidosana System.out.println("Savienojuma veidosana ar datu bazi ..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); // 4. solis: SQL vaicajums String sql = "{call getTriangleAllAttributes(?, ?, ?, ?, ?)}"; stmt = conn.prepareCall(sql); stmt.registerOutParameter(2, Types.INTEGER); stmt.registerOutParameter(3, Types.INTEGER); stmt.registerOutParameter(4, Types.INTEGER); stmt.registerOutParameter(5, Types.DOUBLE); // ciklā tiek izsaukta glabātā procedūra kopā 6 reizes for (int tr_id = 1; tr_id < 7; tr_id++) { // 5. solis: uzdot parametru un izpildīt vaicājumu stmt.setInt(1, tr_id); stmt.execute(); int a_mala = stmt.getInt(2); int b_mala = stmt.getInt(3); int c_mala = stmt.getInt(4); double area = stmt.getDouble(5); if ((area > 0) || (area == 0 && a_mala > 0))
22
{ System.out.println("Trissturis ar ID: " + tr_id); System.out.println(" a: " + a_mala + "; b:" + b_mala + "; c:" + c_mala); System.out.println(" Laukums: " + area); } else if (area < 0) { System.out.println("Trissturis ar ID: " + tr_id); System.out.println(" a: " + a_mala + "; b:" + b_mala + "; c:" + c_mala); System.out.println(" Trissturis ar tadam malam nevar eksistet!"); } else System.out.println("Trissturis ar ID: " + tr_id + " - neeksiste datu bazee"); System.out.println(); }
// 6. solis: aizvert savienojumu un interfeisu stmt.close(); conn.close(); } catch(SQLException se){ //Handle errors for JDBC se.printStackTrace(); } catch(Exception e){ //Handle errors for Class.forName e.printStackTrace(); } // clean-up finally{ //finally block used to close resources try { if(stmt!=null) stmt.close(); } catch(SQLException se2){ }// nothing we can do try { if(conn!=null) conn.close(); } catch(SQLException se) { se.printStackTrace(); } } //end finally try }}
23
Palaidīsim programmu:
Kā varam redzēt, viss strādā tā, kā bija ieplānots. Lietotne izsauc procedūru, kas savukārt gan nolasa datus no objektu tabulas, gan izsauc objekta metodi, kas atgriež laukumu. Programma ziņo ja trīsstūris ar doto ID neeksistē datu bāzē (ID: 3), un ja trīsstūris ar tādām malu garumiem nevar eksistēt (ID: 6).
24
Secinājumi
Darba gaitā es iepazinos ar iespējām, kurus piedāvā Java valoda darbā ar datu bāzi.Vispirms es iemācījos veidot .jar failu no dažādiem .class failiem. .jar faili dod iespēju
apvienot klases bibliotēkā un ērti ar tam strādāt.Es iemācījos ielādēt java klases datu bāzē. To var izdarīt ar programmu loadjava. Nodzēst
klasi no datu bāzes ir iespējams ar dropjava. Secināju, ka ļoti svarīgi, lai JDK versija būtu vienāda, jo Oracle datu bāze 10.2g nevarēja palaist .jar failu, kas bija izveidots ar 1.7 versiju.
Java valodas programmas var ievietot datu bāze caur SQL*Plus, uzrakstītu pirmkodu. Tas arī ir ērti, jo ietaupa laiku – nevajag lietot loadjava.
Jebkurā gadījumā Java programmai jāuztaisa PL/SQL karkass, lai programmu varētu palaist. Tas ir aktuāli, kad mēs izsaucam procedūru gan no SQL*Plus, gan no PL/SQL programmas, gan no Java lietotnes.
Lielāku daļu no darba taisīju IDE JDeveloper vidē. Strādāt ar to ir efektīvāk, nekā tikai ar SQL*Plus, jo viss vajadzīgs ir integrēts – gan redaktors, gan savienojums ar DB, gan kompilators u.t.t.
Java procedūras ļauj strādāt ar tabulu datiem – RDB un ORDB tabulām. Ir arī sarežģītas lietas – interfeisi, draiveri, dažādi tipi... Tomēr, darbs kļuva interesantāks un atveras jaunas iespējas, t.i., lietotnes un datu bāzē glabājamo procedūru savstarpēja sadarbība, Java valodas elastība (vismaz pēc pirmā iespaida).
Visvairāk patika lietas, ko es izdarīju pēdējā nodaļā. Es implementēt datu bāzes objekta tipu kā Java klasi. Tas ļauj definēt metodes ar Java valodu. Pēc tam es uztaisīju procedūru, kas strādā ar objektu tabulu un caur OUT parametriem nodod rezultātu. Un beigās uzrakstīju lietojuma programmu Java valodā, kas sadarbojas ar šo procedūru. Tātad rezultāta izveidojas interesanta arhitektūra.
Galvenais ieguvums no darba ir tāds, ka izveidojas stiprs priekšstats, kā lietojumprogramma var sadarboties ar datu bāzi. Datu bāzes programmēšana vēl vairāk paplašina iespējas. Tagad esmu spējīgs rakstīt interesantākas programmas, jo datu apmaiņa un glabāšana vienmēr ir svarīga.
Paldies par interesanto kursu!
25
Literatūras saraksts
1. http://docs.oracle.com/cd/B19306_01/java.102/b14187/chsix.htm#BABJJFJC ;