Java Database Connectivity (JDBC)



Hasonló dokumentumok
Adatbázisok webalkalmazásokban

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

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

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


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

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

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

JAVA PROGRAMOZÁS 8.ELŐADÁS

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

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

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

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

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

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

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

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

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

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

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

JavaServer Pages (JSP) (folytatás)

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

JDBC. A JDBC alkalmazása

Database Systems II. ZH összefoglaló

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

JDBC - adatbáziskezelés

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

Java és web programozás

Segédanyag: Java alkalmazások gyakorlat

ANDROID ALKALMAZÁSFEJLESZTÉS

Programozási technológia

MDAC - Microsoft Data Access Components

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.

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Adatbázisok* tulajdonságai

Kliens oldali SQL-API

Java és web programozás

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

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

Szoftvertechnológia alapjai Java előadások

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Excel ODBC-ADO API. Tevékenységpontok: - DBMS telepítés. - ODBC driver telepítése. - DSN létrehozatala. -Excel-ben ADO bevonása

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

Adatbázis-kezelés ODBC driverrel

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Segédanyag: Java alkalmazások gyakorlat

Informatikai Navigátor

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

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

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Segédanyag: Java alkalmazások gyakorlat

JNDI - alapok. Java Naming and Directory Interface

OOP: Java 8.Gy: Abstract osztályok, interfészek

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

Az új be- és kimenet könyvtár

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Adatbázisok gyakorlat

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

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 4.ELŐADÁS. Adatbázis alapú alkalmazások készítése PHP-ben

Adattípusok. Max. 2GByte

Adattípusok. Max. 2GByte

Programozási nyelvek Java

Informatika terméktervezőknek

Adatbázis Rendszerek II. 7. Oracle JDBC

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

Java Programozás 3. Gy: Java GUI. Swing, AWT

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

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

Adatbázis használata PHP-ből

BME MOGI Gépészeti informatika 4.

Szoftvertechnolo gia gyakorlat

Vizuális programozás gyakorlat

3. Gyakorlat Ismerkedés a Java nyelvvel

Objektumorientált programozás C# nyelven III.

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

Java II. I A Java programozási nyelv alapelemei

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

SZAKDOLGOZAT. Szabó Attila

OOP: Java 6.Gy: Java osztályok. Definíció, static, túlterhelés

OOP: Java 8.Gy: Gyakorlás

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

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

SZAKDOLGOZAT. Vígh Gábor DEBRECEN 2009.

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Komponensek együttműködése web-alkalmazás környezetben. Jónás Richárd Debreceni Egyetem T-Soft Mérnökiroda KFT

Java Programozás 11. Ea: MVC modell

Adatbázis-lekérdezés. Az SQL nyelv. Makány György

3. Előadás. Az SQL adatbázisnyelv (Tartalom) Az SQL története. Az SQL felépítése. Adattípúsok. SQL utasítások

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Kivételkezelés, naplózás. Exception handling, logging

Java programozási nyelv 7. rész Java osztálykönyvtár 1.

C# gyorstalpaló. Készítette: Major Péter

Java programozási nyelv 10. rész Input/output kezelés

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

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Vé V g é r g e r h e a h j a tá t s á i s s z s ál á ak a Runnable, Thread

Átírás:

Java adatbázisok elérése Java Database Connectivity (JDBC)

JDBC Call Level Interface (CLI): standard, ami definiálja, hogy egy program hogyan kommunikálhat egy adatbázis management rendszerrel (DBMS). A Microsoft ODBC implementálja (ODBC - Open Database Connectivity) C-ben implementált, Javaban közvetlen módon nem alkalmazható (JDBC- ODBC bridges). JDBC: API, amely definiálja, hogy egy Java programozási nyelvben megírt program hogyan férhet hozzá egy (relációs) adatbázishoz A JDBC (a DriverManager osztály) egy vagy több adatbázis-specifikus driver-t alkalmaz (egy alkalmazáson belül több adatbázis típussal is dolgozhatunk).

JDBC Driverek és driver managerek: A kommunikáció lépései: a DriverManager-től kérünk egy adatbázis-specifikus drivert a driver létrehozza a kapcsolatot és visszafordít egy Connection objektumot a Connection segítségével létrehozunk egy Statement-et, ami egy SQL kérést tartalmaz a Statement objektum egy ResultSet objektumban visszaadja a kérés eredményét

JDBC - példa Inventory.mdb setup data source import java.sql.*; public class SimpleJDBC{ public static void main( String args[]){ try{ (Access DB) két szintes alkalmazás Név Típus Hossz NAME szöveg 40 QUANTITY valós 20 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String databasename = "jdbc:odbc:inventory"; Connection con = DriverManager.getConnection( databasename,"username","password"); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select * from Inventory"); while( rs.next()){ System.out.println(rs.getString(1)+":"+rs.getFloat(2)); catch( Exception e ){ e.printstacktrace();

Driver és kapcsolat A DB specifikus driver betöltése: Class.forName("com.sybase.jdbc.SybDriver"); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); A driver-nek megfelelő osztály tartalmaz egy statikus metódust, aminek segítségével a DriverManager regisztrálja a driver-t Az adatbázis elérése: hol található az adatbázis (a gazda számítógép Internet címe) hol hallgatja az RDBMS a kéréseket (melyik porton) JDBC - URL: jdbc:<masodlagos_protokoll>:<masodlagos_nev>//gazda_neve :port//adatbazis_neve A Connection tulajdonképpen egy interfész, ami lehetővé teszi kérések küldését és válaszok fogadását A kapcsolat létrehozásához szükséges a felhasználó neve és kódja. Ha több különböző adatbázissal dolgozunk, több driver van betöltve, a DriverManager dolga az aktuális Connection-nak megfelelő driver kiválasztása

DB hozzáférés, adatfeldolgozás A Connection interfész createstatement metódusa: Statement stmt = con.createstatement(); A Statement osztály fontosabb metódusai: executequery(string) SELECT parancsok végrehajtására, az eredmény egy ResultSet objektumban fordítja vissza executeupdate(string) INSERT/UPDATE/DELETE (és CREATE/DROP TABLE) parancsok végrehajtására, a módosított sorok számát fordítja vissza execute(string) az előzőek általánosítása Az eredményeket a ResultSet objektum tartalmazza: az ennek megfelelő táblázat mutatója az első sor elé mutat, így egyetlen while ciklussal bejárható: while( rs.next()){ System.out.println( rs.getstring(1)+":"+rs.getfloat(2)); Vigyázat: megtörténhet, hogy a visszafordított sorok száma 0 getxxx(int) és getxxx(string) érték visszafordítása az aktuális sorból és a paraméter által meghatározott oszlopból

SQL - Java típusok megfeleltetése SQL típus JAVA típus Metódus CHAR String getstring() VARCHAR String getstring() LONGVARCHAR String getstring() NUMERIC java.math.bigdecimal getbigdecimal() DECIMAL java.math.bigdecimal getbigdecimal() BIT boolean getboolean() TINYINT byte getbyte() SMALLINT short getshort() INTEGER int getint() BIGINT long getlong() REAL float getfloat() DOUBLE double getdouble() BINARY byte[] getbytes() VARBINARY byte[] getbytes() LONGVARBINARY byte[] getbytes() DATE java.sql.date getdate() TIME java.sql.time gettime() TIMESTAMP java.sql.timestamp gettimestamp()

Scrollable Result Sets a Statement objektumra meghívott createstatement és preparestatement metódusok paraméterei Statement stmt = con.createstatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); A ResultSet objektumon belüli kurzor pozicionálással kapcsolatos metódusok: Metódus Eredmény boolean first() boolean previous() boolean next() boolean last() boolean absolute( int poz ) boolean relative ( int rel_poz ) Pozicionálás az elsı sorra Pozicionálás az elızı sorra Pozicionálás a következı sorra Pozicionálás az utolsó sorra Pozicionálás a megadott sorra Pozicionálás az aktuális pozíció függvényében

Három szintes alkalmazások Az I. példában a forráskód SQL parancsokat is tartalmaz. Elegánsabb és optimálisabb megoldás jobban szétválasztani a konkrét alkalmazást az adatbázis-kezelő logikától: bevezetünk egy közbeeső szintet, és itt implementáljuk az összes lehetséges adatbázissal kapcsolatos műveletet. Az adatok részére létrehozunk egy-egy osztályt az adatoknak megfelelő mezőkkel és getter/setter metódusokkal (esetünkben: InventoryItem) az alkalmazás logikáját, az adatbázissal kapcsolatos műveleteket külön osztályokban implementáljuk (esetünkben InventoryManager)

Három szintes alkalmazások Az InventoryManager konstruktora betölti a megfelelő driver-t és létrehozza az adatbázis kapcsolatot, a többi metódus biztosítja az alkalmazás szempontjából fontos műveletek elvégzését: milyen mennyiség van raktáron egy bizonyos anyagból, anyag mennyiségének változtatása, valamelyik anyagból rendelkezésünkre áll-e egy megadott mennyiség

InventoryItem.java public class InventoryItem { String item; float amount; public InventoryItem() { item = ""; amount = 0; public InventoryItem(String s, float a) { item = s; amount =a ; public void setamount(float a) { amount = a; public float getamount() { return amount; public void setitem(string s) { item = s; public String getitem() { return item;

InventoryManager.java I. rész import java.sql.*; import java.util.vector; import java.util.enumeration; public class InventoryManager { Statement stmt; String databasename = "jdbc:odbc:inventory"; public InventoryManager() { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); catch( Exception e ) { e.printstacktrace(); //Az ingredient anyagból rendelkezésünkre áll-e amount mennyiség: public boolean checkinventory(string ingredient, float amount){ try { Connection con = DriverManager.getConnection(databaseName, "", ""); stmt = con.createstatement(); ResultSet rs = stmt.executequery( "SELECT Quantity FROM Inventory WHERE Ingredient = '"+ ingredient +"'"); rs.next(); if (amount > rs.getfloat(1)) return false; else return true; catch (Exception e) { e.printstacktrace(); return false;

InventoryManager.java II. rész public boolean checkinventory(vector ingredients) { try { Connection con = DriverManager.getConnection(databaseName, "", ""); stmt = con.createstatement(); Enumeration e = ingredients.elements(); while (e.hasmoreelements()) { InventoryItem i = (InventoryItem) e.nextelement(); ResultSet rs = stmt.executequery( "SELECT Quantity FROM Inventory WHERE Ingredient = '"+ i.item + "'"); rs.next(); if (i.amount > rs.getfloat(1)) return false; return true; catch (Exception e) { e.printstacktrace(); return false; //A paraméterkent kapott anyag mennyiségének visszafordítása public float quantityonhand(string ingredient) throws SQLException { Connection con =DriverManager.getConnection(databaseName, "", ""); stmt = con.createstatement(); ResultSet rs = stmt.executequery("select Quantity FROM Inventory WHERE Ingredient = '" + ingredient +"'"); rs.next(); return rs.getfloat(1);

InventoryManager.java III. rész //Az adott anyag mennyiségének aktualizálása public void replenish(string ingredient, float quantity) throws SQLException { Connection con = DriverManager.getConnection(databaseName, "", ""); stmt = con.createstatement(); ResultSet rs = stmt.executequery("select Quantity FROM Inventory WHERE Ingredient = '" + ingredient +"'"); rs.next(); stmt.executeupdate("update Inventory SET Quantity = " + (rs.getfloat(1) + quantity) + " WHERE Ingredient = '" + ingredient +"'");

InventoryMain.java public class InventoryMain { public static void main(string args[]){ InventoryManager im = new InventoryManager(); try { System.out.println( Ellenırzés - a raktáron lévı cukor mennyisége nagyobb mint 90" + im.checkinventory( cukor", 90f)); System.out.println( A raktáron lévı cukor mennyisége:" + im.quantityonhand( cukor")); im.replenish( cukor", 100f); System.out.println( A raktáron lévı cukor mennyisége:" + catch (Exception e) { e.printstacktrace(); im.quantityonhand( cukor"));

PreparedStatement PreparedStatement: előkészített utasítások Egy alkalmazáson belül többször akarjuk alkalmazni ugyanazt az SQL kódot, különböző paraméterekkel: az RDBMS lehetővé teszi előkészített utasítások használatát, melyek létrehozására, elemzésére csak egy alkalommal kerül sor az adatbázis oldalán, ezután többször használhatóak A PreparedStatement a Statement osztály leszármazottja: PreparedStatement pstmt = con.preparedstatement( "SELECT quantity FROM Inventory WHERE ingredient=? ); A? helyére kerülhet a bemeneti paraméter: PreparedStatement pstmt = con.preparestatement( "SELECT Quantity FROM Inventory WHERE Ingredient =?"); Enumeration e =ingredients.elements(); while( e.hasmoreelements()){ InventoryItem i = (InventoryItem) e.nextelement(); pstmt.setstring(1,i.item); ResultSet rs = pstmt.executequery(); rs.next(); if( rs.getfloat(1) < i.amount ) return false; return true;

PreparedStatement Az SQL utasítás csak egyszer lesz létrehozva és elemezve a lekérdezés gyorsabb. A PreparedStatement objektumra meghívott setxxx() metódusok első paramétere jelzi, hogy az SQL parancson belül hányadik paraméterről van szó, a második a paraméter értéke. A Java-SQL típusok közötti megfeleltetések: Java típus SQL típus Metódus Java.math.BigDecimal NUMERIC setbigdecimal() boolean BIT setboolean() byte TINYINT setbyte() short SMALLINT setshort() int INTEGER setint() long BIGINT setlong() float REAL setfloat() double DOUBLE setdouble() byte[] VARBINARY sau LONGVARBINARY setbytes() java.sql.date DATE setdate() java.sql.time TIME settime() java.sql.timestamp TIMESTAMP settimestamp() String VARCHAR sau LONGVARCHAR setstring()

Speciális mezık Speciális mezők: Binary Large Objects (BLOB) dokumentumok, képek, stb. Példa:.gif állományokban tárolt képek Access adatbázisba történő mentése, és kiolvasása/fájlba írása Mezo_neve Mezo_tipusa ID NAME IMAGE Numeric(10) Text(30) OLE Object JDBCImages.java: import java.io.*; import java.sql.*; public class JDBCImages{ String databasename = "jdbc:odbc:images"; Connection con = null; String pictures[]={ pelda1.gif", pelda2.gif", pelda3.gif", pelda4.gif", pelda5.gif"; PreparedStatement pstmt1 = null; PreparedStatement pstmt2 = null;

Speciális mezık példa II. rész public JDBCImages(){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection(databaseName,"",""); pstmt1 = con.preparestatement( "INSERT INTO images (id,name,image) VALUES (?,?,?)"); pstmt2 = con.preparestatement("select image FROM images WHERE id=?"); catch( Exception e ){ e.printstacktrace(); public void writerecord( int id ) { try{ File infile = new File( pictures[ id ] ); int flength = (int) infile.length(); FileInputStream in = new FileInputStream( infile ); pstmt1.setint(1,id); pstmt1.setstring(2,pictures[id]); pstmt1.setbinarystream(3,in,flength); pstmt1.executeupdate(); catch( Exception e ){ e.printstacktrace();

Speciális mezık példa III. rész public void readrecord( int id, String filename ){ byte [] picture = new byte[ 1024 ]; try{ pstmt2.setint(1,id); File outfile = new File(fileName); FileOutputStream out = new FileOutputStream( outfile ); ResultSet rs = pstmt2.executequery(); rs.next(); InputStream ins = rs.getbinarystream(1); int n; int s =0; while( (n=ins.read(picture))>0) { out.write( picture,0,n); s+=n; System.out.println("Total bytes read: "+Integer.toString(s)); out.close(); catch( Exception e ){ e.printstacktrace(); public static void main( String args[]){ int i; JDBCImages o = new JDBCImages(); o.writerecord( 1 ); o.readrecord( 1, "picture1.gif");

Batch parancsok Az összes aktualizálási parancs végrehajtható egyetlen műveleten belül Példa: Statement stmt = con.createstatement(); //batch parancsok hozzaadasa stmt.addbatch("insert INTO Katedra (Id, Nev) VALUES (5, Info')"); stmt.addbatch("insert INTO Tanarok (Id,KatedraId, Nev) VALUES (5,2, Valaki')"); //Parancsok vegrehajtasa int [] updatecounts = stmt.executebatch(); Egy tömböt fordít vissza az egyes parancsok által módosított sorok számával PreparedStatement esetében: PreparedStatement pstmt = con.preparestatement( "DELETE FROM Katedra WHERE Nev=?"); Enumeration e = v.elements(); while( e.hasmoreelements()){ pstmt.setstring( 1, (String) e.nextelement()); pstmt.addbatch(); int [] updatecounts = pstmt.executebatch();

CallableStatement A PreparedStatement kiterjesztettje, tárolt SQL utasítások végrehajtására alkalmas. Ezek az utasítások a bemenő paramétereken kívül kimenő paramétereket is használhatnak. {?= call <procedure-name>[<arg1>,<arg2>,...] {call <procedure-name>[<arg1>,<arg2>,...] arg1, arg2 - lehetnek egyaránt be vagy kimeneti paraméterek (vagy egyszerre mindkettő) CallableStatement cstmt = con.preparecall( "{call gettestdata(?,?)"); cstmt.registeroutparameter(1, java.sql.types.tinyint); cstmt.registeroutparameter(2, java.sql.types.decimal, 3); cstmt.executequery(); byte x = cstmt.getbyte(1); java.math.bigdecimal n = cstmt.getbigdecimal(2, 3);