Adatba ziskezeles Java tutorial
óRela cio s adatba ziskezel˝ k óNoha a Java objektum-elvu, egyel˝ re nem az objektum-elvu adatba ziskezel˝ ket ta mogatja ö Vannak egya ltala n igaza n muk¨ d˝ ilyenek?
Copyright á 2000-2002, Kozsik Tama s
JDBC óValami interfesz, amit a Java programok es az adatba ziskezel˝ k k¨ ze lehet rakni óNe kelljen olyan ko dot ırni, amely egy picit is egy konkret ABkezel˝ rendszert˝ l fígg óEgy muvelethalmaz, amit a Java programozo k haszna lhatnak óFunkcionalita s, amit az adatba ziskezel˝ keszıt˝ jenek meg kell valo sıtania ö JDBC-compliant
óSzerz˝ des-modell
Rela cio s adatba ziskezeles a ttekintes óAz adatok fizikai a bra zola sa mellekes (remelhet˝ leg hatekony) óLogikailag az adatok rela cio kkent jelennek meg óA rela cio k ta bla knak felelnek meg óA rela cio elemei a ta bla sorai óA rela cio tıpusa t az oszlopok hata rozza k meg óA rela cio kon muveletek vegezhet˝ k (pl. join) óKitíntetett projekcio k: kulcsok
óAlapelv: platform-fíggetlenseg, ebbe beletartozik az adatba ziskezel˝ kt˝ l valo fíggetlenseg is óMegolda s: JDBC
JDBC: Java Data Base Connectivity óAdatba ziskezel˝ keszıt˝ je: csina lnia kell egy meghajto -programot (driver), amellyel az adatba ziskezel˝ kielegıti a JDBC specifika cio t óJava programozo : a java.sql es a javax.sql csomagokban tala lhato oszta lyok, interfeszek segıtsegevel dolgozik, es a programhoz csatolja a haszna lt adatba ziskezel˝ JDBCmeghajto programja t
Pelda: bro ker ceg óU gyfelek ta bla Azon. 1 2 3
Ne v John Lennon Jim Morrison Presszer Ga bor
Cım London, Abbey Road 1 LA, Love Street 7 Bp, Mienkitta ter 3
óReszvenyek ta bla Ne v FORTE TVK
Ar 190 120
1 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Adatmanipula cio : SQL óStructured Query Language, IBM óElterjedt, burja nzo , de szabva nyosıtotta k (ISO-ANSI, 1988) óA JDBC az ANSI SQL-2 szabva nyt k¨ veti óLekerdezesek, adatfelvitel, t¨ rles, mo dosıta s adatba zis-adminisztra cio
Pelda k select * from Ugyfelek select Nev from Reszvenyek where Ar < 150 insert into Reszvenyek (Nev, Ar) values ('MOL',111) update Reszvenyek set Ar=121 where Nev='MOL' delete from Reszvenyek where Nev='MOL' create table Tulajdonok (Azonosıto int, Mennyiseg int) drop table Tulajdonok
Mini SQL: mSQL Java tutorial Copyright á 2000-2002, Kozsik Tama s
Haszna lat óIndıtsuk el az adatba zis motort. Ehhez az msql2d programot kell futtatni. relshow A sema nezeget˝ : milyen adatba zisok vannak relshow StockMarket Milyen ta bla k vannak benne relshow StockMarket Customer egy ta bla definıcio ja nak megtekintese msql StockMarket belepes a termina l programba, AB megnyita sa
óNagyon egyszeru adatba ziskezel˝ (Hughes) óNem mindent tud, amit az SQL szerint kene óKis adatba zisokhoz hatekony, kis er˝ forra sigenyu óVan hozza : termina l program, rela cio sema nezeget˝ , C-nyelvi API, JDBC meghajto óKliens/szerver ta mogata sa TCP/IP-n keresztíl
Az msql program óIrjunk be SQL parancsokat óA vegere \g kell, ez za rja le a parancsot (a parancs lehet t¨ bb soros is) óSegıtseg: \h óKilepes: \q óFa jlbo l parancsok: msql StockMarket
2 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Eleres TCP/IP-n keresztíl msql -hostname ge pne v adatbazis msql -h ge pne v adatbazis msql -h localhost StockMarket relshow -h localhost StockMarket Stock
Az adatba zis elerhet˝ a 1112 TCP porton keresztíl (alapertelmezes szerint)
mSQL es Java óAz msql-jdbc-1-0.jar fa jlban van a meghajto program óEzt a jar fa jlt is haszna ljuk a fordıta skor es a futtata skor -classpath msql-jdbc-1-0.jar:. óMi van benne? Egy csomo oszta ly, ami megvalo sıt fontos interfeszeket ö Driver, Connection, Statement, ResultSet, stb. ö Pl. a com.imaginary.sql.msql.MsqlDriver oszta lyt valahogy a JVM tudoma sa ra kell hozni, mondjuk pelda nyosıtani
Adatba ziskezeles Java programbo l óJDBC nelkíl: AB-kezel˝ t˝ l fígg˝ ko d, APIhıva sok JNI-n keresztíl (Java Native Interface) óJDBC-vel: ko d, mely fíggetlen az ABkezel˝ t˝ l. Ba rmikor le lehet cserelni... óAz adatmanipula cio s nyelv tova bbra is az SQL óNem bea gyazott, az SQL parancsok sztringekben vannak ö A fordıto nem ellen˝ rzi, futa s k¨ zben deríl ki minden hiba... :-(
import java.sql.*; class DBTeszt { public static void main(String args[]) throws SQLException { new com.imaginary.sql.msql.MsqlDriver(); Connection c = DriverManager.getConnection ("jdbc:msql://localhost:1112/StockMarket"); Statement s = c.createStatement(); ResultSet rs = s.executeQuery ("select * from Stock"); while( rs.next() ){ System.out.println(rs.getString(1)); } rs.close(); s.close(); c.close(); } }
Az adatba ziskezeles menete óAmikor a JVM bet¨ lti a Driver interfeszt megvalo sıto oszta lyt, akkor az beregisztra lja maga t a DriverManager-nel óA DriverManager-t˝ l kerhetínk egy Connection-t óA Connection-t˝ l egy Statement-et óA Statement-tel vegrehajthatunk egy SQL utasıta st. Lekerdezes eredmenye egy ResultSet óA ResultSet-et beja rhatjuk soronkent
Java tutorial Copyright á 2000-2002, Kozsik Tama s
Ezeket a kekeket mind megvalo sıtja a meghajto prg.
3 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
A JDBC meghajto k óEgy Java program t¨ bb adatba ziskezel˝ t is haszna lhat óMindegyikhez kell a megfelel˝ meghajto prg. óA DriverManager tartja nyilva n a meghajto kat óKiva lasztja a megfelel˝ t: Connection c = DriverManager.getConnection ("jdbc:msql://localhost:1112/StockMarket");
óA programozo dolga csak az, hogy a JVM-mel bet¨ ltesse a Driver-t implementa lo oszta lyt, mert az automatikusan beregisztra lja maga t a DriverManager-nel (egy statikus inicializa torral)
A meghajto bet¨ ltese óPelda ny letrehoza sa new com.imaginary.sql.msql.MsqlDriver();
óforName meto dussal try{ Class.forName ("com.imaginary.sql.msql.MsqlDriver"); } catch (ClassNotFoundException exc){}
ó.class attribÉtummal Class cl = com.imaginary.sql.msql.MsqlDriver.class;
ójdbc.drivers jellemz˝ bea llıta sa Hogy a ko d semmi adatba ziskezel˝ -specifikus reszt ne tartalmazzon...
jdbc.drivers
import java.sql.*; class DBTeszt { public static void main(String args[]) throws SQLException { Connection c = DriverManager.getConnection(args[0]); ... } }
Java tutorial Copyright á 2000-2002, Kozsik Tama s
javac DBTeszt.java java -classpath msql-jdbc-1-0.jar:. -Djdbc.drivers=com.imaginary.sql.msql.MsqlDriver DBTeszt jdbc:msql://localhost:1112/StockMarket
ó T¨ bb meghajto is bet¨ lthet˝ (Windows ; es UNIX : elv.)
Kíl¨ nb¨ z˝ adatba ziskezel˝ k óEgy programban t¨ bb adatba zis is haszna lhato , aka r t¨ bb adatba ziskezel˝ n keresztíl is óAz a tteres egyik adatba ziskezel˝ r˝ l egy ma sikra viszonylag egyszeru óF˝ leg, ha az SQL utasıta sokban megmaradunk a szabva nyos lehet˝ segeknel óNagyon sokfele adatba ziskezel˝ h¨ z keszıtettek ma r JDBC meghajto programot (la sd Java honlap) óVan egy JDBC-ODBC kapcsolo meghajto , amivel minden olyan AB-kezel˝ haszna lhato , amihez van ODBC (Open Data Base Connectivity) interfesz
Connection letrehoza sa str = "jdbc:msql://localhost:1112/StockMarket"; Connection c = DriverManager.getConnection(str); jdbc:alprotokoll:alne v
Pelda ul. jdbc.odbc.Object.StockMarket
óA parameterkent a tadott sztringet vegigkerdezi a regisztra lt meghajto kto l. Az els˝ t, amelyik tud vele mit kezdeni (alprotokoll), megbızza a munka val óKiva laszta si sorrend: el˝ sz¨ r a jdbc.drivers, uta na az explicit bet¨ lt¨ tt oszta lyok
4 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Statement óSQL utasıta sok vegrehajta sa ra Statement s = c.createStatement();
óVannak lekerdezesek es adatmanipula cio k óLekerdezes ResultSet rs = s.executeQuery ("select * from Stock");
Java tutorial Copyright á 2000-2002, Kozsik Tama s
óAdatmanipula cio int sorok = s.executeUpdate ("insert into Stock values ('ABC',90)");
óT¨ bb eredmenyt ado SQL utasıta s vegrehajta sa: boolean vanEredmeny = s.execute("...");
ResultSet
Eredmenysorok feldolgoza sa
óEredmenyta bla, lekerdezes eredmenye
while( rs.next() ){ ... }
óAz aktua lis sorbo l az oszlopok (komponensek) kiszedhet˝ k a getXXX meto dusokkal String getString(int oszlop) int getInt(int oszlop)
óKezdetben a kurzor az els˝ sor ele mutat óAz aktua lis sor komponenseit kiszedhetjík
óAz oszlopok 1-t˝ l sza mozo dnak óLehet az oszlop sza ma helyett a nevet megadni
ResultSet rs = s.executeQuery ("select * from Stock");
óA sorait egyma s uta n feldolgozhatjuk
String s = rs.getString(1));
óEgy Statement-hez egyszerre csak egy ResultSet lehet megnyitva
ResultSet a JDBC 2.0 szerint óAz eredmenyta bla kurzora t el˝ re is lehet mozgatni, lehet benne pozıciona lni óLehet mo dosıtani az eredmenyta bla t, es rajta keresztíl az adatba zist óBe lehet pl. a llıtani, hogy ma s SQL utasıta sok hata sa ne jelenjen meg a feldolgoza s alatt a llo eredmenyta bla ban Statement stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
ö kevesbbe hatekony
óAz oszlopokat balro l jobbra kell vegigolvasni, es csak egyszer
Pozıciona la s es sor mo dosıta sa rs.absolute(5); rs.updateString("Nev", "Janis Joplin"); rs.updateRow(); óSzkrollozhato es mo dosıthato ResultSet óJDBC 2.0 kell hozza óAz updateXXX meto dusok szaba lyai ugyanazok, mint a getXXX meto dusokei
5 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Sor beszÉra sa es t¨ rlese rs.moveToInsertRow(); rs.updateString(1,"Sting"); rs.updateInt(2,35); rs.updateBoolean(3,true); rs.insertRow(); rs.moveToCurrentRow(); rs.deleteRow();
PreparedStatement óHa egy SQL utasıta st t¨ bbsz¨ r is vegre akarunk hajtani óEl˝ fordıtott SQL utasıta s ö Ha a meghajto ta mogatja az el˝ fordıta st
óHatekonyabb, mint t¨ bbsz¨ r egy Statement-et óParameterezhet˝ ö setXXX meto dusok ö A parameter tıpusa nak megfelel˝ setXXX kell
óA Statement lesza rmazottja
Java tıpusok es JDBC tıpusok ógetString, getInt, ... BIT, TINYINT, SHORTINT, INT, LONGINT ójava.math.BigDecimal - NUMERIC ógetASCIIStream - LONGVARCHAR ógetBinaryStream - LONGVARBINARY, getCharacterStream ójava.sql.Blob, java.sql.Clob ójava.sql.Date, Time, Timestamp
Pelda Alkalmazott[] beosztottak = ... PreparedStatement s = c.prepareStatement( "insert into Alkalmazott" + "(Nev, Fizetes, Id) values (?,?,?)" ); for(int i=0; i
Callable Statement Java tutorial Copyright á 2000-2002, Kozsik Tama s
óNem-SQL utasıta sok, pl. ta rolt elja ra sok vegrehajta sa ra óJDBC elja ra shıva si escape-szekvencia {call <procedure-name>[<arg1>,<arg2>, ...]} {?= call <procedure-name>[<arg1>, ...]}
óLehetnek bemeneti es kimeneti parameterei ö E s vegyes... ö A kimenetiek tıpusa t regisztra ni kell vegrehajta s el˝ tt
óA visszaadott eredmenyeeket (pl. ResultSet) el˝ bb kell feldolgozni, mint a kimeneti parametereket óPreparedStatement lesza rmazottja
6 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
CallableStatement s = c.prepareCall ( "{call return_seats[?, ?, ?]}" ); s.setString(1, "MA-723"); s.registerOutParameter (2, java.sql.Types.BOOLEAN); s.registerOutParameter (3, java.sql.Types.INTEGER); s.execute(); // eredmenyek feldolgozasa, ha vannak boolean dohanyzo = s.getBoolean(2); int szabadHelyek = s.getInt(3);
Statement.execute() boolean tabla = s.execute("..."); int sorok = s.getUpdateCount(); while ( tabla || (sorok != -1) ){ if(tabla){ ResultSet rs = s.getResultSet(); // csinalunk rs-sel valamit } else { // csinalunk sorok-kal valamit } tabla = s.getMoreResults(); sorok = s.getUpdateCount(); }
javax.sql - szabva nyos kiterjesztes Java tutorial Copyright á 2000-2002, Kozsik Tama s
óJNDI - logikai nev az adatba zisok eleresehez ö fíggetlenseg az adatba zis nevet˝ l es pontos eleresi Étvonala to l
óAdatba zis-kapcsolatok cache-elese ö a kapcsolat felepıtese nagyon id˝ igenyes
óJTA - Java Transaction API haszna lata ö ketfa zisÉ protokoll tranzakcio kezeleshez
óAdatta bla k kezelese off-line
T¨ bbretegu (multi-tier) alkalmaza sok óKet retegu modell: a felhaszna lo i interfesz az adatba zishoz kapcsolo dik óHa rom retegu modell: k¨ zbeiktatunk egy szerveroldali programot ö a felhaszna lo i felílet a ha lo zaton kapcsolo dik a szerverhez óHTML form (+szervlet), applet, program óHTTP, TCP - UDP, RMI, CORBA
ö a szerver az adatba zis(ok)kal tartja a kapcsolatot ö biztonsa g, megbızhato sa g, rugalmassa g, k¨ nnyebb haszna lat, konfigura lhato sa g
Tranzakcio k óLogikailag ¨ sszetartozo adatba ziskezel˝ utasıta sok egyítese óHajto djon vegre az egesz (vagy semmi) óVeglegesıtes: commit, visszavona s: rollback óKonkurrens adatba ziskezeles eseten problema k: sorbarendezhet˝ seg (serializability) ö Hata sban legyen olyan, mintha valamilyen sorrendbben egyma s uta n hajto dtak volna vegre ö Inkonzisztens adatok elkerílese ö Holtpont-veszely!
7 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Tranzakcio k keszıtese óAlapertelmezett: automatikus nyugta za s ö Minden SQL utasıta s befejez˝ dese uta n nyugta z óVegrehajto dott, es nem ad vissza eredmenyt óAz utasıta st tartalmazo SQL objektmot Éjra vegrehajtjuk óEredmenyta la utolso sora t is feldolgoztuk óAz eredmenyta bla t lezarjuk
óManua lis nyugta za si mo d ö setAutoCommit ö A programozo hıvja meg a commit es rollback meto dusokat
Hibakezeles óSQLException ö ö ö ö
getMessage() SQLstate (X/OPEN SQLstate szabva ny szerint) Hibako d (adatba ziskezel˝ -specifikus ko d) Hivatkoza s a k¨ vetkez˝ hiba ra (kiegeszıtesek)
óSQLWarning ö Automatikusn lekezelik a JDBC meto dusok ö Az SQL-objektumokhoz la ncolva, lista ban ö getWarnings(), clearWarnings()
Tranzakcio izola cio s szintek óA kapcsolathoz rendelhetjík (Connection) ósetTransactionIsolation ö TRANSSACTION_NONE: nincs tranz. kez. ö _READ_UNCOMMITED: olvasa skor mindig az aktua lis erteket la tjuk ö _READ_COMMITED: olvasa skor mindig a leguto bbi veglegesıtett eredmenyt la tjuk ö _REPEATABLE_READ: a tranzakcio a ltal olvasott ertekek megegyeznek a kezdeti ertekkel ö _SERIALIZABLE: a tranzakcio ideje alatt az olvasott ertekeket ma s tranzakcio k nem ırhatja k felíl
DatabaseMetaData óAz adatba zis jellemz˝ i ógetMetaData() óSQL fogalmak adatba zisspecikifus megvalo sıta sai, annak korla tai ö getCatalogSeparator(), getIdentifierQuoteString(), getMaxConnections(), getMaxColumnsInTable()
óAz adatba ziskezel˝ tuda sa ö supportsFullJoins(), supportsResultSetConcurrency() ö JDBC COMPLIANT ósupportsColumnAliasing(), supportsSubqueriesInExists()...
K¨ tegelt (batch) vegrehajta s óGyorsabb adatmanipula cio s/definıcio s utasıta sok int[] sorok; Statement s = c.createStatement(); s.addBatch("insert into Nevek" + "values ('Lennon', 'McCartney')"); s.addBatch("insert into Nevek" + "values ('Sz˝renyi', 'Brody')"); sorok = s.executeBatch();
Java tutorial Copyright á 2000-2002, Kozsik Tama s
8 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com