8. Oracle JDBC -...

Preview:

Citation preview

B IT MAN117/1 v: 2019.02.13B IT MAN

Adatbázis Rendszerek II.

8. Oracle – JDBC

B IT MAN117/2

Témakörök

◼ Statement

◼ PreparedStatement

◼ JAVA «-» adatbázis-kezelés

◼ JDBC alapok

◼ CallabeStatement

◼ Tranzakció kezelés

B IT MAN117/3

A cél:

Jávás kliensről manipulálni az adatbázist.

B IT MAN117/4

Kis kitérő

◼ Adatbázis elérési módok:

– Beágyazott SQL: egy algoritmikus nyelvbe (C,

Pascal, FORTRAN, stb.) ágyazva alkalmazzuk az

SQL nyelv elemeit. Az algoritmikus feladatokat a

programnyelv, az adatbázissal kapcsolatos

műveleteket az SQL végzi. Hátrány: ha változik az

adatbázis, teljesen újra kell írni a programot.

– ODBC (Open Database Connenctivity): szabványos

eljáráskészlet az egyes adatbázisokhoz. Technológia:

drivereken keresztül érhetők el az adatbázisok, a

driverek felülete egységesen programozható. Így ha

változik az adatbázis, csak a drivert kell lecserélni.

B IT MAN117/5

Kis kitérő (2)

◼ Adatbázis elérési módok:

– OO LI (Object Oriented Line Interface): adatbázis

elérés objektum orientált módon (JDBC, ADO.NET)

– WEB LI: adatbázis elérés webes felületről

B IT MAN117/6

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.

B IT MAN117/7

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.

B IT MAN117/8

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.

B IT MAN117/9

A megoldás (1.)

Kétrétegű megoldás

Szerver-oldal

SQL

Kliens-oldal

Piros, Kék, ZöldDriver

B IT MAN117/10

A megoldás (2.)

Háromrétegű megoldás

Szerver-oldal

Alkalmazás

SQL

DB

Kliens-oldal

Piros, Kék, Zöld

Driver

B IT MAN117/11

Témakörök

◼ Statement

◼ PreparedStatement

◼ JAVA «-» adatbázis-kezelés

◼ JDBC alapok

◼ CallabeStatement

◼ Tranzakció kezelés

B IT MAN117/12

Az adatbázis-programozás lépései

Lekérdezés

Lekapcsolódás

Kapcsolódás

Eredmények

feldolgozása

B IT MAN117/13

Az adatbázis-programozás lépései

Lekapcsolódás

Driver regisztrálása

Kapcsolódás a DBMS-hez

Kapcsolódás

Lekérdezés

Eredmények

feldolgozása

B IT MAN117/14

Az adatbázis-programozás lépései

Lekapcsolódás

Eredmények

feldolgozása

SQL kérés (STATEMENT)

összeállítása

SQL kérés elküldése

Kapcsolódás

Lekérdezés

B IT MAN117/15

Az adatbázis-programozás lépései

Lekapcsolódás

Kapcsolódás

Az eredményhalmaz (CURSOR)

rekordonkénti bejárása

Az értékek átadása

programváltozóknak

Lekérdezés

Eredmények

feldolgozása

B IT MAN117/16

Az adatbázis-programozás lépései

Kapcsolódás

Lekérdezés

Eredmények

feldolgozása

Eredményhalmaz lezárása

SQL kérés lezárása

Kapcsolat lezárásaLekapcsolódás

B IT MAN117/17

Az adatbázis-programozás lépései

Driver regisztrálása

Kapcsolódás a DBMS-hez

Kapcsolódás

SQL kérés (STATEMENT)

összeállítása

SQL kérés elküldése

Az eredményhalmaz (CURSOR)

rekordonkénti bejárása

Lekérdezés

Az értékek átadása

programváltozóknak

Eredményhalmaz lezárása

SQL kérés lezárása

Eredmények

feldolgozása

Lekapcsolódás

B I T MAN

Kapcsolat lezárása

B IT MAN117/18

JDBC alapok B I T MAN

Kliens számítógép

B IT MAN117/19

PreparedStatement

Connection

DriverManager

ResultSet

ge

tCo

nn

ectio

np

rep

are

Sta

tem

en

tStatement

extends extendsCallableStatement

exe

cu

teQ

ue

ry

DataType

JDBC osztályok/interfészek

setXxx

B IT MAN117/20

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

B IT MAN117/21

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).

B IT MAN117/22

Az adatbázis-programozás lépései

Lekapcsolódás

Driver regisztrálása

Kapcsolódás a DBMS-hez

Kapcsolódás

Lekérdezés

Eredmények

feldolgozása

B IT MAN117/23

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

B IT MAN117/24

A Driver (meghajtó) betöltése (1)

◼ Feltétel: a Java keresési útvonalán elérhető legyen a

fizikai driver.

Oracle-höz: ojdbc6.jar

◼ Megteremtése: bemásolni a drivert a Java keresési

útvonalában szereplő könyvtárba, és telepíteni:

set classpath=.; ojdbc6.jar

1. 2.3.

4. 5.

B IT MAN117/25

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("oracle.jdbc.driver.OracleDriver");

} catch (ClassNotFoundException e) {

System.out.println("Hibás driver regisztráció!"+e.getMessage());

}

}

B IT MAN117/26

◼ Grafikus felületen:

import java.sql.*;

import java.awt.*;

import javax.swing.*;

public void Reg(){

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

} catch (ClassNotFoundException ex) {

JOptionPane.showMessageDialog(

null,"Hibás driver regisztráció!", "BitMan mondja: ",2);

}

}

A Driver (meghajtó) betöltése (2)

B IT MAN117/27

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.)

B IT MAN117/28

JDBC driver-ek

◼ A driver egy kliens oldali adapter (program), mely a java program

kéréseit átalakítja az adatbázisszerver számára értelmezhető

formára, és az adatbázisszerver által küldött válaszokat

visszaalakítja a java program számára értelmezhető formára.

◼ Besorolásuk (típusok):

– Type 1: JDBC – ODBC átjáró (híd),

– Type 2: JDBC – Natív API driver

– Type 3: JDBC – Hálózat protokoll (köztesréteg driver)

– Type 4: JDBC – Direkt adatbázis driver

B IT MAN117/29

Type 1: JDBC – ODBC átjáró

Adatbázis kezelő program

Adatbázis

hálózatiadatbázisprotokoll

Java program

JDBC-ODBC átjáró

ODBCdriver

Kliens oldal Szerver oldal

◼ Már meglévő ODBC driver használatát teszi lehetővé

◼ A Type 1 driver átalakítja a JDBC hívásokat ODBC hívásokká

◼ Az ODBC driver egy az adatbázis gyártója által készített driverhez

(natív program könyvtár) kapcsolódik, ez már eléri az adatbázist

◼ Ez a leglassabb driver típus

Natívprogramkönyvtár

Type 1

B IT MAN117/30

Type 2: JDBC – Natív API driver

Adatbázis kezelő program

Adatbázis

hálózatiadatbázisprotokoll

Java program

Natív API

driver

Kliens oldal Szerver oldal

◼ Natív program könyvtár: az adatbázis típusától függő, az adatbázis

készítői által írt driver. (Natív ≈ Közvetlenül érthető, nem igényel

további átalakítást, konvertálást.

◼ A Type 2 JDBC driver a JDBC hívásokat közvetlenül átalakítja az

adott típusú adatbázis API hívásaira.

◼ Gyorsabb, mint a Type 1 JDBC driver.

◼ Ilyen típusúak az Oracle oci driverek.

Natívprogramkönyvtár

Type 2

B IT MAN117/31

Type 3: JDBC – Hálózati protokoll (köztesréteg driver)

Adatbázis kezelő program

Adatbázis

hálózatiadatbázisprotokoll

Java program

Hálózatiprotokoll

Kliens oldal Szerver oldal

◼ A Javában írt, hordozható driver a JDBC hívásokat adatbázis-

független hálózati protokollhívásokká alakítja, melyeket egy

megfelelő szerverprogram értelmez és alakít át az adott adatbázis-

kezelő API-jának hívásaivá.

◼ A Type 3 JDBC driver nem közvetlenül az adatbázissal, hanem egy

külön szerverprogrammal kommunikál.

Köztes réteg

Alkalmazás szerver

Type 3

B IT MAN117/32

Type 4: JDBC – Direkt adatbázis driver

Adatbázis kezelő program

Adatbázis

hálózatiadatbázisprotokoll

Java program

Direkt adatbázis driver

Kliens oldal Szerver oldal

◼ Javában írt meghajtó program, amely a JDBC hívásokat közvetlenül

a megfelelő adatbázis-kezelő adatmanipulációs protokolljának

hívásaivá alakítja át.

◼ Nincs szükség közbenső szerverprogramra.

◼ Ez a leggyorsabb driver típus.

◼ Ilyen típusú az Oracle thin driver.

Type 4

B IT MAN117/33

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

B IT MAN117/34

Kapcsolat létrehozása

public Connection Kapcs(String host, String dbname,

String uname, String pword){

Connection conn = null;

try {

String url = "jdbc:oracle:thin:@"+host+":1521:"+dbname;

conn = DriverManager.getConnection(url, uname, pword);

} catch (SQLException e) {

System.out.println("AB Kapcsolódás hiba: "+e.getMessage());

conn = null;

}

return conn;

}

B IT MAN117/35

A kapcsolat lezárása

public void Lekapcs(){

try {

conn.close();

} catch(Exception e) {

System.out.println("Lekapcs hiba: "+e.getMessage());

}

}

B IT MAN117/36

Az adatbázis-programozás lépései

Lekapcsolódás

Eredmények

feldolgozása

SQL kérés (STATEMENT)

összeállítása

SQL kérés elküldése

Kapcsolódás

Lekérdezés

B IT MAN117/37

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.

B IT MAN117/38

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

B IT MAN117/39

◼ Végrehajtási módok:

1. executeUpdate():

Adatmanipulációs (DML: insert, update, delete) és

adatdefiníciós (DDL: create/drop/alter) 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

Munka az adatbázisban (3)

B IT MAN117/40

Munka az adatbázisban (4)

SQL statement

Végrehajtó parancsVisszatérő

érték típusaMagyarázat

Select executeQuery(sqlp); ResultSetRekordok (adatok)

InsertUpdateDeleteCreateDropAlter

executeUpdate(sqlp); IntAz érintett sorok száma, vagy 0.

Tárolt eljárások

execute(sqlp); booleanIgaz, ha az első visszatérő adat ResultSet.

B IT MAN117/41

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

B IT MAN

B IT MAN117/42

Az adatbázis-programozás lépései

Kapcsolódás

Lekérdezés

Eredmények

feldolgozása

Eredményhalmaz lezárása

SQL kérés lezárása

Kapcsolat lezárásaLekapcsolódás

B IT MAN117/43

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();

B IT MAN117/44

Bolt adatbázis – alapprogram

Abkezel_demo.java

import java.sql.*;public class Abkezel_demo {

private Connection conn = null;private static java.io.Console d = System.console();

public void DrReg(){try {

Class.forName("oracle.jdbc.driver.OracleDriver");d.printf("Sikeres driver regisztrálás\n");

} catch(Exception ex) { System.err.println(ex.getMessage());

}}

(3/1)

B IT MAN117/45

Bolt adatbázis – alapprogram

Abkezel_demo.java

public void Kapcs(){//String url = "jdbc:oracle:thin:@193.6.5.58:1521:xe";

//driver:@host:port:adatbázis neve;String url = "jdbc:oracle:thin:@localhost:1521:XE";try {

conn = DriverManager.getConnection(url,"system", "jelszo");d.printf("Sikeres kapcsolódás\n");

} catch(Exception ex) {System.err.println(ex.getMessage());}}

public void LeKapcs(){if (conn != null) {

try {conn.close();d.printf("Sikeres lekapcsolódás");

} catch(Exception ex) {System.err.println(ex.getMessage());}}

}

(3/2)

B IT MAN117/46

Bolt adatbázis – alapprogram

Abkezel_demo.java

public static void main(String args[]){Abkezel_demo abk = new Abkezel_demo();abk.DrReg();abk.Kapcs();

abk.LeKapcs();}

} //Abkezel_demo vége

(3/3)

B IT MAN117/47

Témakörök

◼ Statement

◼ PreparedStatement

◼ JAVA «-» adatbázis-kezelés

◼ JDBC alapok

◼ CallabeStatement

◼ Tranzakció kezelés

B IT MAN117/48

Az adatbázis-programozás lépései

Lekapcsolódás

Eredmények

feldolgozása

SQL kérés (STATEMENT)

összeállítása

SQL kérés elküldése

Kapcsolódás

Lekérdezés

B IT MAN117/49

Statement

◼ A kapcsolat objektum createStatement()

metódusával jön létre,

◼ és az executeUpdate() vagy az executeQuery()

paranccsal hajtható végre.

Statement stmt = conn.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 * from …");

B IT MAN

B IT MAN117/50

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

B IT MAN117/51

ge

tCo

nn

ectio

nPreparedStatement

Connection

DriverManager

ResultSet

pre

pa

reS

tate

men

tStatement

extends extendsCallableStatement

exe

cu

teQ

ue

ry

DataType

JDBC osztályok/interfészek

execute

Update

setXxx

B IT MAN117/52

Statement használata

Abkezel_demo.java

public String Beszur (String kod, String nev){String sqlp="insert into kategoria values ('"+kod+"', '"+nev+"')";String vm = "";try {

s = conn.createStatement();s.executeUpdate(sqlp);vm = "OK! Rekord beszurva!";s.close();

} catch(Exception e) {vm = "Gond: "+e.getMessage();}return vm;

}public static void main(String args[]){Abkezel_demo abk = new Abkezel_demo();abk.DrReg();abk.Kapcs();String vs = abk.Beszur("k07", "Festék");d.printf(vs+"\n");abk.LeKapcs();

}

(Kódrészlet!)

B IT MAN

B IT MAN117/53

Kissé életszerűbben

Abkezel_demo.java

public static void main(String args[]){Abkezel_demo abk = new Abkezel_demo();abk.DrReg();abk.Kapcs();

String kod = d.readLine("Kérem a kategória kódot: ");String nev = d.readLine("Kérem a kategória nevét: ");String vs = abk.Beszur(kod, nev);d.printf(vs+"\n");abk.LeKapcs();

}

(Kódrészlet!)

B IT MAN117/54

Az adatbázis-programozás lépései

Lekapcsolódás

Kapcsolódás

Az eredményhalmaz (CURSOR)

rekordonkénti bejárása

Az értékek átadása

programváltozóknak

Lekérdezés

Eredmények

feldolgozása

B IT MAN117/55

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

B IT MAN117/56

ge

tCo

nn

ectio

nPreparedStatement

Connection

DriverManager

ResultSet

pre

pa

reS

tate

men

tStatement

extends extendsCallableStatement

exe

cu

teQ

ue

ry

DataType

JDBC osztályok/interfészek

execute

Update

setXxx

B IT MAN117/57

ResultSet használata

Abkezel_demo.java

public int Select(){String sqlp = "select * from kategoria order by kkod";int out=0; String nev="", id="";d.printf("\nVégrehajtott parancs: "+sqlp+"\n");try {

s = conn.createStatement();s.executeQuery(sqlp);rs = s.getResultSet();while(rs.next()) {

out++;id = rs.getString("Kkod");nev = rs.getString("Nev").trim();d.printf("\n"+out+". adatsor: \t"+id+"\t"+nev);

}rs.close();s.close();

} catch(Exception e) {out = -1;System.out.println("Gond: "+e.getMessage());

}return out;

}

(Kódrészlet!)

B IT MAN

B IT MAN117/58

ResultSet használata (2)

Abkezel_demo.java

public static void main(String args[]){Abkezel_demo abk = new Abkezel_demo();abk.DrReg();abk.Kapcs();

int vi = abk.Select();d.printf("\nÉrintett rekordok száma: "+vi+"\n");abk.LeKapcs();

}

(Kódrészlet!)

B IT MAN

B IT MAN117/59

Módosítható (updateable) ResultSet

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();

}

B IT MAN117/60

◼ 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

Módosítható (updateable) ResultSet (2)

B IT MAN117/61

Témakörök

◼ Statement

◼ PreparedStatement

◼ JAVA «-» adatbázis-kezelés

◼ JDBC alapok

◼ CallabeStatement

◼ Tranzakció kezelés

B IT MAN117/62

Az adatbázis-programozás lépései

Lekapcsolódás

Eredmények

feldolgozása

SQL kérés (PreparedStatement)

összeállítása

SQL kérés elküldése

Kapcsolódás

Lekérdezés

B IT MAN117/63

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

B IT MAN117/64

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 = conn.prepareStatement(

"UPDATE table1 SET name = ? WHERE id = ?");

pstmt.setString(1, "Joe");

pstmt.setLong(2, 24357);

int SorDb = pstmt.executeUpdate();

PreparedStatement pstmt = conn.prepareStatement(

" SELECT a, b, c FROM Table1 WHERE id = ?");

pstmt.setInt(1, 4357);

ResultSet rs = pstmt.executeQuery(); B IT MAN

B IT MAN117/65

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 PreparedStatement-

et (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

B IT MAN117/66

setXxx

pre

pa

reS

tate

men

tg

etC

on

ne

ctio

nPreparedStatement

Connection

DriverManager

ResultSet

Statementextends extends

CallableStatemente

xe

cu

teQ

ue

ry

DataType

JDBC osztályok/interfészek

B IT MAN117/67

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"

B IT MAN117/68

Bolt – Termékek

B IT MAN117/69

PreparedStatement (4)Abkezel_demo.java

public String Aremel(){String[ ] tkods = {"t02", "t05", "t13"};String vm = "";try {

PreparedStatement ps = conn.prepareStatement("update termek set ar = ar*(1.1) where tkod = ?");

for(int i=0; i<tkods.length; i++){ps.setString(1, tkods[i]);ps.executeUpdate();

}vm = "OK! Áremelés rendben!";ps.close();

} catch(Exception e) {vm = "Gond: "+e.getMessage();}return vm;

}public static void main(String args[]){

Abkezel_demo abk = new Abkezel_demo();abk.DrReg();abk.Kapcs();String vm = abk.Aremel();System.out.println(vm);abk.LeKapcs();

}

(Kódrészlet!)

B IT MAN117/70

Bolt – Termékek (áremelés után)

B IT MAN117/71

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 PreparedStatement-

et (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

B IT MAN117/72

pre

pa

reS

tate

men

tg

etC

on

ne

ctio

nPreparedStatement

Connection

DriverManager

ResultSet

Statementextends extends

CallableStatemente

xe

cu

teQ

ue

ry

DataType

JDBC osztályok/interfészek

setXxx

B IT MAN117/73

PreparedStatement (5)

PreparedStatement ps = c.prepareStatement (

"select title, year_made from movies

where year_made >= ? and year_made < ?");

for (int ev = 1920; ev < 2010; ev += 10){

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);

}

}

B IT MAN117/74

Témakörök

◼ Statement

◼ PreparedStatement

◼ JAVA «-» adatbázis-kezelés

◼ JDBC alapok

◼ CallabeStatement

◼ Tranzakció kezelés

B IT MAN117/75

Az adatbázis-programozás lépései

Lekapcsolódás

Eredmények

feldolgozása

SQL kérés (CallableStatement)

összeállítása

SQL kérés elküldése

Kapcsolódás

Lekérdezés

B IT MAN117/76

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

B IT MAN117/77

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); B IT MAN

B IT MAN117/78

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

B IT MAN117/79

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.

create procedure KatNevMod (kk in char, kn varchar) asbeginupdate Kategoria set Nev= kn where kkod= kk;

end;

Run

beginKatNevMod("k01", "Élelmiszer");end;

B IT MAN117/80

KatNevMod tárolt eljárás létrehozása

Abkezel_demo.java

public String TeMaker(){String sqlp = "create or replace procedure KatNevMod (kk char, kn char) as begin Update Kategoria set Nev= kn where kkod= kk; end;";String vm = "";try {

s = conn.createStatement();s.executeUpdate(sqlp);vm = "Kész a KatNevMod eljárás";

} catch(Exception e) {vm = "Gond: "+e.getMessage();}return vm;

}public static void main(String args[]){

Abkezel_demo abk = new Abkezel_demo();abk.DrReg();abk.Kapcs();String vm = abk.TeMaker();System.out.println(vm);abk.LeKapcs();

}

(Kódrészlet!)

B IT MAN

B IT MAN117/81

setXxx

ge

tCo

nn

ectio

nPreparedStatement

Connection

DriverManager

ResultSet

pre

pa

reS

tate

men

tStatement

extends extendsCallableStatement

exe

cu

teQ

ue

ry

DataType

JDBC osztályok/interfészeke

xe

cu

te

B IT MAN117/82

CallableStatement (2) – KatNevMod hívása

Abkezel_demo.java

public String TeHiv(String kod, String nev){String sqlp = "{call KatNevMod(?, ?)}";String vm = "";try {

CallableStatement cs = conn.prepareCall(sqlp);cs.setString(1, kod);cs.setString(2, nev);cs.execute();cs.close();vm = "KatNevMod - Sikeres végrehajtás";

} catch(Exception e) {vm = "Gond: "+e.getMessage();}return vm;

}public static void main(String args[]){

Abkezel_demo abk = new Abkezel_demo();abk.DrReg();abk.Kapcs();String vm = abk.TeHiv("k01", "Élelmiszer");System.out.println(vm);abk.LeKapcs();

}

(Kódrészlet!)

B IT MAN117/83

Bolt – Tárolt függvény

Bevetel nevű tárolt függvény, mely megadott nap bevételét adja vissza.

create or replace function Bevetel (ip in varchar2) return int asbev int:=0;beginselect sum(Ar*Darab) into bev from Termek t inner join Vasarlas v

on t.Tkod=v.Tkod where to_char(idopont,'yyyy.mm.dd')=ip;return bev;

end;

Run

select Bevetel('2016.03.11') from dual;

B IT MAN117/84

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

Abkezel_demo.java

public String TfMaker(){String sqlp = "create or replace function Bevetel (ip in varchar2) return int as bev int:=0; begin select sum(Ar*Darab) into bev from Termek t inner join Vasarlas v on t.Tkod=v.Tkod where to_char(idopont,'yyyy.mm.dd')=ip; return bev; end;";

String vm = "";try {

s = conn.createStatement();s.executeUpdate(sqlp);vm = "Kész a Bevetel függvény.";

} catch(Exception e) {vm = "Gond: "+e.getMessage();}return vm;

}public static void main(String args[]){

Abkezel_demo abk = new Abkezel_demo();abk.DrReg();abk.Kapcs();String vm = abk.TfMaker();System.out.println(vm);abk.LeKapcs();

}

(Kódrészlet!)

B IT MAN117/85

setXxx

ge

tCo

nn

ectio

nPreparedStatement

Connection

DriverManager

ResultSet

pre

pa

reS

tate

men

tStatement

extends extendsCallableStatement

exe

cu

teQ

ue

ry

DataType

JDBC osztályok/interfészek

B IT MAN117/86

CallableStatement (3) – Bevetel hívásaAbkezel_demo.java

public String TfHiv(String datum){String sqlp = "{? = call Bevetel(?)}";String vm = "";try {

CallableStatement cs = conn.prepareCall(sqlp);cs.registerOutParameter(1, java.sql.Types.CHAR);cs.setString(2, datum);cs.execute();vm = cs.getString(1);cs.close();vm = "A "+datum+" napi bevétel: "+vm;

} catch(Exception e) {vm = "Bevétel gond: "+e.getMessage();}return vm;

}public static void main(String args[]){

Abkezel_demo abk = new Abkezel_demo();abk.DrReg();abk.Kapcs();String vm = abk.TfHiv("2016.03.11");System.out.println(vm);abk.LeKapcs();

}

(Kódrészlet!)

B IT MAN117/87

CallableStatement (4)

CallableStatement cs = conn.prepareCall

( "{ call szabad_helyek( ?, ?, ? ) }" );

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);

IN paraméter

OUT paraméter

OUT paraméter

OUT paraméterek

B IT MAN117/88

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();

. . .

cs.executeBatch();

IN paraméterek,

batch végrehajtás

B IT MAN117/89

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

B IT MAN117/90

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!

B IT MAN117/91

CallableStatement (8)

public void performFuncCall() {

CallableStatement cs = null;

double monthlySalary;

try {

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();

System.out.println("Monthly salary is

$"+monthlySalary+".\n");

} catch (SQLException e) { e.printStackTrace(); }

}

Függvény hívás IN paraméter!

B IT MAN117/92

Témakörök

◼ Statement

◼ PreparedStatement

◼ JAVA «-» adatbázis-kezelés

◼ JDBC alapok

◼ CallabeStatement

◼ Tranzakció kezelés

B IT MAN117/93

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:

– 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.

B IT MAN117/94

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.

B IT MAN117/95

Tranzakció kezelés (3)

◼ A tranzakciók kezelésének módját a Connection object-

en 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.

B IT MAN117/96

Tranzakció kezelés (4)

◼ A commit() hatására a tranzakció 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);

B IT MAN117/97

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:

conn.releaseSavepoint(sp1);

◼ Ha egy automatikusan vagy expliciten törölt Savepoint-ra

hivatkozunk, SQLException kivétel dobódik.

B IT MAN117/98

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

B IT MAN117/99

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) { }

}

B IT MAN117/100

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…

B IT MAN117/101

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 insert-

tel. 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…

B IT MAN117/102

Anomáliák (1)

◼ Konfliktusban álló műveletek keveredése:

– Két írás egymás után – lost update

– Olvasás két írás között – dirty read

– Írás két olvasás között – non repeatable read

– Írás két olvasás között – phantom read

w1(x) w1(x)

w1(x) w2(x)

r2(x)

r1(x) w2(x) r1(x)

r1(x) w2(x) r1(x)

B IT MAN117/103

Anomáliák (2)

◼ Lost update

◼ Elveszett frissítés

w1(x) w2(x)

READ(A)2.

READ(A)3.

A:= A + 30

4. A:= A + 20

5.

6.

WRITE(A)7.

BEGIN1.

END8.

WRITE(A)

A=50

A=50

A=70

A=80

A=70

A=80

A≠100

B IT MAN117/104

Anomáliák (3)

◼ Dirty read

◼ Piszkos olvasás

(ideiglenes frissítés) READ(A)2.

READ(A)

3.

4.

A:= A + 20

5.

6.

WRITE(A)7.

BEGIN1.

END8.

WRITE(A)

A=50

A=70

A=70

A=70

A=50

A=50

w1(x) w1(x)r2(x)

ROLLBACK(A)

A≠70

B IT MAN117/105

Anomáliák (4)

◼ Non repeatable read

◼ Nem megismételhető

olvasásREAD(A)2.

DELETE(A)

3.

4.

5.

6.

BEGIN1.

END

A=30

B=20

A=0

A=50 SELECT(A+B)

A≠20

r1(x) w2(x) r1(x)READ(B)

B IT MAN117/106

Anomáliák (5)

◼ Phantom read

◼ Fantom olvasás

SUM(WHERE)2.

INSERT(WHERE)3.

4.

5.

BEGIN1.

S=300

I=20

S=320

S≠S

r1(x) w2(x) r1(x)SUM(WHERE)

BEGIN

END

SUM(WHERE)

BEGIN

SUM(WHERE)

B IT MAN117/107

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,

– és a phantom reads.

B IT MAN117/108

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

B IT MAN117/109

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…

B IT MAN117/110

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);

B IT MAN117/111

Órai feladatok 1.

◼ Készítsen egy JDBC alkalmazást, mely alkalmas a következőkre:

◼ Használja a Termek táblát!

1. Készítsen egy Java metódust, mely kilistázza a képernyőre a tábla

adatait. A metódus neve legyen TermekLista.

2. Készítsen egy Java metódust, mely beszúr egy beolvasott

paraméterekkel megadott rekordot. A metódus neve legyen Beszur.

3. Készítsen egy Java metódust, mely kétlépcsős technikával

(prepareStatement) legalább 3 db, valamilyen adatszerkezetben

tárolt rekordot szúr be. Az eljárás írja ki a beszúrt rekordok számát. A

metódus neve legyen Beszur_2.

4. Készítsen egy Java metódust, mely módosítja egy adott Tkod-ú

rekord Ár mezőjében lévő értékét (egy megadott értékre). A metódus

neve legyen Modosit.

5. Készítsen menüt a programhoz, mely a TermekLista, a Beszur a

Modosit és a Kilépés funkciókat kezeli.

B IT MAN117/112

Órai feladatok 2.

◼ Készítsen egy JDBC alkalmazást, mely alkalmas a következőkre:

◼ Használja a Termek táblát!

1. Készítsen egy Java metódust, melyben létrehoz egy tárolt

függvényt. A függvény adja vissza egy megadható kategóriájú

termék darabszámát a Termék táblából.

2. Készítsen egy Java metódust, mely lefuttatja az 1. feladatban

létrehozott tárolt függvényt, és az eredményt kiírja a képernyőre.

3. Készítsen egy Java metódust, melyben létrehoz egy tárolt eljárást.

Az eljárás módosítsa egy megadható kódú termék nevét (egy

szintén megadható értékre) a Termék táblában.

4. Készítsen egy Java metódust, mely lefuttatja a 3. feladatban

létrehozott tárolt eljárást, ezután visszaolvassa az adatbázisból, és

kiírja a képernyőre az adott termék tényleges (módosítás utáni)

nevét.

B IT MAN117/113

Órai feladatok 3.

◼ Készítsen egy egyetlen osztályból álló JAVA programot, mely a main metódusban kapcsolódik az Oracle szerverhez.

◼ Készítse el, és futtassa le az alábbi metódusokat:

1. Készítsen egy Java metódust, mely létrehoz egy táblát az Oracle szerveren. A táblában legyen egy KÓD mező, mely legyen numerikus, és legyen elsődleges kulcs. Legyen a táblában egy NÉV mező, és egy NUMERIKUS adatmező, melyben 10000-es nagyságrendű, két tizedes pontosságú adatokat kell tárolni.

A tábla sémája [ Kod, Nev, Num_adat ]

2. Készítsen egy Java metódust, mely beszúr egy billentyűzetről beolvasott paraméterekkel megadott rekordot.

3. Készítsen egy Java metódust, mely kétlépcsős technikával legalább 3, valamilyen adatszerkezetben tárolt kódú rekord numerikus értékét módosítja egy megkapott értékkel. Az eljárás írja ki a ténylegesen módosított rekordok számát.

B IT MAN117/114

Órai feladatok 3.

4. Készítsen egy Java metódust, mely kilistázza a képernyőre a tábla adatait.

5. Készítsen egy Java metódust, melyben megadható egy kereső kifejezés, és az ennek megfelelő nevű emberek adatait kilistázza a képernyőre.

6. Készítsen egy Java metódust, melyben a numerikus értékre lehet keresni. Legyen megadható a reláció (<, =, >) és a szám konstans. A metódus írja ki a megfelelő emberek adatait a képernyőre.

7. Készítsen egy Java metódust, melyben a kódra lehet keresni. Lehessen adott értéktől kisebb, két érték közötti, és adott értéktől nagyobb kódra keresni. A metódus írja ki a megfelelő kódú emberek adatait a képernyőre.

8. Készítsen egy Java metódust, mely kiírja a képernyőre a rekordok számát.

9. Készítsen egy Java metódust, mely kiírja a képernyőre a legkisebb, a legnagyobb, az átlagos és az összesített numerikus értéket.

B IT MAN117/115

B IT MAN117/116

Felhasznált irodalom

◼ Kovács László: Adatbázis rendszerek 2.,

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

B IT MAN117/117

VÉGEVÉGE

Recommended