35
Contents 1. Nelielas Java klases programmas definēšana, kompilēšana un izvade....................................................... 3 2. Java klases programma ielāde datubāzē ar loadjava programmu un definēšana ar CREATE JAVA.................................5 3. JDBC pamatfunkcijas un darbības sākums...................13 4. Java klases metožu pielietošana SQL komandu izpildei (datu ievade)..................................................... 18 5. Java klases metožu pielietošana SQL komandu izpildei (datu izvade)..................................................... 23 6. Metodes definēšana ar JAVA klasi un tās pielietošana.....26 7. Secinājumi............................................... 28 8. Lietotā literatūra.......................................30 1

1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

Embed Size (px)

Citation preview

Page 1: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

Contents1. Nelielas Java klases programmas definēšana, kompilēšana un izvade.................................3

2. Java klases programma ielāde datubāzē ar loadjava programmu un definēšana ar CREATE JAVA..........................................................................................................................................5

3. JDBC pamatfunkcijas un darbības sākums..........................................................................13

4. Java klases metožu pielietošana SQL komandu izpildei (datu ievade)...............................18

5. Java klases metožu pielietošana SQL komandu izpildei (datu izvade)................................23

6. Metodes definēšana ar JAVA klasi un tās pielietošana.......................................................26

7. Secinājumi..........................................................................................................................28

8. Lietotā literatūra.................................................................................................................30

1

Page 2: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

1. Nelielas Java klases programmas definēšana, kompilēšana un izvade

Darbs tiek pildīts ar Ortus.rtu.lv piedāvāto Oracle SQL Developer un Java Developer Kit 1.8.0_05. Tā kā pirmais uzdevums ir vienkārši parādīt pašus Java valodas lietošanas pamatus, no sākuma izveidošu nelielu klasi, kas radīs programmas objektu tipam manā datubāzē analoģiskus objektus un tos ievietos masīvā, no kurienes notiks datu izvade. Programmu pirmkoda rakstīšanu jeb definēšanu veicu Notepad ++ vidē. Tātad šī klase praktiski veidos mazu rindas objektu tabulu java vidē.

Objekta tips manā datubāzē:create or replacetype PROGRAM as object (Ident_numurs number(3,0),Nosaukums varchar2(30),Klasifikacija varchar2(30));

PIRM_UZD.java faila saturs (definēšana)

// No sakuma define objektu klasi (lidzigi ka objektu tipu datubaze)class Programma {private int Ident_numurs;private String Nosaukums;private String Klasifikacija;//Definesim konstruktoru lidzigi ka konstruktora metodes definesana datubazes objektu tipampublic Programma(int i, String a, String b) {Ident_numurs=i; Nosaukums = a; Klasifikacija = b;}//Aprakstisu izvades metodes dotajai objektu klasei (individualu atributu ievadi soreiz nevajadzes) public int getID() {return Ident_numurs;}public String getNos() {return Nosaukums;}public String getKlas() {return Klasifikacija;} }

public class PIRM_UZD{public static void main(String[] args){//Tagad veiksu pasa programmu masiva izveidiProgramma Programmas[]= new Programma[3];Programmas[0]= new Programma(1,"Zumba","Datorspele");Programmas[1]= new Programma(2,"Klints","Draiveris");

2

Page 3: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

Programmas[2]= new Programma(3,"Plits","Registra tiritajs");//Veiksu izvadifor (Programma p : Programmas) System.out.println(p.getID()+". programmas nosaukums ir " + p.getNos() + "un tas/ta ir" + p.getKlas());}}

Tālāk ar komandu iekš Windows command line ievadīju komandu javac PIRM_UZD.java. Javac.exe kompilē izveidoto java failu. Pēc tam ar java PIRM_UZD komandu veicu kompilētās programmas palaišanu. Svarīgi pieminēt to, ka jdk jeb java development kit nepalaiž java failus, to dara ieinstalētais java lietojums. Jdk uzdevums ir izpildīt kompilāciju un dot palīglīdzekļus java programmu izveidei. Vēl varu piebilst, ka vismaz manam ieinstalētajam java lietojumam ir problēmas ar garo burtu lietošanu līdzskaņiem.

Iegūtais izraksts:

3

Page 4: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

2. Java klases programma ielāde datubāzē ar loadjava programmu un definēšana ar CREATE JAVA.

Loadjava komandu arī ir jāizpilda komandlīnijā, bet, pirms to var darīt, jāinstalē oracle klients, kurā bin mapē atroda loadjava.bat programma. Šim nolūkam izmantoju oracle 11g R2 klientu. Ielādēšu jau iepriekš izveidoto PIRM_UZD.java pirmkodu, bet to nedaudz pārveidošu.

Komandlīnijā ievadītā komanda:

loadjava –u DB_121RDB505/[email protected]:1521:DITF11 –v –r- t PIRM_UZD.java, kur loadjava norāda uz komandu, u norāda ir lietotāja parametrs DB_121RDB505 ir gan lietotāja vārds, gan parole (kā izsniegts visiem RTU studentiem šajā kursā), 85.254.218.228 ir servera ip adrese, 1521 ir ports un DITF11 ir SID. PIRM_UZD.java ir ielādētais java fails. Iegūtais izraksts:

Datubāzē tālāk aplūkošu nesen izveidoto objektu metadatus.

select OBJECT_NAME, OBJECT_TYPE, STATUS, CREATED, GENERATEDfrom USER_OBJECTSwhere CREATED >= TO_DATE('13-11-2014', 'DD-MM-YYYY');Izvadītie dati:

4

Page 5: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

Kā redzams, kopumā tika radīti septiņi objekti datubāzē pēc šīs vienas java programmas pirmkoda ievades. Tas ir tādēļ, ka iekš loadjava komandas es arī liku java programmu kompilēt. Pats pirmkods atrodas PIRM_UZD Java source tipa objektā. JAVA CLASS objekti apraksta atšķirīgās objektu klases, kas tika definētas programmā. LOB tabula apraksta vai tiek veidoti tā saucamie „lielie objekti”. Java options satur opcijas. LOB un INDEX tipa objektus, kā redzams, datubāze patstāvīgi ģenerē JAVA programmas objektu indeksēšanai un aprakstīšanai.

Izdzēsu ar programmu PIRM_UZD datubāzē esošos objektus un ievadīju jaunu java programmas pirmkodu PIRM_UZD2. Pirmajā uzdevumā nebija paredzētā izvade ar return funkciju, tādēļ vajadzēja java pirmkodu nedaudz pārveidot.

PIRM_UZD2 pirmkods:

// No sakuma define objektu klasi (lidzigi ka objektu tipu datubaze)class Programma2 {private int Ident_numurs1;private String Nosaukums1;private String Klas;//Definesim konstruktoru lidzigi ka konstruktora metodes definesana datubazes objektu tipampublic Programma2(int i, String a, String b) {Ident_numurs1 = i; Nosaukums1 = a; Klas = b;}//Aprakstisu izvades metodes dotajai objektu klasei (individualu atributu ievadi soreiz nevajadzes) public int getID1() {return Ident_numurs1;}public String getNos1() {return Nosaukums1;}public String getKlas1() {return Klas;} }

public class PIRM_UZD2{public static String Izvade1() {String Izvads1 = " ";//Tagad veiksu pasa programmu masiva izveidiProgramma2 Programmas1[]= new Programma2[3];Programmas1[0]= new Programma2(1,"Zumba","Datorspele");Programmas1[1]= new Programma2(2,"Klints","Draiveris");Programmas1[2]= new Programma2(3,"Plits","Registra tiritajs");//Veiksu izvadifor (Programma2 p : Programmas1) Izvads1=(Izvads1 + p.getID1()+". " + p.getNos1() + " " + p.getKlas1());return Izvads1;}

5

Page 6: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

public static void main(String[] args){String Izv1 = Izvade1();System.out.println(Izv1);}}

Atkal izmantoju loadjava komandu, lai datubāzē ielādētu šo java programmu. Pēc tam definēju funkciju, kas izmanto ielādētajā programmā esošo funkciju Izvade, kas vienā simbolu virknē izvada visu trīs izveidotos objektu datus.

create or replace function Izvade return varchar2 as language java name 'PIRM_UZD2.Izvade() return java.lang.String';

6

Page 7: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

Tālāk izmantoju sql plus programmu, lai izgūtu datus. Darbību izvads:

Sqlplus komandā norādīts ir lietotāja nosaukums/parole@IP datubāzei/SIDSet serveroutput ON; atļauj izgūt datus no datubāzes.Call DBMS_JAVA.SET_OUTPUT(2000); dod iespēju strādāt ar java programmām.Variable vari varchar2(200); norāda uz mainīgo tā lietotāja datora atmiņā, kurš rada savienojumu. Šajā mainīgajā ar komandu call Izvade() into :vari; ievietoju simbolu rindu, kura rodas java programmas izpildes rezultātā. Print vari; izvada mainīgā saturu uz ekrāna.

7

Page 8: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

Izveidoto objektu metadati:

select OBJECT_NAME, OBJECT_TYPE, STATUS, CREATED, GENERATEDfrom USER_OBJECTSwhere CREATED >= TO_DATE('13-11-2014', 'DD-MM-YYYY');

Tālāk izmantošu komandu create java, lai varētu definēt java programmas pirmkodu iekš sql*plus un to uzreiz ielādēt datubāzē. Izmantošu to pašu programmu, bet nedaudz mainīšu izvadītos datus.

CREATE JAVA vaicājums:

CREATE or replace JAVA source named "OTR_UZD" ASpublic class OTR_UZD{public static String Izvade1() {String Izvads1 = " ";Programma3 Programmas1[]= new Programma3[3];Programmas1[0]= new Programma3(4,"Kamnits","Datorspele");Programmas1[1]= new Programma3(5,"GAZE","Draiveris");Programmas1[2]= new Programma3(6,"BUMSs","Registra tiritajs");for (Programma3 p : Programmas1) Izvads1=(Izvads1 + p.getID1()+". " + p.getNos1() + " " + p.getKlas1());return Izvads1;}public static void main(String[] args){String Izv1 = Izvade1();System.out.println(Izv1);}}

class Programma3 {private int Ident_numurs1;private String Nosaukums1;private String Klas;public Programma3(int i, String a, String b) {Ident_numurs1 = i; Nosaukums1 = a; Klas = b;}

8

Page 9: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

public int getID1() {return Ident_numurs1;}public String getNos1() {return Nosaukums1;}public String getKlas1() {return Klas;} }/

Sql plus izraksts:

Izveidošu attiecīgi uz šīs programmas izvades balstītu funkciju, tāpat kā iepriekšējai programmai.

create or replace function Izvade2 return varchar2 as language java name 'OTR_UZD.Izvade() return java.lang.String';

Ar sql plus programmu veicu šīs funkcijas izsaukšanu:

9

Page 10: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

Pirmā kļūda ir tādēļ, ka nedaudz kļūdījos funkcijas definīcijā un otrajā kļūdā nepieliku varchar2 simbolu skaitu. Tas ir ļoti svarīgi definējot sql plus mainīgos. Izvadīšu visus izveidoto objektu metadatus:

select OBJECT_NAME, OBJECT_TYPE, STATUS, CREATED, GENERATED, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID, SECONDARY, TEMPORARYfrom USER_OBJECTSwhere CREATED >= TO_DATE('13-11-2014', 'DD-MM-YYYY');

10

Page 11: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

Lielu daļu šo objektus aprakstošo metadatu atribūtus es paskaidroju jau pirmajā darbā. Object_name ir objekta nosaukums, OBJECT_TYPE ir tā tips, STATUS norāda uz to, vai norādītais objekts ir kompilēts, kas ir īpaši svarīgi izmantojot iekš datubāzes vai SQL PLUS komandu CREATE JAVE, kuras rezultātā tiek tieši ielādēts objekts, bet kompilācija netiek veikta. Ja ielādētajā java klases programmā ir kļūda, to uzzinās, kad tiks pielietota šī programma kādā funkcijā un, ja tajā būs kāda kļūda, būs jāpārveido programma, tā atkal jāielādē utt. Līdz ar to, manuprāt, gudrāk ir izmantot javac kompilēšanas komandu līdz java programma ir gatava darbam un to ielādēt ar oracle programmu loadjava. Tad vismaz ir drošs tas, ka programma strādā (protams, vēl joprojām var būt loģikas kļūdas).GENERATED norāda to, vai datubāze pati automātiski ir ģenerējusi šos objektus.SUBOBJECT_NAME norāda uz apakšobjekta nosaukumu (ja tāds ir).OBJECT_ID ir šim objektam unikāls piedēvēts objekta identifikators datubāzē.DATA_OBJECT_ID ir šajā objektā ievadīto datu identifikators. Kā redzams, pašiem java objektiem nav piedefinēti dati, tie rodas šo klašu programmām izpildoties.SECONDARY apraksta, vai fails ir veidots ar ODCIINDEXCREATE metodi. Manā gadījumā tāda nav.TEMPORARY norāda, vai objekts netiks izdzēsts sesijas (savienojuma) beigās. Arī tādu manā darbā nav.Vēl viens metadatu atribūts, kuru man neļāva izvadīt kopā ar pārējiem (nezinu kāpēc) ir OWNER, kas apraksta, kam šie objekti pieder. Protams, šie objekti pieder manam lietotājam.

11

Page 12: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

3. JDBC pamatfunkcijas un darbības sākums

JDBC dzinis ļauj java valodas programmām veikt savienojumu ar kādu datu bāzi un izmantot to kā datu avotu. Programma var arī veikt izmaiņas datubāzē, piemēram, radot jaunas tabulas vai ievietojot datus.

Pamata ideja JDBC darbībai ir Savienojuma elementa definēšana norādot, kādu draiveri, lietotāja vārdu, paroli un kādam serverim pievienoties (precīzāks URL vērtību apraksts būs vēlāk). Tālāk definē vaicājumu komandas objektā, kas izpildīs nepieciešamo darbību caur šo savienojuma elementu. Jārēķinās ar to, ka vienā komandas objektā būs viens vaicājums. Ja tiek veikta datu izvade, jādefinē arī rezultātu objekts, kas saturēs vaicājuma rezultātu rindas. Tālāk tās var cikliski izvadīt (visi šie elementi tiks pielietoti tālākos uzdevumos).

Lai parādītu JDBC pamatus, izpildīšu vienkāršu JDBC versijas izgūšanu no servera. Varu piebilst, ka nācās pāriet uz eclipse lietojumu java programmu veidošanai, jo JDBC nestrādāja ar vienkāršu javac / java komandu pielietošanu komandlīnijā, bet par daudzajām problēmām veicot šo darbu tālāk rakstīšu secinājumos. Java pirmkods:

import java.sql.*;import oracle.jdbc.*; import oracle.jdbc.pool.OracleDataSource;

public class savien{public static void main (String args[]) throws SQLException{OracleDataSource datuAv = new OracleDataSource();// Datu avots DatuAv norada uz to datubazi, ar kur Java programma stradas.datuAv.setURL("jdbc:oracle:thin:DB_121RDB505/[email protected]:1521:DITF11");// Savienosanas notiek lidzigi ka ieprieks aprakstitaja loadjava komanda, bet janorada jdbc darbiba.Connection savien= datuAv.getConnection();// getConnection funkcija veic savienojuma izveidi ar datu avotu, kas laus talaku darbibu izpildi.DatabaseMetaData met = savien.getMetaData();// Izgust metadatus par datubaziSystem.out.println("JDBC versija: " + met.getDriverVersion());}}Izgūtais rezultāts:

12

Page 13: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

Kā redzams kodā, OracleDataSource() funkcijas rezultāts ir objekts, kuru izmanto kā sasaisti starp datu avotu (datubāzi) un java programmu. setURL funkcija norāda, ar ko savienojums ir jāveic. Parametri tiek definēti līdzīgi kā savienojoties ar datubāzi izmantojot loadjava komandu komandlīnijā , bet ir jānorāda to, ka tiek izmantots jdbc dzinis.

jdbc:oracle:thin:DB_121RDB505/[email protected]:1521:DITF11

jdbc:oracle:thin: norāda uz jdbc dzini.DB_121RDB505/DB_121RDB505 norāda lietotāja nosaukumu un paroli.

85.254.218.228:1521:DITF11 norāda ip adresi, kur atrodas datubāze, porta numuru un SID jeb darba vides identifikatoru.

getConnection veic savienojuma radīšanu ar datubāzi izmantojot setURL norādītās vērtības.

Kad savienojums definēts, var veikt darbības ar datu avotu izmantojot šo savienojumu. Šajā gadījumā es izguvu jdbc dziņa versiju, kuru izmanto datubāze.Ar getMetaData funkciju izguvu metadatus no datubāzes un ar getDriverVersion izguvu no meta datu objekta tieši dziņa versiju.

Tālāk izpildīšu vienkāršu vaicājumu, lai parādītu vaicājumu izpildi ar JDBC interfeisa palīdzību.

Java pirmteksts:

import java.sql.*;import oracle.jdbc.*; import oracle.jdbc.pool.OracleDataSource;

public class savien2{public static void main (String args[]) throws SQLException{OracleDataSource datuAv = new OracleDataSource();// Datu avots DatuAv norada uz to datubazi, ar kur Java programma stradas.datuAv.setURL("jdbc:oracle:thin:DB_121RDB505/[email protected]:1521:DITF11");// Savienosanas notiek lidzigi ka ieprieks aprakstitaja loadjava komanda, bet janorada jdbc darbiba.Connection savien= datuAv.getConnection();// getConnection funkcija veic savienojuma izveidi ar datu avotu, kas laus talaku darbibu izpildi.Statement TAB_IZV = savien.createStatement();// Izveidoju vaicajuma mainigoTAB_IZV.executeUpdate("CREATE TABLE PROGRAMMOV " + "(Ident_numurs number(3,0), " + " Nosaukums varchar2(30), " +

13

Page 14: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

" Klasifikacija varchar2(30))"); // Veidojam vaicajumu, kura merkis ir radit programma objektam analogisku tabuluSystem.out.println("Tabulas izveide pabeigta");}}

Iegūtais izraksts pēc pirmkoda palaišanas:

Apskatīšu datubāzi, lai varētu redzēt vai tabula tiešām izveidota:

Kā redzams, datubāzē tabula PROGRAMMOV tik tiešām ir izveidota. Tālāk veiksim datu ievadi šajā tabulā. TAB_IZV mainīgo definēju kā vaicājuma sql kodu datubāzei un tajā ievietoju tabulas izveides kodu.

Java pirmkods:import java.sql.*;import oracle.jdbc.*; import oracle.jdbc.pool.OracleDataSource;public class savien3{public static void main (String args[]) throws SQLException{OracleDataSource datuAv = new OracleDataSource();// Datu avots DatuAv norada uz to datubazi, ar kur Java programma stradas.datuAv.setURL("jdbc:oracle:thin:DB_121RDB505/[email protected]:1521:DITF11");// Savienosanas notiek lidzigi ka ieprieks aprakstitaja loadjava komanda, bet janorada jdbc darbiba.Connection savien= datuAv.getConnection();// getConnection funkcija veic savienojuma izveidi ar datu avotu, kas laus talaku darbibu izpildi.Statement TAB_IZV = savien.createStatement();// Izveidoju vaicajuma mainigoTAB_IZV.executeUpdate("INSERT INTO PROGRAMMOV values " + "(1,'Kamits','Dzinis')");TAB_IZV.close();Statement TAB_IZV1 = savien.createStatement();//Izveidoju vaicajuma mainigoTAB_IZV1.executeUpdate("INSERT INTO PROGRAMMOV values " +

14

Page 15: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

"(2,'Zvers','Operetajsistema')");TAB_IZV1.close();Statement TAB_IZV2 = savien.createStatement();//Izveidoju vaicajuma mainigoTAB_IZV2.executeUpdate("INSERT INTO PROGRAMMOV values " + "(3,'Ej zakos','Datorspele')");TAB_IZV2.close();System.out.println("Datu ievade pabeigta");}}

Izraksts:

Apskatīšu datubāzes tabulas saturu:SELECT * from programmov;

Darbības princips tāds pats kā izveidojot tabulu, bet tabulas izveides vaicājuma vietā jāieraksta datu ievades vaicājums. Veidoju trīs vaicājumus, jo vēlējos ievietot trīs rindas.Tagad apskatīšu, ko darīt, lai veiktu šo izvadi nevis datubāzē pašā, bet ar java programmu.

Java pirmkods:

import java.sql.*;import oracle.jdbc.*; import oracle.jdbc.pool.OracleDataSource;

public class savien4{public static void main (String args[]) throws SQLException{OracleDataSource datuAv = new OracleDataSource();// Datu avots DatuAv norada uz to datubazi, ar kur Java programma stradas.datuAv.setURL("jdbc:oracle:thin:DB_121RDB505/[email protected]:1521:DITF11");// Savienosanas notiek lidzigi ka ieprieks aprakstitaja loadjava komanda, bet janorada jdbc darbiba.Connection savien= datuAv.getConnection();// getConnection funkcija veic savienojuma izveidi ar datu avotu, kas laus talaku darbibu izpildi.Statement TAB_IZVADE = savien.createStatement();// Izveidoju vaicajuma mainigo

15

Page 16: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

ResultSet Ieraksti = TAB_IZVADE.executeQuery("SELECT Ident_numurs, Nosaukums, Klasifikacija from PROGRAMMOV");while(Ieraksti.next()){

int id = Ieraksti.getInt("Ident_numurs");String Nos = Ieraksti.getString("Nosaukums");String Klas = Ieraksti.getString("Klasifikacija");System.out.print("Ident_numurs: " + id);System.out.print("Nosaukums: " + Nos);System.out.print("Klasifikacija: " + Klas);System.out.println("");

}TAB_IZVADE.close();System.out.println("Datu ievade pabeigta");}}

Ar executeQuery funkciju tiek datubāzē izpildīts vaicājums. Kā apskatīts pagājušajā darbā, pēc vaicājuma izpildes rezultāti tiek ievadīti operatīvās atmiņas rezervētā apgabalā. Šo apgabalu iekš RecordSet mainīgā izgūst no datubāzes un ielasa tā datora atmiņā, uz kura tiek palaista java programma. Tālāk no šīs atmiņas izgūst atribūtu vērtības ( ar funkcijām getInt un getString šajā gadījumā). while(Ieraksti.next()) mērķis ir atkārtot šo ierakstu izvadi līdz visas rindas ir izvadītas.

Tātad esam redzējuši kā izgūt draivera informāciju (kā arī citus datubāzes metadatus), kā izveidot tabulas un, ja nepieciešams tāpat var arī izveidot objektu tipus, kā veikt datu ievadi ar SELECT komandu no relāciju DB un kā veikt datu izvadi ar SELECT komandu no relāciju DB, pielietojot JDBC interfeisu.

16

Page 17: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

4. Java klases metožu pielietošana SQL komandu izpildei (datu ievade)

Pamatā SQL vaicājumu izpildi ar JDBC interfeisu jau apskatīju iepriekšējā uzdevumā, kad no PROGRAMMOV izguvu datus, kā arī ievietoju datus un izveidoju tabulu. Tādēļ šajā nodaļā specifiski aprakstīšu Java klases metožu pielietojumu procedūrās, jo tas, manuprāt, ir viena no noderīgākajiem JDBC interfeisa pielietojumiem, jo tas ļauj vienkāršot vaicājumu definēšanu, kas vaicājumiem, kurus datubāzē daudz jāatkārto, ir ļoti noderīgi.

Iepriekšējā praktiskajā darbā izveidoju ļoti daudz līdzīgas tabulas KOMANDA, lai demonstrētu dažādu metožu darbību. Visās šajās tabulās bija ievietotas pabeigto programmu un nepabeigto programmu objektu kolekcijas. No pieredzes atceros to, ka man nepatika izveidot jaunus objektus programmu kolekcijās pēc visas komanda tabulas rindas definēšanas. Izveidošu funkciju, kas padara šādu darbību daudz vienkāršāku, kā arī, protams, ļauj pievienot šos objektus ārpus datubāzes (piemēram, ar lietojumu sqlplus).

No sākuma izveidosim JAVA pirmtekstu:

import java.sql.*; import oracle.jdbc.*;

public class kol_iev {public static void main (String[] args) throws SQLException {

Connection savienz = DriverManager.getConnection("jdbc:default:connection:");

String sql = "INSERT INTO TABLE(select A." + args[1] + " FROM " + args[0] + " A where " + args[2] + ") values (" + args[3] + ")";

try { Statement vaic = savienz.createStatement(); vaic.executeUpdate(sql); System.out.println(sql); vaic.close();} catch (SQLException e) { System.err.println(e.getMessage()); }

}}

17

Page 18: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

Ar loadjava programmu augšupielādēju šo klasi datubāzē.

Tālāk jāizveido pakete un jādefinē procedūru, kuru izpildot notiks arī JAVA klases izpilde. Vajadzēs ievadīt tabulas nosaukumu, kolekcijas nosaukumu, nosacījumu, pēc kura tabulā atlasa pareizo kolekciju un pašu objektu, kuru ievietos kolekcijā.

CREATE OR REPLACE PACKAGE kol ASPROCEDURE iev (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac VARCHAR2, objekts VARCHAR2);END;

Tālāk definēju procedūras darbību, kurā lieku izmantot java klasi.

CREATE OR REPLACE PACKAGE BODY kol ASPROCEDURE iev (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac VARCHAR2, objekts VARCHAR2) AS LANGUAGE JAVANAME 'kol_iev.main(java.lang.String[])';END;

Viena problēma, ko jau novēroju, ir tā, ka cmd neļauj rakstīt burtus ar garumzīmēm, tādēļ komandas nosaukumu Džoniji pārdēvēju uz Dzoniji. Tālāk izpildīju call komandu SQL Developer vidē, lai pārbaudītu tās darbību.

call KOL.IEV('KOMANDA','NEPABEIGTAS_PROGR','KOM_NOSAUKUMS=''Dzoniji''','PROGRAM(''12'',''Divpatsmitais'',''Virus'')')

18

Page 19: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

Iegūtais rezultāts:select * from komanda;

Kā redzams, trešās rindas (kas atbilst komandai Dzoniji) pēdējais objekts ir programma Divpatsmitais. Tālāk ievietošu objektu caur sqlplus vidi.

Izpildot šo komandu sqlplus vidē, programma „uzkaras” un netiek izpildītas nekādas tālākas darbības (nav iespējama nekāda tālāka ievade komandlīnijā). Izraksts:

Tā kā java klase un procedūra ir pēc struktūras līdzīga, kā arī procedūra izpildījās sql developer vidē, nezinu, kāda ir problēma. Sqlplus procesa patērētie resursi arī nenorāda uz nekādu darbību.

Kā redzams, procesora resursi netiek lietoti.

19

Page 20: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

Problēma atrisinājās, kad aizvēru SQL Developer. Pieņemu, ka, tā kā savienojums radās no vienas un tā pašas IP adreses, tika bloķēts šis funkcijas izsaukums no SQL un uzskatīts par kaut kādu SQL developer savienojuma daļu nevis par patstāvīgu izsaukumu.

Izraksts:

Problēma ir tāda, ka, lai gan java fails izpildās (jo notiek sql mainīgā izvade), pati darbība datubāzē nenotiek. Mēģināju dažādos viedos izpildīt procedūru, bet visi bija neveiksmīgi.

20

Page 21: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

Rezultātā neizdevās pievienot objektu Dzoniji pabeigto vai nepabeigto programmu kolekcijai (mēģināju darbību izpildīt ar abām). Vai vismaz tā likās…

Tālāk par to runāšu secinājumos, bet, veicot izvadu caur pašu sqlplus ieguvu šādu rezultātu :

Tātad Džoniji komandai tika reģistrēti visi izsaukumi, jo, kā redzams, ir ļoti daudz Divpatsmitais programmu šajās kolekcijās. Turpretī, pieprasot funkcijas izpildīšanu sql developer radās kļūda.

Pēc iziešanas no SQL plus iegūtais rezultāts:

Tā kā grūti saredzēt izvadu norādīšu divus ierakstus:

Dzoniji komanda ir izgatavojusi ļoti daudz Divpatsmitais vīrusu. Tie ir tikai divi objekti no daudziem. Problēma bija tā, kā datubāze saņem savienojumu, bet par to runāšu tālāk secinājumos.

21

Page 22: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

5. Java klases metožu pielietošana SQL komandu izpildei (datu izvade)

Līdzīgi kā iepriekšējā uzdevumā, strādāšu ar tabulā esošām kolekcijām. Šoreiz veidošu procedūru ar Java klases metodes pielietošanu, bet, atšķirībā no pagājušās reizes, izmantošu metožu pārlādi. Varēs izgūt ne tikai vienu kolekciju, bet arī divas. Arī izmantošu PreparedStatement objektu vaicājuma definēšanai. Pirmkārt, pirmteksts:

import java.sql.*;

import oracle.jdbc.*;import oracle.jdbc.pool.OracleDataSource;

public class kol_izv {public static void main (String[] args) throws SQLException {

Integer n =0;Connection savienz =

DriverManager.getConnection("jdbc:default:connection:");String sql = "Select value(B).Nosaukums FROM TABLE(select A."+

args[1] +" FROM " + args[0] + " A where " + args[2]+"=?) B"; try { PreparedStatement pstmt = savienz.prepareStatement(sql); pstmt.setString(1,args[3]); ResultSet Ieraksti = pstmt.executeQuery(); while(Ieraksti.next()){

String obj = Ieraksti.getString("value(b).Nosaukums");

n = n+1;System.out.println(n + ". "+args[1]+" nosaukums

"+args[3]+" komandai ir " + obj+".");}

if (args.length>4){String sql2 = "Select value(B).Nosaukums FROM

TABLE(select A."+ args[4] +" FROM " + args[0] + " A where " + args[2]+"=?) B";

PreparedStatement pstmt2 = savienz.prepareStatement(sql2);

pstmt2.setString(1,args[3]); ResultSet Ieraksti2 = pstmt2.executeQuery(); n=0; while(Ieraksti2.next()){

String obj = Ieraksti2.getString("value(b).Nosaukums");

n = n+1;System.out.println(n + ". "+args[4]+"

nosaukums "+args[3]+" komandai ir " + obj+".");}

pstmt2.close(); } System.out.println(sql); pstmt.close();} catch (SQLException e) { System.err.println(e.getMessage()); }

}}

22

Page 23: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

Kā redzams kodā, ir atšķirība starp programmas darbību, ja funkcijā definēti četri vai ja funkcijā definēti pieci atribūti. Četri definētie atribūti norāda attiecīgi tabulas nosaukumu, kolekcijas nosaukumu, tabulas rindas identificējošā atribūta nosaukumu un šī atribūta vērtību. Piektais atribūts ir vēl viens kolekcijas nosaukums. Ja tas tiek norādīts, tiek izpildīta arī šīs kolekcijas izvade (kolekcijai jābūt tajā pašā tabulā).

Izmantoju PreparedStatement iespēju norādīt identificējošā atribūta vērtību ar jautājuma zīmi un definēt, kāda vērtība ir ievadīta vaicājuma izpildes laikā. Problēma ir tāda, ka bija nepieciešams izmantot args[] mainīgos vaicājuma tekstā tik un tā, jo šīs jautājuma zīmes nevar saturēt lauku un tabulu vērtības, tikai parastus mainīgos.

Tālāk jāapraksta procedūras šīs programmu klases izmantošanai, kur es izvēlējos vienkārši papildināt jau esošo paketi kol:

create or replacePACKAGE kol ASPROCEDURE iev (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac VARCHAR2, objekts VARCHAR2);PROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2);PROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2, otr_kol_nos VARCHAR2);END;

create or replacePACKAGE BODY kol ASPROCEDURE iev (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac VARCHAR2, objekts VARCHAR2) AS LANGUAGE JAVANAME 'kol_iev.main(java.lang.String[])';PROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2) AS LANGUAGE JAVANAME 'kol_izv.main(java.lang.String[])';PROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2, otr_kol_nos VARCHAR2) AS LANGUAGE JAVANAME 'kol_izv.main(java.lang.String[])';END;

23

Page 24: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

Definēju divas jaunās izv procedūras, kur abām norādīju vienu un to pašu java klasi. Šī pārlāde atļauj izpildīt līdzīgas darbības ar vienu un to pašu procedūras nosaukumu un to izmantošana ir līdzīga pārlādētu metožu lietošanai.

Tagad apskatīsim, vai izveidotais lietojums vispār strādā. Izmantošu sqlplus programmu.

Pirmajā procedūras izsaukumā norādīju 5 atribūtus un izsaucu gan pabeigto, gan nepabeigto programmu izvadi. Otrajā izsaukumā ievadīju 4 atribūtus un izvadīju tikai komandas Dzoniji pabeigtās programmas.

Kā redzams, katrā no izsaukumiem tika izvadītas attiecīgo komandu programmas tā, kā bija paredzēts procedūrā. Tātad java programma strādā tā, kā paredzēts.

24

Page 25: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

6. Metodes definēšana ar JAVA klasi un tās pielietošana

Veidošu jaunu objektu tipu TILPUMS, kurā būs norādītas augstuma, garuma un platuma vērtības, kā arī MEMBER metodi TILP_APR, kas veiks tilpuma aprēķināšanu.

create or replace type TILPUMS as object(AUGSTUMS number,GARUMS number,PLATUMS number,Member function TILP_APR return number);

Tālāk definēšu tilpuma aprēķina funkciju.

create or replacetype body TILPUMS asMEMBER function TILP_APR return number isbeginreturn (java_tilp_apr(SELF.AUGSTUMS, SELF.GARUMS,SELF.PLATUMS));end TILP_APR;end;

Šeit es norādīju uz funkciju java_tilp_apr. Tās izklāsts:

create or replaceFUNCTION java_tilp_apr(AUGSTUMS IN NUMBER,GARUMS IN NUMBER,PLATUMS IN NUMBER) RETURN NUMBER AS LANGUAGE JAVA NAME 'tilp_met.vertiba(java.lang.Integer,java.lang.Integer,java.lang.Integer) returnjava.lang.int';

Šeit norādīta java klases izsaukšana līdzīgi kā iepriekšējos procedūru izveides aprakstos, bet, atšķirībā no tām, jānorāda ir arī tās vērtība tips, kas atgriezīsies pēc metodes izpildes.Java pirmteksts:

import java.sql.*;import oracle.jdbc.*;import java.util.*;import java.io.*;

25

Page 26: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

public class tilp_met{public static int vertiba(Integer arg1,Integer arg2,Integer

arg3) throws SQLException{ return (arg1*arg2*arg3);}}

Šis mazais piemērs veiksmīgi parāda, kā member metodes var sasaistīt ar java klašu metodēm. Tālāk veiksim datu ievadīšanu un izgūšanu:

INSERT INTO TILPUMI VALUES('8','5','4')INSERT INTO TILPUMI VALUES('7','3','3')INSERT INTO TILPUMI VALUES('4','2','9')

select value(T).Platums,value(T).Garums,value(T).augstums,value(T).TILP_APR() FROM TILPUMI T;

8*4*5=160, 9*7=63 un 9*8 =72, tātad aprēķins strādā.

Protams, var veidot daudz sarežģītākus vienādojumus sarežģītākiem objektiem un veikt dažādas darbības ar objekta atribūtiem un JAVA metodēm, gluži kā to var darīt ar parastām MEMBER metodēm. Tā jau kļūst par kodēšanas loģikas problēmu, bet, manuprāt, uzdevuma mērķis ir demonstrēt JAVA metodes izmantošanas pamata principu. Vēl viens interesants jautājums ir, ja darbības var izdarīt ar tām pašām definētajām MEMBER metodēm, priekš kam vispār vajag darboties ar JAVA klašu metodēm. To dara tādēļ, ka, ja es piemēram veidotu vēl vienu metodi citam objektam, kurai vajag tilpuma aprēķinu, es varu šajā objekta member metodē arī vienkārši izsaukt java_tilp_met metodi, kas tālāk darbosies tāpat, kā tā darbojas ar tilpums objekta metodi. Tas ir tādēļ, ka JAVA klasei neinteresē no kurienes tiek ielasīti trīs skaitļu atribūti, tik ilgi kamēr tie ir skaitļi, JAVA klase izpildīs savu algoritmu un atgriezīs skaitli, kuru tālāk saņem objekta member metode, vai arī jebkāda cita metode.Vēl jāatceras tas, ka, protams, definēt no sākuma vajag JAVA klasi, tad metodi, kas izsauc klasi un tad tikai objekta metodi, savādāk būs kompilācijas kļūda.

26

Page 27: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

7. Secinājumi

1) Uzdevumu izpilde izdevās, ja pieņem, ka uzdevumus sapratu pareizi. Šoreiz bija, manuprāt, diezgan slikti definēti uzdevumi, kā arī ļoti daudz atrisinājumu problēmām bija jāmeklē internetā. Pildot darbu radās nojausma, ka varbūt šis ir viens no pirmajiem gadiem, kur liels fokuss praktiskajam darbam bija uz šo tematu, jo daži no lekciju materiāliem likās nedaudz nepilnvērtīgi, bet par to rakstīšu tālākos secinājumos. Pirms tika izmainīts praktiskā darba uzdevumu saraksts, daudzi no uzdevumiem vispār nebija saprotami, bet, pēc to rediģēšanas, izņemot vienu mazu problēmu, kuru apspriedu ar pasniedzēju konsultācijā, uzdevuma noteikumus var saprast. 1. uzdevuma izpilde ir aprakstīta pirmajā nodaļā, otrā otrajā, trešā un ceturtā uzdevuma trešajā nodaļā, piektā uzdevuma izpilde sestajā nodaļā un sestā piektā un ceturtajā nodaļā.

2) Kā darbā iepriekš minēts, sastapos izveides laikā ar daudzām problēmām. Pirmkārt un galvenokārt, dziņa un java lietojuma kļūdas. Es aptuveni patērēju pusi izveides laika ar java un oracle JDBC dziņa (un visu pārējo oracle programmatūru) pareizu uzstādīšanu. Lai gan bija labi norādīt, kur un kā uzstādīt JAVA programmatūru, manuprāt, nebija tik labi norādīts kā rīkoties ar oracle db instalāciju un tās darbam nepieciešamo sistēmas vides mainīgo definēšana. Vēl viena lieta, kuru ieteiktu paziņot, ir – ja nestrādā jdbc izmantojot javac un java komandlīnijas komandas, vienkārši izmantojiet, piemēram, eclipse lietojumu, kur projektam var tieši piedefinēt nepieciešamo metožu bibliotēku vai bibliotēkas. Otrā problēma bija materiālu trūkums. Šos komentārus rakstu otrdienas vakarā (11.19) un man nebija nevienas vietas, kur paskatīties kā sasaistīt java klašu metodes ar objektu member metodēm.

3) Darbā ar JAVA klasēm sastapos ar interesantu savienojuma izveides problēmu. Precīzāk sakot, kad mēģināju atvērt ar sqlplus savienojumu ar datubāzi un tajā izpildīt procedūru, sqlplus programma beidza darbību un „iesala” ( nedeva nekādu atbildi uz izsaukto procedūru un neļāva izpildīt citas komandas). Vēlāk noskaidroju, ka, ja izslēdzu vai aizvēru savienojumu iekš sql developer, varēju izpildīt procedūras caur sqlplus, bet nevarēju redzēt tabulās izsaukto procedūru rezultātu, līdz aizvēru sqlplus savienojumu. Tas norāda, ka nevar (vismaz šajā datubāzē vai ar šo dzini) izveidot divus vai vairāk vienlaicīgus savienojumus un kvalitatīvi izpildīt darbības. Manuprāt, tas ir tādēļ, ka gan viens, gan otrs atvērtais savienojums datubāzē tiek definēts vienādi – ar noteiktu lietotāja vārdu un paroli, kā arī iespējams IP adresi (visi šie atribūti šajā gadījumā bija vienādi abiem savienojumiem).

4) Darbs bija viennozīmīgi visgrūtākais no visiem līdz šim bijušajiem praktiskajiem darbiem. Liela daļa laika tika patērēta uz iepriekš aprakstītajām problēmām ar jdbc dziņa darbības izpildīšanu un pāris neskaidrām metožu struktūru

27

Page 28: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

pareizā definēšanā (izprotot to uzbūvi). Parasti lielāku laika proporciju patērē piemēru kodu rakstīšana un šī dokumenta veidošana, kā apskatāmā datubāzes mehānisma izpēte, bet šajā darbā viennozīmīgi lielākā daļa tika pavadīta meklējot informāciju par mehānismiem.

28

Page 29: 1. Nelielas Java klases programmas definēšana, Web viewPROCEDURE izv (tabulas_nos VARCHAR2, kol_nos VARCHAR2, nosac_atr VARCHAR2, nosac_vert VARCHAR2); PROCEDURE izv ... 8*4*5=160,

8. Lietotā literatūra

Lekciju materiāli no datubāze.wordpress.com.

ORACLE dokumentācija.

Liels daudzums dažādu forumu diskusiju.

29