B I T M A N B I v: T 2014.02.15 M A N

Hasonló dokumentumok
B I T M A N B I v: T M A N

Adatbázis Rendszerek II. 7. Oracle JDBC

Adatbázisok webalkalmazásokban

abkezel.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class abkezel extends JFrame {

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

Szálkezelés. Melyik az a hívás, amelynek megtörténtekor már biztosak lehetünk a deadlock kialakulásában?


Java Database Connectivity (JDBC)

JDBC Adatbáziskapcsolat objektumok SQL parancsok küldése Kötegelt módosítások ResultSet Tranzakciók

Témák. JDBC Adatbázisok JDBC használatának lépései Tranzakciók Adatbázis tervezés EK diagram

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben

Java Programozás 10. Ea: JDBC. SQLite alapokon

B IT MAN 43/1 B IT MAN. Adatbázis Rendszerek II. Ellenőrző kérdések JDBC. v:

Programozási technológia

Adatbázis használat I. 5. gyakorlat

8. Gyakorlat SQL. DDL (Data Definition Language) adatdefiníciós nyelv utasításai:

Database Systems II. ZH összefoglaló

Kapcsolat objektumok. Válasz feldolgozása Tranzakciók DAO tervezési minta

B I T M A N B I v: T M A N

JDBC. A JDBC alkalmazása

JDBC Adatbáziskapcsolat objektumok SQL parancsok küldése Kötegelt módosítások ResultSet Tranzakciók DAO tervezési minta 1 / 45

SZAKDOLGOZAT. Szabó Attila

Kliens oldali SQL-API

SZÁMÍTÓGÉPES ADATBÁZIS-KEZELÉS. A MySQL adatbáziskezelő PHP folytatás JDBC, ODBC

A WEB programozása - JSP1 dr.gál Tibor őszi félév

A Java nyelv. VI. Adatbázis-kezelés Javaban, Példaprogram Az elôzô részben láthattuk, hogy a Java ideális programozási nyelv perszisztens objektumok

Adatbázisok* tulajdonságai

IBM WebSphere Adapters 7. változat 5. alváltozat. IBM WebSphere Adapter for Oracle E-Business Suite felhasználói kézikönyv 7. változat 5.

MySQL kontra MongoDB programozás. SQL és NoSQL megközelítés egy konkrét példán keresztül

Java és web programozás

JavaServer Pages (JSP) (folytatás)

Tranzakciókezelés PL/SQL-ben

SZAKDOLGOZAT. Vígh Gábor DEBRECEN 2009.

Adatbázis használata PHP-ből

Adatba ziskezeles. Java tutorial JDBC. JDBC: Java Data Base Connectivity. Pelda: bro ker ceg. Rela cio s adatba ziskezeles - attekintes

JDBC - adatbáziskezelés

Adatbázis-kezelés. Harmadik előadás

Java programozási nyelv 11. rész Adatbázis-programozás

Debreceni Egyetem Informatikai Kar TANULÓI NYILVÁNTARTÓ SZOFTVER FIREBIRD ADATBÁZIS ALKALMAZÁSÁVAL

Java és web programozás

Adatbázis-kezelés ODBC driverrel

Adattípusok. Max. 2GByte

Adattípusok. Max. 2GByte

OO PDO. Tehát PDO használatával, könnyen átállhatunk egy másik adatbáziskezelőre, anélkül hogy a kódot teljes egészében újraírnánk.

B IT MAN 65/1. Adatbázis Rendszerek II. Ellenőrző kérdések APLSQL B IT MAN. v:

Adatbázis Rendszerek II. 1. SQL programozási felületek 39/1B IT MAN

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

SZÁMÍTÓGÉPES ADATBÁZIS-KEZELÉS. A MySQL adatbáziskezelő A PHP programozási nyelv JDBC, ODBC

Beszerzési logisztika támogatása az optimális beszállító kiválasztása révén

Adatbázis-kezelés, információs-rendszerek

Java Programozás 10. Ea: JDBC. SQLite alapokon

Adatbázis Rendszerek II. 8. Gyakorló környezet

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

Kilencedik témakör: Lazarus-Firebird. Készítette: Dr. Kotsis Domokos

Haladó DBMS ismeretek 1

Együttes hozzárendelés

INFORMATIKAI ALAPISMERETEK

JAVA PROGRAMOZÁS 8.ELŐADÁS

Adatbázis rendszerek II. Adatbázis elérése C# kliens programból ADO.NET API-n keresztül

BEVEZETÉS Az objektum fogalma

Programozás és adatbázis kezelés PHP ben

Adatbázis rendszerek SQL nyomkövetés

PL/SQL (folytatás) Kurzorok, függvények, eljárások

Bánsághi Anna

Csomag. Adatbázis-objektum Programozási eszközök gyűjteménye Két részből áll. specifikáció törzs (opcionális)

Tranzakciók az SQL-ben

Tábla létrehozása: CREATE TABLE alma( ID INT( 3 ) NOT NULL PRIMARY KEY, Leiras VARCHAR( 100 ) );

SQL- Utasítások csoportosítása Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány)

5. téma XML DB. Az adatkezelés és XML kapcsolata. Miért fontos az XML használata az adatbázis kezelésben?

Objektumorientált programozás C# nyelven

Adatbázisok biztonsága

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

Adatbázis Rendszerek II. 2. Ea: Gyakorló környezet

Adatbázisok I A relációs algebra

Egységes és objektumközpontú adatbázis-kezelés (2. rész)

SQL ALAPOK. Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének alapjai

Bevezetés: az SQL-be

Objektumorientált programozás C# nyelven III.

Adatbázis Rendszerek II. 2. Gyakorló környezet

Táblakezelés: Open SQL Internal table. Tarcsi Ádám: Az SAP programozása 1.

Adatbázisok-1 előadás Előadó: dr. Hajas Csilla

INFORMATIKAI ALAPISMERETEK

Előszó. Bevezetés. Java objektumok leképzése relációs adatbázisokra OJB-vel Viczián István Viczián István

II. év. Adatbázisok és számítógépek programozása

INFORMATIKAI ALAPISMERETEK

Adatbázis kezelés Delphiben. SQL lekérdezések

MDAC - Microsoft Data Access Components

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

Access adatbázis elérése OLE DB-n keresztül

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2( Adatbázisrendszerek 2) 3. Előadás: Tárolt eljárások (folytatás) Nézetek

GS1 Logger for Staff. Felhasználói kézikönyv. Verzió 2.3, GS1 Logger Staff Felhasználói kézikönyv

Tartalomjegyzék. Tartalomjegyzék 1. Az SQL nyelv 1 Az SQL DDL alapjai 2

Adatbázisok I. Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER

Adatbázisok II. Jánosi-Rancz Katalin Tünde 327A 1-1

S z á m í t ó g é p e s a l a p i s m e r e t e k

A relációs adatbáziskezelés szabványos nyelve Két fő csoportba sorolhatók az utasításai

Relációs algebra áttekintés és egy táblára vonatkozó lekérdezések

INFORMATIKAI ALAPISMERETEK

Átírás:

Adatbázis Rendszerek II. 7. Ea: MySQL JDBC B I v: T 2014.02.15 M A N 1/87

Témakörök JAVA «-» adatbázis-kezelés JDBC alapok Statement PreparedStatement CallabeStatement Tranzakció kezelés 2/87

A cél: Jávás kliensről manipulálni az adatbázist. 3/87

A probléma és megoldása A Java objektum-orientált, az adatbázisok többnyire még nem azok. Az adatbázis eléréséhez szükséges egy interfész, ennek kezelése lehet adatbázis függő API-hívások JNI-n keresztül (Java Native Interface), de lehet adatbázis független is JDBC (Java Data Base Connectivity). Adatmanipulációs nyelv mindkét esetben az SQL marad. 4/87

JDBC API Java nyelven íródott osztályokat és interfészeket tartalmazó csomagok, melyek egy standard API-t biztosítanak adatbázis-keretrendszerek, valamint adatbázis alapú alkalmazások fejlesztésére. A JDBC API előnye abban áll, hogy elvileg bármilyen adatforrást elérhetünk vele bármilyen platformon, melyen a java virtuális gép futtatható. Nem kell tehát minden adatbázisszerverre külön programot írni, hanem ugyanaz a kód működni fog bármely adatbázisszerverrel. 5/87

JDBC használat Adatbázis feltétel: szükséges egy meghajtó-program (driver), amellyel az adatbázis-kezelő kielégíti a JDBC specifikációt. A driver rendszerfüggő, az adatbázis gyártójának weblapjáról kell letölteni. Java programozó: a java.sql és a javax.sql csomagokban található osztályok, metódusok segítségével dolgozik, és a programhoz csatolja a használt adatbázis-kezelő JDBC driver-ét. 6/87

A megoldás (1.) Kétrétegű megoldás Kliens-oldal Szerver-oldal SQL Driver Piros, Kék, Zöld 7/87

A megoldás (2.) Háromrétegű megoldás Kliens-oldal Szerver-oldal Alkalmazás DB SQL Driver Piros, Kék, Zöld 8/87

Témakörök JAVA «-» adatbázis-kezelés JDBC alapok Statement PreparedStatement CallabeStatement Tranzakció kezelés 9/87

A JDBC programozás lépései (1) 1. Regisztráljuk a Driver-t a DriverManager-ben. 2. Létrehozunk egy adatbázis kapcsolatot: a DriverManager-től kérünk egy Connection-t 3. Tranzakció kezdete 4. A Connection-ben létrehozunk egy Statement-et (beállítjuk a kapcsolatot egy SQL parancs kiadására) 5. A Statement-hez hozzákapcsolunk egy SQL parancsot 6. Ha szükséges, megadjuk az SQL parancs paramétereit 7. Végrehajtjuk a Statement-et 8. Feldolgozzuk az eredményhalmazt (ResultSet) 9. Tranzakció vége 10. Felszabadítjuk az erőforrásokat 10/87

JDBC alapok 11/87

DriverManager Feladatai: Kezeli a különböző adatbázisok elérését szolgáló driver-eket, Kezeli a connection-t (kapcsolatot), Kezeli a statement-eket (SQL kifejezéseket), Kezeli a resultset-eket (cursorokat). 12/87

A JDBC programozás lépései (4) 1. Regisztráljuk a Driver-t a DriverManager-ben. 2. Létrehozunk egy adatbázis kapcsolatot: a DriverManager-től kérünk egy Connection-t 3. Tranzakció kezdete 4. A Connection-ben létrehozunk egy Statement-et (beállítjuk a kapcsolatot egy SQL parancs kiadására) 5. A Statement-hez hozzákapcsolunk egy SQL parancsot 6. Ha szükséges, megadjuk az SQL parancs paramétereit 7. Végrehajtjuk a Statement-et 8. Feldolgozzuk az eredményhalmazt 9. Tranzakció vége 10. Felszabadítjuk az erőforrásokat 13/87

A Driver (meghajtó) betöltése (1) Feltétel: a Java keresési útvonalán elérhető legyen a fizikai driver. MySQL-hez: mysql-connector-java-5.1.24-bin.jar Megteremtése: bemásolni a drivert a Java keresési útvonalában szereplő könyvtárba, és telepíteni: set classpath=.; mysql-connector-java-5.1.24-bin.jar 14/87

A Driver (meghajtó) betöltése (1) Ha a driver elérhető a keresési útvonalon, regisztrálható Javaban: import java.sql.*; public void Reg(){ } try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) { System.out.println("Hibás driver regisztráció!"+e.getmessage());} 15/87

A Driver (meghajtó) betöltése (2) Grafikus felületen: import java.sql.*; import java.awt.*; import javax.swing.*; public void Reg(){ } try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException ex) {JOptionPane.showMessageDialog(null,"Hibás driver regisztráció!", "BitMan mondja: ",2);} 16/87

A DriverManager működése A DriverManager osztály tartalmaz egy listát a regisztrált driverekkel. A getconnection() metódus hívásakor megpróbálja megtalálni a megfelelő drivert, mely kapcsolódni tud az URL-ben megadott adatbázishoz (sorba kipróbálja a drivereket, míg egyet talál, amely kapcsolódik a megfelelő URL segítségével) Ezt a manager-szintet el lehet kerülni direkt Driver metódus hívásával. (csak ritkán használjuk, pl. ha két driver is van, amelyik hozzá tud kapcsolódni egy bizonyos adatbázishoz és explicit szeretnénk meghatározni, hogy melyikkel akarunk kapcsolódni.) 17/87

A JDBC programozás lépései (4) 1. Regisztráljuk a Driver-t a DriverManager-ben. 2. Létrehozunk egy adatbázis kapcsolatot: a DriverManager-től kérünk egy Connection-t 3. Tranzakció kezdete 4. A Connection-ben létrehozunk egy Statement-et (beállítjuk a kapcsolatot egy SQL parancs kiadására) 5. A Statement-hez hozzákapcsolunk egy SQL parancsot 6. Ha szükséges, megadjuk az SQL parancs paramétereit 7. Végrehajtjuk a Statement-et 8. Feldolgozzuk az eredményhalmazt 9. Tranzakció vége 10. Felszabadítjuk az erőforrásokat 18/87

Kapcsolat létrehozása public Connection Kapcs(String host,string dbname, String uname, String pword){ } Connection conn = null; try { String url = "jdbc:mysql:// +host+":3306/"+dbname; conn = DriverManager.getConnection(url,uname,pword); //conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/bolt","root", "root"); } catch (SQLException ex) { System.out.println("SQL Hiba: "+e.getmessage()); conn = null; } return conn; 19/87

A kapcsolat lezárása public void Lekapcs(){ try {conn.close();} catch(exception e) { System.out.println("SQL Hiba: "+e.getmessage());} } 20/87

Munka az adatbázisban (1) Amint a kapcsolat létrejött, az adatbázisnak SQL parancsokat küldhetünk. A JDBC API nem korlátoz a kiadható SQL parancsok tekintetében: azaz adatbázis-specifikus vagy akár nem SQL parancsokat is használhatunk. Azt azonban biztosítanunk kell, hogy az adatbázis fel tudja dolgozni a parancsokat. Pl. hívhatunk tárolt eljárásokat egy olyan adatbázisra, amelyik nem támogatja ezeket, de egy kivétel fog dobódni. 21/87

Munka az adatbázisban (2) A JDBC API három interfészt biztosít SQL parancsok küldésére: 1. Statement paraméter nélküli SQL parancsok hívására 2. PreparedStatement paraméteres (?), előfordított SQL parancsok hívására 3. CallableStatement Tárolt eljárások hívására 22/87

Munka az adatbázisban (3) Végrehajtási módok: 1. executeupdate(): Adatmanipulációs (INSERT, UPDATE, DELETE) és adatdefiníciós (CREATE/DROP TABLE) utasítások futtatására 2. executequery(): Eredménytáblát visszaadó utasítások futtatására (SELECT) 3. execute(): Mindkét típus végrehajtására alkalmas 23/87

Munka az adatbázisban (4) SQL Statement Végrehajtó parancs Visszatérő érték típusa Magyarázat Select executequery(sqlp); ResultSet Insert Update Delete Create Drop Alter Tárolt eljárások 24/87 executeupdate(sqlp); execute(sqlp); Int boolean Adatbázis adatok Az érintett sorok száma, vagy 0. Igaz, ha az első visszatérő adat ResultSet.

A JDBC programozás lépései (4) 1. Regisztráljuk a Driver-t a DriverManager-ben. 2. Létrehozunk egy adatbázis kapcsolatot: a DriverManager-től kérünk egy Connection-t 3. Tranzakció kezdete 4. A Connection-ben létrehozunk egy Statement-et (beállítjuk a kapcsolatot egy SQL parancs kiadására) 5. A Statement-hez hozzákapcsolunk egy SQL parancsot 6. Ha szükséges, megadjuk az SQL parancs paramétereit 7. Végrehajtjuk a Statement-et 8. Feldolgozzuk az eredményhalmazt 9. Tranzakció vége 10. Felszabadítjuk az erőforrásokat 25/87

Erőforrások felszabadítása ResultSet lezárása: rs.close(); Statement lezárása: stmt.close(); PreparedStatement lezárása: pstmt.close(); CallableStatement lezárása: cstmt.close(); Kapcsolat lezárása: conn.close(); 26/87

Bolt adatbázis alapprogram (1) 27/87

Bolt adatbázis alapprogram (2) 28/87

Témakörök JAVA «-» adatbázis-kezelés JDBC alapok Statement PreparedStatement CallabeStatement Tranzakció kezelés 29/87

Statement A kapcsolat objektum createstatement() metódusával jön létre, és az executeupdate() vagy az executequery() paranccsal hajtható végre. Statement stmt = con.createstatement(); Írás jellegű műveletekre: DML (INSERT, UPDATE, DELETE) és DDL (CREATE, ALTER, DROP TABLE) int SorDb = stmt.executeupdate("update..."); Olvasásra: Select ResultSet rs = stmt.executequery("select a, b, c FROM Table1"); 30/87

A JDBC programozás lépései (2) 1. Regisztráljuk a Driver-t a DriverManager-ben. 2. Létrehozunk egy adatbázis kapcsolatot: a DriverManager-től kérünk egy Connection-t 3. Tranzakció kezdete 4. A Connection-ben létrehozunk egy Statement-et (beállítjuk a kapcsolatot egy SQL parancs kiadására) 5. A Statement-hez hozzákapcsolunk egy SQL parancsot 6. Ha szükséges, megadjuk az SQL parancs paramétereit 7. Végrehajtjuk a Statement-et 8. Feldolgozzuk az eredményhalmazt 9. Tranzakció vége 10. Felszabadítjuk az erőforrásokat 31/87

Statement használata (1) 32/87

Kissé életszerűbben 33/87

A JDBC programozás lépései (3) 1. Regisztráljuk a Driver-t a DriverManager-ben. 2. Létrehozunk egy adatbázis kapcsolatot: a DriverManager-től kérünk egy Connection-t 3. Tranzakció kezdete 4. A Connection-ben létrehozunk egy Statement-et (beállítjuk a kapcsolatot egy SQL parancs kiadására) 5. A Statement-hez hozzákapcsolunk egy SQL parancsot 6. Ha szükséges, megadjuk az SQL parancs paramétereit 7. Végrehajtjuk a Statement-et 8. Feldolgozzuk az eredményhalmazt 9. Tranzakció vége 10. Felszabadítjuk az erőforrásokat 34/87

ResultSet használata (1) 35/87

ResultSet használata (2) 36/87

Módosítható (updateable) ResultSet (1) Statement s = conn.createstatement(resultset.type_forward_only, ResultSet.CONCUR_UPDATABLE); String sqlp = "select kód, ár from termék where ár > 3000"; ResultSet rs = s.executequery(sqlp); while (rs.next()) { } int x = rs.getint( ár ); rs.updateint( ár, (int)(x*(0.9))); rs.updaterow(); 37/87

Módosítható (updateable) ResultSet (2) ResultSet.TYPE_FORWARD_ONLY A ResultSet bejárása csak a legelső rekordtól, egyesével növekedve lehetséges (sor1, sor2, sor3 ) ResultSet.TYPE_SCROLL_INSENSITIVE ResultSet.TYPE_SCROLL_SENSITIVE ResultSet.CONCUR_UPDATABLE Olvasható és módosítható a ResultSet. ResultSet.CONCUR_READ_ONLY 38/87

Témakörök JAVA «-» adatbázis-kezelés JDBC alapok Statement PreparedStatement CallabeStatement Tranzakció kezelés 39/87

PreparedStatement (1) Akkor használjuk, ha egy SQL utasítást többször is végre akarunk hajtani. Előfordított SQL utasítás Ha a meghajtó támogatja az előfordítást Hatékonyabb, mint többször egy Statement-et kiadni Paraméterezhető (csak IN típusú paraméterek!) setxxx metódusok A paraméter típusának megfelelő setxxx kell! A Statement leszármazottja 40/87

PreparedStatement (2) A kapcsolat objektum preparestatement() metódusával jön létre, és az executeupdate() vagy az executequery() paranccsal hajtható végre. PreparedStatement pstmt = con.preparestatement( "UPDATE table1 SET name =? WHERE id =?"); pstmt.setstring(1, "Joe"); pstmt.setlong(2, 24357); int SorDb = pstmt.executeupdate(); PreparedStatement pstmt = con.preparestatement( " SELECT a, b, c FROM Table1 WHERE id =?"); pstmt.setint(1, 4357); ResultSet rs = pstmt.executequery(); 41/87

A JDBC programozás lépései (5) 1. Regisztráljuk a Driver-t a DriverManager-ben. 2. Létrehozunk egy adatbázis kapcsolatot: a DriverManager-től kérünk egy Connection-t 3. Tranzakció kezdete 4. A Connection-ben létrehozunk egy PreparedStatementet (beállítjuk a kapcsolatot egy SQL parancs kiadására) 5. A PStatement-hez hozzákapcsolunk egy SQL parancsot 6. Ha szükséges, megadjuk az SQL parancs paramétereit 7. Végrehajtjuk a PreparedStatement-et 8. Feldolgozzuk az eredményhalmazt 9. Tranzakció vége 10. Felszabadítjuk az erőforrásokat 42/87

PreparedStatement (3) Alkalmazott[ ] beo =... PreparedStatement ps = conn.preparestatement( "insert into Alkalmazott" + "(Név, Fizetés, Szülidő) values (?,?,?)" ); for(int i=0; i<beo.length; i++){ ps.setstring(1, beo[i].getnév()); ps.setint(2, beo[i].getfizetés()); ps.setdate(3, date.valueof(beo[i].getszülidő())); ps.executeupdate(); } ps.close(); "1988.07.16" 43/87

Bolt Termékek 44/87

PreparedStatement (4) 45/87

Bolt Termékek (áremelés után) 46/87

A JDBC programozás lépései (6) 1. Regisztráljuk a Driver-t a DriverManager-ben. 2. Létrehozunk egy adatbázis kapcsolatot: a DriverManager-től kérünk egy Connection-t 3. Tranzakció kezdete 4. A Connection-ben létrehozunk egy PreparedStatementet (beállítjuk a kapcsolatot egy SQL parancs kiadására) 5. A PStatement-hez hozzákapcsolunk egy SQL parancsot 6. Ha szükséges, megadjuk az SQL parancs paramétereit 7. Végrehajtjuk a PreparedStatement-et 8. Feldolgozzuk az eredményhalmazt 9. Tranzakció vége 10. Felszabadítjuk az erőforrásokat 47/87

PreparedStatement (5) PreparedStatement ps = c.preparestatement ( "select title, year_made from movies where year_made >=? and year_made <?"); for (int ev = 1920; ev < 2000; ev += 10){ } 48/87 System.out.println("=Filmek a "+ev+"-s évekből"); ps.setint(1, ev); ps.setint(2, ev+10); ResultSet rs = ps.executequery(); while(rs.next()){ } cim = rs.getstring(1); evs = rs.getint(2); System.out.println(cim+" - "+evs);

Témakörök JAVA «-» adatbázis-kezelés JDBC alapok Statement PreparedStatement CallabeStatement Tranzakció kezelés 49/87

CallableStatement (1) Nem-SQL utasítások, pl. tárolt eljárások végrehajtására JDBC eljáráshívási módszer { call eljárásnév [<par1>,<par2>,...] } {?= call függvénynév [<par1>,<par2>...] } Lehetnek bemeneti és kimeneti paraméterei A kimenetiek típusát regisztrálni kell végrehajtás előtt A visszaadott eredményeket (pl. ResultSet) előbb kell feldolgozni, mint a kimeneti paramétereket A PreparedStatement leszármazottja 50/87

CallableStatement A kapcsolat objektum preparecall() metódusával jön létre, és az execute() paranccsal hajtható végre. CallableStatement cs = con.preparecall("{call EljNév(?,?)}"); cs.setint(1, kod); cs.setstring(2, feltetel); cs.execute(); CallableStatement cs = con.preparecall("{? = call FgvNév(?)})"; cs.registeroutparameter(1, java.sql.types.integer); cs.setstring(2, feltetel); cs.execute(); out = cs.getint(1); 51/87

A JDBC programozás lépései (7) 1. Regisztráljuk a Driver-t a DriverManager-ben. 2. Létrehozunk egy adatbázis kapcsolatot: a DriverManager-től kérünk egy Connection-t 3. Tranzakció kezdete 4. A Connection-ben létrehozunk egy CallableStatement-et (beállítjuk a kapcsolatot egy SQL parancs kiadására) 5. A CStatement-hez hozzákapcsolunk egy SQL parancsot 6. Ha szükséges, megadjuk az SQL parancs paramétereit 7. Végrehajtjuk a CallableStatement-et 8. Feldolgozzuk az eredményhalmazt 9. Tranzakció vége 10. Felszabadítjuk az erőforrásokat 52/87

Bolt Tárolt eljárás KatNevMod nevű tárolt eljárás, mely módosítja egy paraméterként megadott kódú kategória nevét. DELIMITER // CREATE PROCEDURE KatNevMod (in kk char(3), in kn varchar(20)) BEGIN Update Kategória set Név= kn where kkód= kk; END; // DELIMITER ; CALL KatNevMod( k01, Élelmiszer ); 53/87

KatNevMod tárolt eljárás létrehozása 54/87

CallableStatement (2) KatNevMod hívása 55/87

CallableStatement (2) KatNevMod hívása 56/87

Bolt Tárolt függvény Bevetel nevű tárolt függvény, mely megadott nap bevételét adja vissza. DELIMITER // CREATE FUNCTION Bevetel (ip varchar(15)) returns int BEGIN DECLARE bev int default 0; set ip = Concat(ip, % ); select sum(ár*darab) into bev from Termék T inner join Vásárlás V ON T.Tkód=V.Tkód where időpont like ip; RETURN bev; END; // DELIMITER ; SELECT Bevetel( 2013-03-21 ); 57/87

Bevetel tárolt függvény létrehozása 58/87

CallableStatement (3) Bevetel hívása 59/87

CallableStatement (4) CallableStatement cs = conn.preparecall ( "{ call szabad_helyek(?,?,? ) }" ); IN paraméter cs.setstring(1, "MA-723"); cs.registeroutparameter(2, java.sql.types.boolean); cs.registeroutparameter(3, java.sql.types.integer); cs.execute(); // eredmények feldolgozása, ha vannak boolean dohányzó = cs.getboolean(2); int szabadhelyek = cs.getint(3); OUT paraméter OUT paraméter OUT paraméterek 60/87

CallableStatement (5) CallableStatement cs = conn.preparecall( "{call updateprices(?,?)}"); cs.setstring(1, "Colombian"); cs.setfloat(2, 8.49f); cs.addbatch(); cs.setstring(1, "Italian"); cs.setfloat(2, 9.49f); cs.addbatch();... IN paraméterek, batch végrehajtás cs.executebatch(); 61/87

CallableStatement (6) CallableStatement cs = conn.preparecall( "{call gettestdata(?,?)}"); cs.registeroutparameter(1, java.sql.types.tinyint); cs.registeroutparameter(2, java.sql.types.decimal); ResultSet rs = cs.executequery(); //... byte x = cs.getbyte(1); java.math.bigdecimal n = cs.getbigdecimal(2); OUT paraméterek 62/87

CallableStatement (7) CallableStatement cs = conn.preparecall("{call revisetotal(?)}"); cs.setbyte(1, (byte)25); cs.registeroutparameter(1, java.sql.types.tinyint); cs.executeupdate(); byte x = cs.getbyte(1); INOUT paraméter! 63/87

CallableStatement (8) public void performfunccall() { } 64/87 try { CallableStatement cs = null; double monthlysalary; cs = conn.preparecall("{? = call get_employee_salary(?)}"); cs.registeroutparameter(1,java.sql.types.integer); cs.setstring(2, "A101"); cs.execute(); monthlysalary = cs.getint(1); cs.close(); Függvény hívás System.out.println("Monthly salary is $"+monthlysalary+".\n"); IN paraméter! } catch (SQLException e) { e.printstacktrace(); }

Témakörök JAVA «-» adatbázis-kezelés JDBC alapok Statement PreparedStatement CallabeStatement Tranzakció kezelés 65/87

Tranzakció kezelés (1) Akkor lehet rá szükség ha több logikailag összefüggő SQL utasítást szeretnénk együtt (egy blokkban, közvetlenül egymás után) végrehajtani. Ezeknek az SQL utasításoknak általában van egy logikai sorrendje. Ha bármelyik SQL utasítás meghiúsul, akkor a logikailag ráépülő többi eljárást is vissza kell vonni. Példák: 66/87 Több oldalas regisztráció, ahol minden oldalhoz tartozó adat külön SQL utasítással bekerül az adatbázisba. Ha az x. oldal után a felhasználó nyom egy mégse gombot, akkor az eddig végrehajtott SQL insert-eket is érvénytelenítenünk kell.

Tranzakció kezelés (2) Banki műveletek átutalás egy számláról egy másikra, vagy készpénzfelvétel az automatából: Először megterhelődik az egyik számla a kívánt összeggel, ezután jóváíródik a másik számlán, vagy kiadja az automata. Ha a második lépés meghiúsul (pl.: az automata technikai okok miatt nem tud pénzt kiadni) akkor az első műveletsort is vissza kell vonni. Ezekben az esetekben az SQL utasításokat egy tranzakcióban kezeljük. Ez a teljes tranzakció csak akkor hajtódik végre, ha mi erre a programunkból direkt felszólítjuk, egészen addig az adatbázis-kezelő elkülönítve kezeli őket. A tranzakció közben bármikor lehetőség van arra, hogy az addig kiadott SQL utasításokat érvénytelenítsük, ezzel az adatbázis visszaáll az eredeti állapotához. 67/87

Tranzakció kezelés (3) A tranzakciók kezelésének módját a Connection objecten a setautocommit() metódussal tudjuk megváltoztatni: connection.setautocommit(true): A JDBC alapértelmezésként ezt a beállítást alkalmazza, vagyis nem használ tranzakciókat. Ebben a módban minden egyes kiadott SQL utasítás azonnal végrehajtódik, és nem vonható vissza. connection.setautocommit(false): Ebben az esetben (AutoCommit mód kikapcsolva), az SQL utasítások tranzakciókba (csoportokba) rendezhetők, és csak akkor hajtódnak végre vagy vonódnak vissza, ha a connection-ön meghívjuk a commit() vagy rollback() metódusokat. 68/87

Tranzakció kezelés (4) A commit() hatására a tarnzakció utasításai véglegesen bekerülnek az adatbázisba, míg a rollback() visszaállítja az adatbázist a tranzakció megkezdése előtti állapotába. SavePoint: egy köztes pontot jelöl meg egy tranzakción belül és lehetővé teszi, hogy egy tranzakció visszagördüljön addig a pontig ahelyett, hogy a teljes tranzakció visszagördüljön. Savepoint sp1 = connection.setsavepoint("sp1"); connection.rollback(sp1); 69/87

Tranzakció kezelés (5) Egy tranzakcióhoz több Savepoint-ot rendelhetünk. Ezek automatikusan törlődnek commit vagy teljes rollback esetében. Ha egy bizonyos Savepoint-ig gördítünk vissza, az utána definiált Savepoint-ok törlődnek. Expliciten is törölhetünk Savepoint-ot: con.releasesavepoint(sp1); Ha egy automatikusan vagy expliciten törölt Savepoint-ra hivatkozunk, SQLException kivétel dobódik. 70/87

A JDBC programozás lépései (8) 1. Regisztráljuk a Driver-t a DriverManager-ben. 2. Létrehozunk egy adatbázis kapcsolatot: a DriverManager-től kérünk egy Connection-t 3. Tranzakció kezdete 4. A Connection-ben létrehozunk egy Statement-et (beállítjuk a kapcsolatot egy SQL parancs kiadására) 5. A Statement-hez hozzákapcsolunk egy SQL parancsot 6. Ha szükséges, megadjuk az SQL parancs paramétereit 7. Végrehajtjuk a Statement-et 8. Feldolgozzuk az eredményhalmazt 9. Tranzakció vége 10. Felszabadítjuk az erőforrásokat 71/87

Tranzakciók (2) Connection connection = DriverManager.getConnection(url, username, passwd); connection.setautocommit(false); try { statement.executeupdate(...); statement.executeupdate(...); connection.commit(); } catch (Exception e) { try { connection.rollback(); } catch (SQLException sqle) { // Hiba esetén } } finally { try { connection.close(); } catch (SQLException sqle) { } } 72/87

Tranzakció izolációs szintek (1) Azt határozzák meg, hogy hogyan kezelje a szerver az egyidejű hozzáférési kérelmeket (read, update, insert) ugyanahhoz az objektumhoz (tábla, rekord, ). 1. TRANSACTION_NONE: A tranzakciók nem támogatottak, nincs tranzakció kezelés. 2. TRANSACTION_READ_UNCOMMITED: Olvasáskor mindig az aktuális (módosított) értéket kapjuk, még akkor is, ha az adott insert/update tranzakciót a kezdeményező nem commit-olta. A következő problémák léphetnek fel: Dirty reads: A kiolvasott rekord értéke változhat más tranzakciók által a mi tranzakciónk ideje alatt. Tehát előfordulhat, hogy a tranzakciónk elején és végén az adott rekordban más értékek szerepelnek, holott mi nem is változtattuk, csak olvastuk 73/87

Tranzakció izolációs szintek (2) Non-repeatable reads: A tábla egy adott sora törlődhet a mi tranzakciónk közben. Így amikor mi a tranzakciónk elején és végén futtatunk egy-egy select-et, akkor a második esetben hiányozhatnak sorok az eredményből. Phantom reads: Hasonló az előzőhöz, csak inserttel. A táblába új sor (fantom sor) kerülhet egy másik tranzakció által miközben a mi tranzakciónk még fut. Így a tranzakciónk végén több sor lesz az adott táblában, mint amivel számolhattunk az elején 74/87

Tranzakció izolációs szintek (3) 3. TRANSACTION_READ_COMMITED: Olvasáskor mindig az adott rekord véglegesített értéket kapjuk. Ez az esetek 99%-ra használható, a tranzakcióink mindig csak olyan rekordokat olvasnak, amik véglegesítve vannak, azaz nincs nyitott tranzakció, ami dolgozna rajtuk. A baj ezzel az, hogy ha sokan írják és olvassák az adott rekordot vagy táblát akkor könnyen kialakulhat az a helyzet, hogy az olvasó tranzakciók arra várnak hogy az írás (pl egy nagy tábla update-je) befejeződjön. Ez a főleg a rekordokra vonatkozik így csak a dirty read-től véd, probléma lehet: a non-repeatable reads, 75/87 és a phantom reads.

Tranzakció izolációs szintek (4) 4. TRANSACTION_REPEATABLE_READ: Ez annyival jobb a READ_COMMITTED-nél, hogy már a non-repeatable read hibát is képes kiszűrni a tranzakcióból. Egyszerűbben: csak a rekordok véglegesített értékeit használja, és a rekordok tranzakció közbeni törlése nem befolyásolja a select-eket. Ebben az esetben csak egy probléma marad: a phantom reads 76/87

Tranzakció izolációs szintek (5) 5. TRANSACTION_SERIALIZABLE: Annyival több a REPEATABLE_READ-től, hogy más tranzakció nem írhatja felül a mi tranzakciónk által olvasott értékeket, azaz addig várakoztatja azokat míg be nem fejeződik a tranzakciónk. Így nem fognak tranzakció közben fantom sorok keletkezni a táblában. Itt elég problémás lehet, ha több résztvevő folyamatosan olvas egy táblát, amíg az updatelő szál várakozik, mert a tábla lock-olva van és nem tud bele írni 77/87

Tranzakció izolációs szintek (6) Ezek szintek föntről lefelé egyre költségesebbek lesznek az adatbázisnak, így a tranzakciók végrehajtási sebessége lassul. Az izolációs szinteket a Connection objektumon a settransactionisolation() metódussal állíthatjuk be a tranzakció megkezdése előtt. Például: connection.settransactionisolation( Connection.TRANSACTION_REPEATABLE_READ); 78/87

Adatbázis Rendszerek II. Ellenőrző kérdések 79/87

Ellenőrző kérdések 1. 1. Milyen sorrendben jelennek meg egy Java programban az alábbi kifejezések? Kezdje a számozást a legkorábbival. STATEMENT CONNECTION RESULTSET DRIVER SQL parancs 2. Melyik (alapértelmezett) porton kapcsolódik a JDBC a MySQL szerverhez? A: 8080 B: 1121 C: 3306 D: 6603 80/87

Ellenőrző kérdések 2. 3. Mi a paraméterek helyes sorrendje a JDBC-MySQL kapcsolat kiépítésénél? Port Password User Adatbázis Host 4. Melyik csomagot kell importálni JDBC-MySQL adatbázis kezeléshez? A: jdbc.mysql; B: java.mysql; C: mysql; D: java.sql; E: jdbc.sql; F: jdbc; 81/87

Ellenőrző kérdések 3. 5. Egészítse ki a táblázatot! SQL parancs Végrehajtás Visszatérő típus SELECT 1. 2. 3. executeupdate(); 4. 5. 6. Logikai 6. Ha? van egy kiadott parancsban, akkor az: A: Statement B: PreparedStatment C: CallableStatement D: Bármelyik kifejezés lehet 82/87

Ellenőrző kérdések 4. 7. Egészítse ki a kódot! public static 1. void 2. CloseConn(){ if (conn!= 3. null ) { trii 4. { conn. 5. close (); System.out.println("Sikeres lekapcsolódas"); } catch 6. (Exception ex) { System.err.println(ex.getMessage());} } } 83/87

Ellenőrző kérdések 5. 8. Egészítse ki a kódot! public static void Select(){ String sqlp = "select * from kategória order 1. b kkód"; String nev="", id=""; try { s = conn. crstmt 2. (); s. execq 3. (sqlp); rs = s.getrs 4. (); while( rs.nex() 5. ) { id 6. = rs.getstring("kkód"); nev = rs.getstring("név").trim(); d.print 7. (out+". adatsor: \t"+id+"\t"+nev); } } catch( Excep 8. e) {System.out.println("Gond:"+e.getMessage());} } 84/87

Ellenőrző kérdések 6. 9. Egészítse ki a kódot! public static String CallFunc(String datum){ String sqlp = "{? = 1. call Bevetel(?)}"; String vm = ""; try { CallableStatement cs = conn.prepc 2. (sqlp); cs. reoup 3. (1, j.s.t.ch 4. ); cs.setstring(2, datum); cs.execute(); vm = cs. getstri 5. (1); cs. Close 6. (); vm = "A "+datum+" napi bevétel: "+vm; } catch(exception e) {vm = "Bevétel gond: "+e. getmes 1. 7. ();} ret 8. vm ; } 85/87

Felhasznált irodalom Kovács László: PL/SQL, elektronikus jegyzet Barabás Péter: Adatbázis rendszerek 2., elektronikus jegyzet Kozsik Tamás: JDBC, elektronikus jegyzet http://www.cs.ubbcluj.ro/~bittologatok/ - JDBC adatbázis-hozzáférés java-ban, elektronikus jegyzet 86/87

VÉGE V É G E 87/87