32
1 RĪGAS TEHNISKĀ UNIVERSITĀTE Datorzinā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 Solomencevs 3. kurss

RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

  • Upload
    ngokhue

  • View
    227

  • Download
    6

Embed Size (px)

Citation preview

Page 1: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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

Page 2: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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

Page 3: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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

Page 4: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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

Page 5: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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.

Page 6: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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();

Page 7: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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[])';

Page 8: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

8

Palaidīsim:

Pamēģināsim ievadīt pārāk lielo skaitli:

Viss strādā kā bija ieplānots.

Page 9: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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

Page 10: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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 {

Page 11: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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)';

Page 12: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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:

Page 13: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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ē.

Page 14: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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

Page 15: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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;

Page 16: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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; }

Page 17: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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.

Page 18: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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[])';

Page 19: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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ā:

Page 20: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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 {

Page 21: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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))

Page 22: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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 }}

Page 23: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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).

Page 24: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

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!

Page 25: RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte. Lietišķās datorzinātnes institūts. Mācību

25

Literatūras saraksts

1. http://docs.oracle.com/cd/B19306_01/java.102/b14187/chsix.htm#BABJJFJC ;