JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
JDBC adatb´azis-hozz´af´er´es Java-b´ol
1 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
´ Attekint´ es
Bevezet´es Kapcsolat objektumok SQL parancs k¨ uld´es V´alasz feldolgoz´asa Tranzakci´ ok DAO tervez´esi minta
2 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
´ Attekint´ es
Bevezet´es Kapcsolat objektumok SQL parancs k¨ uld´es V´alasz feldolgoz´asa Tranzakci´ ok DAO tervez´esi minta
3 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
´ Attekint´ es
Bevezet´es Kapcsolat objektumok SQL parancs k¨ uld´es V´alasz feldolgoz´asa Tranzakci´ ok DAO tervez´esi minta
4 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
´ Attekint´ es
Bevezet´es Kapcsolat objektumok SQL parancs k¨ uld´es V´alasz feldolgoz´asa Tranzakci´ ok DAO tervez´esi minta
5 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
´ Attekint´ es
Bevezet´es Kapcsolat objektumok SQL parancs k¨ uld´es V´alasz feldolgoz´asa Tranzakci´ ok DAO tervez´esi minta
6 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
´ Attekint´ es
Bevezet´es Kapcsolat objektumok SQL parancs k¨ uld´es V´alasz feldolgoz´asa Tranzakci´ ok DAO tervez´esi minta
7 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
JDBC JDBC API: Java oszt´alyokat ´es interf´eszeket tartalmaz´ o csomagok (java.sql, javax.sql), melyek egy standard API-t biztos´ıtanak adatb´azist haszn´al´o alkalmaz´asok valamint adatb´azis-keretrendszerek fejleszt´es´ere. A JDBC API el˝ onye abban ´all, hogy elvileg b´armilyen adatb´azist el´erhet¨ unk vele b´armilyen platformr´ ol, melyen a Java virtu´alis g´ep fut. Nem kell teh´at minden adatb´azisszerverre k¨ ul¨ on adatb´azis hozz´af´er´esi r´eteget ´ırni, hanem ugyanaz a k´ od m˝ uk¨odni fog b´armely adatb´azisszerverrel (felt´eve, hogy nem haszn´alunk adatb´azis-specifikus SQL kiterjeszt´eseket). JDBC meghajt´ o szolg´altat´ ok, l´asd: http://developers.sun.com/product/jdbc/drivers 8 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
A JDBC alkalmaz´asa
mire haszn´alhat´ o a JDBC: 1
Kapcsolat objektumok lek´er´ese egy adatforr´ast´ ol (data source)
2
Lek´erdez˝ o (select) adat-m´ odos´ıt´ o (insert, update, delete) valamint adatb´azis strukt´ ura m´ odos´ıt´ o parancsokat lehet k¨ uldeni az adatb´azisnak (azaz b´armilyen ´erv´enyes SQL parancsot).
3
A lek´erdez´es eredm´eny´et fel lehet dolgozni
9 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Pl. Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/MyDB"); Connection con = ds.getConnection("myLogin", "myPassword"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); while (rs.next()) { int x = rs.getInt("a"); String s = rs.getString("b"); float f = rs.getFloat("c"); }
10 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Adatb´aziskapcsolat objektumok (Connection) Egy Connection objektum egy adatb´aziskapcsolatnak felel meg. Egy adatb´aziskapcsolat lehet˝ ov´e teszi SQL parancsok h´ıv´as´at, illetve az eredm´enyek kinyer´es´et a kapcsolat-objektumon kereszt¨ ul. Egy alkalmaz´as haszn´alhat egy vagy t¨ obb kapcsolatot egy vagy t¨obb adatb´azishoz. A kapcsolathoz tartoz´ o adatb´azisr´ ol a Connection.getMetaData() met´ odussal kaphatunk inform´aci´ ot. Ez egy DatabaseMetaData objektumot ad vissza, amelyik az adatb´azist´abl´akr´ ol, t´arolt elj´ar´asokr´ ol, a kapcsolat tulajdons´agair´ol szolg´altat inform´aci´ ot. pl. TypeInfo, JDBCMeta, DatabaseInfoServlet (servlet) 11 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Kapcsolat l´etrehoz´asa K´et m´ odon t¨ ort´enhet: 1. DriverManager
2. DataSource
1. DriverManager (r´egebbi) A DriverManager.getConnection() met´ odus´at haszn´aljuk, mely param´eterk´ent egy URL-t kap. A DriverManager oszt´aly tartalmaz egy list´at a regisztr´alt driverekkel. A getConnection() met´ odus h´ıv´asakor megpr´ ob´alja magtal´alni a megfelel˝ o drivert, mely kapcsol´ odni tud az URL-ben megadott adatb´azishoz (sorba kiprob´alja a drivereket, m´ıg egyet tal´al, amely kapcsol´ odik a megfelel˝ o URL seg´ıts´eg´evel) Ezt a manager-szintet el lehet ker¨ ulni k¨ ozvetlen Driver met´odus h´ıv´as´aval. (csak ritk´an haszn´aljuk, pl. ha k´et driver is van, amelyik hozz´a tud kapcsol´ odni egy bizonyos adatb´azishoz ´es explicit szeretn´enk meghat´arozni, hogy melyikkel akarunk kapcsol´odni.) 12 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Pl.: Class.forName("jdbc.odbc.JdbcOdbcDriver"); //bet¨ olti a driver-t a mem´ ori´ aba String url = "jdbc:odbc:myDatabase"; Connection con = DriverManager.getConnection(url, "myUsername", "myPassword"); l´asd: pl. driverManager
13 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
2. DataSource A DataSource interf´esz a DriverManager alternat´ıv´ajak´ent egy kapcsolat l´etrehoz´as´anak az ink´abb aj´anlott m´ odja. El˝ onyei: a DataSource-al l´etrehozott kapcsolatok r´eszt vehetnek ”connection pooling”-ban (kapcsolatobjektum k´eszlet) valamint osztott tranzakci´ okban. a DataSource objektum JNDI-n kereszt¨ ul is lek´erhet˝o, ´es az alkalmaz´ast´ ol f¨ uggetlen¨ ul lehet telep´ıtve ´es l´etrehozva: a JDBC driver tartalmaz egy DataSource implemenet´ aci´ ot, a rendszeradminsztr´ ator regisztr´ alja ezt a JNDI n´evszolg´ altat´ oval, az alkalmaz´ as pedig a JNDI szerveren regisztr´ alt DataSource-ot egyszer˝ uen lek´eri n´ev alapj´ an. (Az alkalmaz´ as teh´ at nem kell driver inform´ aci´ okat hardk´ odoljon, hanem egy logikai nevet haszn´ al a DataSource el´er´es´ehez, ´ıgy a DataSource megv´ altoztathat´ o az alkalmaz´ ask´ od m´ odos´ıt´ asa n´elk¨ ul) 14 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
P´eld´ak:
l´asd: pl. dataSource.DataSourceTableViewer (DataSource k¨ozvetlen l´etrehoz´asa -nem tipikus-), metaData.DatabaseInfoServlet (kapcsolatobjektum-k´eszletet –“pooling”– haszn´al´ o DataSource)
15 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Datasource l´etrehoz´asa ´es regisztr´al´asa A k´ od csak illusztr´al´ask´ent szolg´al, tipikusan az alkalmaz´asszerver konfigur´aci´ os f´ajlj´aban ´all´ıtjuk be. (Ehhez hasonl´ o k´ od az alkalmaz´asszerverben fut le.) VendorDataSource vds = new VendorDataSource(); vds.setServerName("my database server"); vds.setDatabaseName("my database"); Context ctx = new InitialContext(); ctx.bind("jdbc/MyDB", vds); l´asd: pl. jndi.TestDSBind (NEM tipikus be´all´ıt´as), jndi.TestDSLookup 16 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Kapcsol´od´as a DataSource-hoz
Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/MyDB"); Connection con = ds.getConnection("myUsername", "myPassword"); A DataSource interf´esz implement´al´asa h´aromf´ele lehet: 1
Alap DataSource oszt´aly: a driver szolg´altat´ o (vendor) adja
2
DataSource oszt´aly, amelyik ”connection pooling”-ot szolg´altat: alkalmaz´asszerver- vagy driverszolg´altat´ o adja.
3
DataSource oszt´aly, amelyet osztott tranzakci´ okban haszn´alhatunk: az alkalmaz´asszerver szolg´altat´ o adja (pl. EJB kont´ener szolg´altat´o).
17 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Egy alap DataSource-al l´etrehozott kapcsolat-objektum –ak´arcsak a DriverManager-el l´etrehozott– egy fizikai kapcsolat objektumot hoz l´etre ”Connection pooling”-ot implement´al´ o DataSource viszont csak egy PooledConnection objektumot ad vissza, amely nem k¨ ozvetlen¨ ul egy fizikai kapcsolat objektum. L´asd pl.: http://commons.apache.org/dbcp/ (szabadon haszn´alhat´o adatb´aziskapcsolat-k´eszlet implement´aci´ o) Az alkalmaz´as k´ odja ugyan´ ugy haszn´alja fel a kapcsolatobjektumot, f¨ uggetlen¨ ul att´ ol, hogy DataSource-b´ ol vagy DriverManager-b˝ol hozzuk-e l´etre, illetve hogy ”pool”-t haszn´al vagy sem. L´enyeges, hogy az alkalmaz´ask´ od egy finally block-ot kell tartalmazzon, biztos´ıtva ez´altal, hogy a kapcsolat bez´ar´odik akkor is, ha hiba t¨ ort´ent (kiv´etel dob´ odott). Ez m´eg fontosabb k´eszletet (pool) haszn´al´ o kapcsolatok eset´en, hogy az illet˝ o kapcsolatot visszajuttassuk a pool-ba az u ´jb´ol rendelkez´esre ´all´ o kapcsolatok k¨ oz´e. 18 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Pl. try { Connection con = ds.getConnection("user", "secret"); // ...uzleti logika kod } catch { // SQLException-t kezelo kod } finally { if (con != null) con.close(); }
19 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Amint a kapcsolat l´etrej¨ ott, az adatb´azisnak SQL parancsokat k¨ uldhet¨ unk. A JDBC API nem korl´atoz a kiadhat´ o SQL parancsok tekintet´eben: b´armilyen parancs haszn´alhat´ o, amit a JDBC driver elfogad. Azt azonban biztos´ıtanunk kell, hogy az adatb´azis fel tudja dolgozni a parancsokat. Pl. h´ıvhatunk t´arolt elj´ar´asokat egy olyan adatb´azisra, amelyik nem t´amogatja ezeket, de egy kiv´etel fog dob´ odni. A JDBC API h´arom interf´eszt biztos´ıt SQL parancsok k¨ uld´es´ere: 1
Statement
2
PreparedStatement
3
CallableStatement
20 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Statement Statement A kapcsolat objektum createStatement() met´ odus´aval hozhatjuk l´etre. Ezt param´eter n´elk¨ uli SQL parancsok h´ıv´asa haszn´alja Statement stmt = con.createStatement(); //lek´ erdez´ es: SELECT ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); //m´ odos´ ıt´ as: INSERT, UPDATE, DELETE ES DDL (CREATE TABLE, DROP TABLE) int affectedRows = stmt.executeUpdate("UPDATE..."); stmt.execute(...) pl. basic.BasicSample, basic.Join, execute.ExecuteSQL 21 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
PreparedStatement
A kapcsolat objektum preparedStatement() met´odus´aval hozhatjuk l´etre. El˝ oford´ıtott (precompiled) SQL parancsok h´ıv´as´ara haszn´aljuk. El˝ ony¨ ok a Statement-hez k´epest: egy vagy t¨ obb param´etert adhatunk meg neki. hat´ekonyabb, mert le lesz ford´ıtva ´es ez el lesz mentve. T¨obbsz¨ori felhaszn´al´as eset´en ´erdemes teh´at ezt haszn´alni.
22 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Kiterjeszti a Statement interf´eszt, teh´at ¨ or¨ okli ennek met´odusait, viszont saj´at verzi´ okat defini´al az executeQuery, executeUpdate ´es execute met´ odusokra. Mivel a Statement objektumok nem tartalmazz´ak az SQL parancsot, ez´ert param´eterk´ent adjuk meg ezt a fenti met´odusoknak. A PreparedStatement objektumok nem adj´ak ´at param´eterk´ent az SQL parancsokat ezeknek a met´ odusoknak, mivel ezek m´ar tartalmazz´ak az SQL parancs el˝ ore leford´ıtott v´altozat´at. Kiv´etel dob´ odik, ha PreparedStatement objektum eset´en SQL parancsot adunk ´at param´eterk´ent ezeknek az ¨ or¨ ok¨olt met´odusoknak
23 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Miel˝ ott futtatn´ank a PreparedStatement-et, mindegyik param´eternek ´ert´eket kell adjunk: PreparedStatement pstmt = con.preparedStatement( "UPDATE table1 SET name = ? WHERE id = ?"); pstmt.setString(1, "R´ ozsa S´ andor"); pstmt.setLong(2, 1000); ResultSet rs = pstmt.executeQuery();
24 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
CallableStatement
A kapcsolat objektum prepareCall met´ odus´aval hozhatjuk l´etre T´arolt elj´ar´asok h´ıv´as´ara haszn´aljuk.
25 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
K¨otegelt m´odos´ıt´asok (Batch Updates) Egy Statement objektum t¨ obb m´ odos´ıt´ o parancsot egy egys´egk´ent (k¨ otegelve) k¨ uldhet a szervernek. Ez bizonyos esetekben l´enyeges teljes´ıtm´enyn¨ oveked´eshez vezethet. Pl. Statement stmt = con.createStatement(); con.setAutoCommit(false); stmt.addBatch("INSERT INTO employees VALUES (1000, ’M´ ezga G´ eza’)"); stmt.addBatch("INSERT INTO departments VALUES (260, ’M˝ uh´ od’)"); stmt.addBatch("INSERT INTO emp dept VALUES (1000, ’260’)"); int [] updateCounts = stmt.executeBatch(); 26 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Egy k¨ otegen bel¨ ul mindegyik SQL parancs m´ odos´ıt´o kell legyen. Hiba eset´en BatchUpdateException kiv´etel dob´ odik vagy nem dob´ odik kiv´etel ´es tov´abb fut a k¨ oteg, de az updateCounts megfelel˝ o elem´ere Statement.EXECUTE FAILED ´ır´odik. Ez JDBC driver f¨ ugg˝ o. Az eredm´enyt˝ ol f¨ ugg˝ oen commit vagy rollback k¨ ovetkezhet. A JDBC driver nem k¨ otelez˝ o, hogy implement´alja a k¨otegelt m´ odos´ıt´asokat. A DatabaseMetaData supportsBatchUpdates tulajdons´aga alapj´an lek´erdezhetj¨ uk. pl. coffee.CoffeeBatchInsert – k¨ otegelt m´ odos´ıt´asok (besz´ ur´asok)
27 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
ResultSet A ResultSet egy Java objektum, amelyik egy SQL lek´erdez´es eredm´eny´et tartalmazza. A k¨ ul¨ onb¨ oz˝ o mez˝ okh¨ oz egy soron bel¨ ul set ´es get met´odusokkal f´er¨ unk hozz´a ´es a next met´ odussal megy¨ unk a k¨ ovetkez˝o sorra. Pl. Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table"); while (rs.next()) { // az aktualis rekord ertekeinek kinyerese es kiirasa int i = rs.getInt("a"); String s = rs.getString("b"); float f = rs.getFloat("c"); System.out.println("ROW = " + i + " " + s + " " + f); } 28 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Kurzorok A ResultSet objektum tartalmaz egy kurzort, amelyik az aktu´alis sorra mutat. A ResultSet objektum l´etrehoz´asakor a kurzor az els˝o sor el´e van be´all´ıtva, ´es a next met´ odus els˝ o h´ıv´asa be´all´ıtja az els˝o elemre. G¨ ord´ıthet˝ o ResultSet-ek eset´eben t¨ obb met´ odust haszn´alhatunk: previous, first, last, absolute, relative, afterLast, beforeFirst
pl. coffee.ScrollableResultSet 29 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
ResultSet t´ıpusok
TYPE FORWARD ONLY: csak el˝ ore g¨ ord´ıthet˝ o TYPE SCROLL INSENSITIVE: el˝ ore-h´atra g¨ ord´ıthet˝o vagy egy konkr´et poz´ıci´ ora ´all´ıthat´ o TYPE SCROLL SENSITIVE: ezen k´ıv¨ ul ´erz´ekeli az adatv´altoz´asokat, amelyek az´ ota t¨ ort´entek, ami´ ota kinyitottuk a ResultSet-et.
30 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Konkurencia t´ıpusok
CONCUR READ ONLY: nem m´ odos´ıthat´ o, read-only lock-okat haszn´al, teh´at t¨ obb felhaszn´al´ o is hozz´af´erhet az adatokhoz egyid˝oben (read-only lock ak´arh´any lehet ugyanarra az adatra) CONCUR UPDATABLE: a ResultSet m´ odos´ıthat´ o, teh´at a m´odos´ıtott adatokat vissza´ırja az adatb´azisba (write-only lock-okat haszn´al azaz csak egy felhaszn´al´o f´er egyid˝ oben hozz´a az adatokhoz) pl. resultset.ResultSetUpdate
31 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
P´elda k¨ul¨onb¨oz˝o t´ıpus´u ResultSet-ek l´etrehoz´as´ara:
Statement stmt = con.createStatement( ResultSet.TYPE SCROLL SENSITIVE, ResultSet.CONCUR UPDATABLE); ResultSet rs = stmt.executeQuery( "SELECT EMP NO, SALARY FROM EMPLOYEES"); PreparedStatement pstmt = con.preparedStatement( "SELECT EMP NO, SALARY FROM EMPLOYEES WHERE EMP NO = ?", ResultSet.TYPE SCROLL SENSITIVE, ResultSet.CONCUR UPDATABLE); pstmt.setString(1, "1000010"); ResultSet rs = pstmt.executeQuery();
32 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
M´odos´ıt´asok Csak CONCUR UPDATABLE t´ıpus´ u Statement eset´eben haszn´alhat´ok. Pl.1 – M´ odos´ıt´as: rs.absolute(4); rs.updateString(2, "Mell´ ek u. rs.updateFloat(3, 10101.0f); rs.updateRow();
321");
Pl.2 – M´ odos´ıt´as: rs.absolute(4); rs.updateString("ADDRESS", "Mell´ ek u. rs.updateFloat("AMOUNT", 10101.0f); rs.updateRow();
321");
33 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Pl. – T¨ orl´es: rs.first(); rs.deleteRow(); Pl. – Besz´ ur´as: rs.moveToInsertRow(); rs.updateObject(1, myArray); rs.updateInt(2, 3857); rs.updateString(3, "Blabla"); rs.insertRow(); rs.first();
34 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Tranzakci´ok
Egy tranzakci´ o egy vagy t¨ obb parancsb´ ol ´all, amelyek lefutottak ´es vagy mind sikeresen el lett v´egezve (commit) vagy visszag¨ord¨ ultek (roll back). Mikor egy commit vagy rollback h´ıv´ odik az aktu´alis tranzakci´o befejez˝ odik ´es egy u ´j kezd˝ odik. Egy u ´j kapcsolat (Connection) objektum alap´ertelmez´esben ´altal´aban auto-commit m´ odban van, ami azt jelenti, hogy a commit met´odus automatikusan megh´ıv´ odik a parancs lefut´as´at k¨ ovet˝ oen, azaz a tranzakci´ o egyetlenegy SQL parancsb´ ol ´all.
35 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
A kapcsolat objektumok r´eszt vehetnek osztott tranzakci´okban is (t¨ obb adatb´azisszervert magukba foglal´ o tranzakci´ok). Ehhez azonban a kapcsolat objektumot k¨ otelez˝ oen egy DataSource objektumb´ ol kell kinyerj¨ uk, amely u ´gy van implement´alva, hogy egy¨ uttm˝ uk¨ odj¨ on egy alkalmaz´asszerver osztott tranzakci´os infrastrukt´ ur´aj´aval. Ellent´etben a DriverManager-b˝ ol l´etrehozott kapcsolatokkal, az ilyen DataSource ´altal l´etrehozott kapcsolatoknak az auto-commit m´ odja alap´ertelmez´esben ki van kapcsolva. (A DataSource standard implement´aci´ oja viszont ugyanolyan kapcsolatobjektumokat hoz l´etre, mint amilyet a DriverManager oszt´aly.)
36 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Ha a kapcsolat objektum osztott tranzakci´ oban vesz r´eszt, a tranzakci´ o manager hat´arozza meg, hogy a commit ill. rollback met´ odusok mikor lesznek megh´ıvva. Ilyenkor teh´at nem h´ıvhatjuk meg k¨ ozvetlen¨ ul ezeket a met´odusokat valamint nem ´all´ıthatjuk az auto-commit m´ odot, mert keresztbe tesz¨ unk a tranzakci´ o manager-nek.
37 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Tranzakci´os elszigetel´esi szintek Ha egy adatb´azisszerver t´amogatja a tranzakci´ okezel´eseket, m´od van arra, hogy potenci´alis konfliktusokat elker¨ ulj¨ on, melyek abb´ol ad´ odnak, hogy k´et vagy t¨ obb tranzakci´ o fut az adatb´azison egyid˝ oben. A kapcsolat objektumnak be´all´ıthatjuk a tranzakci´os elszigetel´esi szintj´et, ami megadja, hogy az adatb´azisszerver milyen szinten gondoskodjon a potenci´alis konfliktusok megold´as´ar´ol. Pl. mi t¨ ort´enjen akkor, ha egy tranzakci´ o megv´altoztat egy ´ert´eket, ´es egy m´asik olvassa azt miel˝ ott az befejez˝ od¨ ott commit-al vagy rollback-el? Hogy ezt megengedj¨ uk, be´all´ıthatjuk a megfelel˝ o szintet: con.setTransactionIsolation(TRANSACTION READ UNCOMMITTED);
38 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Min´el magasabb az elszigetel´esi szint, ann´al nagyobb hangs´ uly lesz fektetve a konfliktusok elker¨ ul´es´ere, viszont ann´al lass´ ubb lesz a szerver (a megn¨ ovekedett z´arak (locks) kezel´ese valamint a felhaszn´al´ ok cs¨ okkentett p´arhuzamos hozz´af´er´ese miatt). A Connection interf´esz ¨ ot szintet defini´al. A val´ odi szintek sz´ama term´eszetesen adatb´azisszerver-f¨ ugg˝o. A setTransactionIsolation met´ odussal be´all´ıthatjuk a kapcsolat elszigetel´esi szintj´et, ´es ez vonatkozik a kapcsolat tov´abbi szesszi´oira.
39 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Savepoints A Savepoint interf´eszt a JDBC 3.0 API vezette be. Egy SavePoint egy ellen˝ orz˝ opontot jel¨ ol meg egy tranzakci´on bel¨ ul ´es lehet˝ ov´e teszi, hogy egy tranzakci´ o visszag¨ ord¨ ulj¨on addig a pontig ahelyett, hogy a teljes tranzakci´ o visszag¨ ord¨ ulj¨ on. Pl.: Statement stmt = con.createStatement(); int rows = stmt.executeUpdate("INSERT INTO AUTHORS VALUES " + ˝ "(LAST, FIRST, HOME) ’DSIDA’, ’JENO’, ’KOLOZSV´ AR’"); Savepoint save1 = con.setSavepoint("SAVEPOINT 1"); int rows = stmt.executeUpdate("INSERT INTO AUTHORS VALUES " + "(LAST, FIRST, HOME) ’ROMH´ ANYI’, ’J´ OZSEF’, ’BP’"); ... con.rollback(save1); 40 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Egy tranzakci´ ohoz t¨ obb Savepoint-ot rendelhet¨ unk. Ezek automatikusan t¨ orl˝ odnek commit vagy teljes roll back eset´eben. Ha egy bizonyos Savepoint-ig g¨ ord´ıt¨ unk vissza, az ut´ana defini´alt Savepoint-ok t¨ orl˝ odnek. Expliciten is t¨ or¨ olhet¨ unk Savepoint-ot: con.releaseSavepoint(save1); Ha egy automatikusan vagy expliciten t¨ or¨ olt Savepoint-ra hivatkozunk, SQLException kiv´etel dob´ odik.
41 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
DAO (Data Access Object)
sz´etv´alasztja: az adatok feldolgoz´as´at (¨ uzleti logika) az adat t´arol´asi logik´at´ ol el˝ onyei: rugalmasabb alkalmaz´as (adatb´azisszerver v. adatb´azis-kezel˝o keretrendszer megv´altoztat´asa egyszer˝ ubb) ´atl´athat´ o (k¨ onnyebben karbantarthat´ o) k´ od
42 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
DAO
haszn´alata: DAO interf´esz – az u ¨zleti logika k´ od sz´am´ara aj´anlott ennek a met´ odusait h´ıvni interf´esz implement´al´asa – tipikusan egy adatb´azist´abl´aval f¨ ugg ¨ossze pl. u ´j bejegyz´es besz´ ur´asa, ¨ osszes bejegyz´es lek´er´ese, keres´esi m˝ uveletek, stb. (egy´ uttal a kapcsolat nyit´asa/z´ar´asa) r´eszletesebb le´ır´as, pl.: http://java.sun.com/blueprints/corej2eepatterns/Patterns/ DataAccessObject.html
43 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
¨ Osszefoglal´ as Ami JDBC-vel kapcsolatban web-alkalmaz´as eset´en k¨ ul¨on¨osen fontos: mivel egy web-alkalmaz´as eset´en egyid˝ oben nagyon sok AB-m˝ uvelet elv´egz´es´et is ig´enyl˝ o k´er´es ´erkezhet lehet˝ oleg kapcsolatobjektum-k´eszletben (connection pool) r´eszt vev˝ o kapcsolatobjektumot haszn´ aljunk amikor ´epp nincs sz¨ uks´eg a kapcsolatobjektumra, z´ arjuk azt, szabadd´ a t´eve a t¨ obbi k´er´es sz´ am´ ara (minden egyes AB-m˝ uvelet vagy t¨ obb, o ¨sszef¨ ugg˝ o m˝ uvelet v´egrehajt´ as´ at k¨ ovet˝ oen) a kapcsolat z´ ar´ as´ at (k´eszletbe val´ o visszajuttat´ as´ at) helyezz¨ uk finally blokkba
komplex web-alkalmaz´as eset´en aj´anlott az adathozz´af´er´esi logik´at k¨ ul¨ onv´alasztani az adatok feldolgoz´as´at v´egz˝ ou ¨zleti logik´at´ol (l´asd. DAO tervez´esi minta)
44 / 45
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
DAO tervez´ esi minta
Java ´alland´os´agi keretrendszerek (persistence frameworks)
objektumrel´aci´ os lek´epez´es - ORM (Object-relational mapping) objektumorient´alt alkalmaz´as ↔ rel´aci´ os adatb´azis N´eh´any ny´ılt forr´ask´ od´ u keretrendszer: Hibernate MyBatis (kor´abban iBATIS) Torque (Apache DB projekt) Oracle TopLink stb. . . .
45 / 45