71
1 Fejlett Programozási Technikák 2. 15/7

Fejlett Programoz ási Technikák 2

Embed Size (px)

DESCRIPTION

Fejlett Programoz ási Technikák 2. 15 / 7. Az előző előadás tartalma:. JFC és Swing Múlt Felépítés Java Bean Felső szintű konténerek Középső szintű konténerek Elemek Eseménykezelés Rajzolás. A mai előadás tartalma:. Java Applet Felépítése Tulajdonságai Paraméterátadás JDBC - PowerPoint PPT Presentation

Citation preview

Page 1: Fejlett Programoz ási Technikák 2

1

Fejlett Programozási Technikák 2.

15/7

Page 2: Fejlett Programoz ási Technikák 2

2

Fejlett Programozási Technológiák 2.

Az előző előadás tartalma: JFC és Swing

Múlt Felépítés Java Bean Felső szintű konténerek Középső szintű konténerek Elemek Eseménykezelés Rajzolás

Page 3: Fejlett Programoz ási Technikák 2

3

Fejlett Programozási Technológiák 2.

A mai előadás tartalma: Java Applet

Felépítése Tulajdonságai Paraméterátadás

JDBC Típusai Kapcsolat típusok Statement objektumok RecordSet Tranzakciók

Page 4: Fejlett Programoz ási Technikák 2

4

Fejlett Programozási Technológiák 2.

Források: http://java.sun.com/products/jdbc/ http://jdl.sun.com/webapps/download/Display?BundleId=7219&button=Continue http://java.sun.com/j2se/1.4.2/docs/api/java/sql/package-summary.html http://www.mindview.net/Books/TIJ/ http://www.cab.u-szeged.hu/WWW/java/kiss/jdbc.html

Page 5: Fejlett Programoz ási Technikák 2

5

Fejlett Programozási Technológiák 2.

Java Applet Kliens oldalon fut Beágyazható a HTML-be Az APPLET elemmel lehet beágyazni Akkor célszerű használni, ha nincs egyszerűbb

megoldás (titkosítás, táblázat, nyomtatás) Korlátozottabb mint a Java alkalmazás

Page 6: Fejlett Programoz ási Technikák 2

6

Fejlett Programozási Technológiák 2.

Nem garantált, hogy a másik oldalon van Java

<OBJECT classid = "clsid:CAFEEFAC-0014-0001-0000-ABCDEFFEDCBA" codebase = "http://java.sun.com/products/plugin/autodl/jinstall-1_4_1-windows-

i586.cab#Version=1,4,1,0" WIDTH = 100 HEIGHT = 50 > <PARAM NAME = CODE VALUE = Applet1 > <PARAM NAME = "type" VALUE = "application/x-java-applet;jpi-version=1.4.1"> <PARAM NAME = "scriptable" VALUE = "false"> <COMMENT> <EMBED type = "application/x-java-applet;jpi-version=1.4.1" CODE = Applet1 WIDTH = 100 HEIGHT = 50 scriptable = false pluginspage = "http://java.sun.com/products/plugin/index.html#download"> <NOEMBED> </NOEMBED> </EMBED> </COMMENT></OBJECT><!--<APPLET CODE = Applet1 WIDTH = 100 HEIGHT = 50></APPLET>--> HTMLconverter

Page 7: Fejlett Programoz ási Technikák 2

7

Fejlett Programozási Technológiák 2.

Alapok

Az Applet osztályból származtatandó amennyiben AWT elemeket szeretnénk használni

A JApplet osztályból származtatandó amennyiben Swing elemeket is szeretnénk használni

Page 8: Fejlett Programoz ási Technikák 2

8

Fejlett Programozási Technológiák 2.

Példaimport javax.swing.*;import java.awt.*;public class HelloWorld extends JApplet {JLabel label; String szoveg;

public void start() {szoveg = szoveg + " - " + "Start";label.setText(szoveg);

} public void stop() {

szoveg = szoveg + " - " + "Stop";label.setText(szoveg);

} public void destroy() {

szoveg = szoveg + " - " + "Destroy";label.setText(szoveg);

} public void init() { szoveg = new String("Init"); label = new JLabel(szoveg); label.setHorizontalAlignment(JLabel.CENTER); label.setBorder(BorderFactory.createMatteBorder(1,1,2,2,Color.black)); getContentPane().add(label, BorderLayout.CENTER); }}

<HTML><HEAD><TITLE> Teszt </TITLE></HEAD><BODY><APPLET CODE="HelloWorld.class" WIDTH="150" HEIGHT="25">

</APPLET></BODY></HTML>

Page 9: Fejlett Programoz ási Technikák 2

9

Fejlett Programozási Technológiák 2.

Rajz példaimport javax.swing.JApplet;import java.awt.Graphics;

public class Rajz extends JApplet {public void paint(Graphics g){

g.drawLine(15,10,210,10);g.drawLine(15,30,210,30);g.drawString(”Szöveg”,25,25);

}}

Page 10: Fejlett Programoz ási Technikák 2

10

Fejlett Programozási Technológiák 2.

Metódusok init - inicializálja az appletet minden újraindítás,

újratöltés után start – az applet inicializálása után fut le,

amikor egy oldalról elmegyünk és visszatérünk akkor csak ez és a stop metódus fut le

stop – az applet leállítása esetén fut le destroy - az applet újraindítása valamint

kilépés esetén fut le paint – AWT használata esetén érdekes,

segítségével viszonylag egyszerűen rajzolhatunk

Page 11: Fejlett Programoz ási Technikák 2

11

Fejlett Programozási Technológiák 2.

Az appletek korlátai a biztonságos működés érdekében a következő

korlátok léteznek: nem definiálhatunk natív metódusokat a futtató gépen nem írhat, olvashat fájlokat nem hozhat létre hálózati kapcsolatokat (a szervert kivéve) nem futtathat programokat a kliensen nem olvashatja a rendszer tulajdonságok egy részét a megjelenő ablakokban figyelmeztet arra, hogy azok Java

Applet ablakok digitálisan aláírt appletekre a fentiek nem feltétlenül

vonatkoznak (policy fájl)(http://developer.java.sun.com/developer/

technicalArticles/Security/Signed/)

Page 12: Fejlett Programoz ási Technikák 2

12

Fejlett Programozási Technológiák 2.

Amit Applettel meg lehet valósítani

szinte minden Swing és AWT elem használható a szerverrel hálózati kapcsolatot tud kiépíteni az azonos oldalon lévő appletek publikus

metódusait meghívhatjuk (böngésző függő) a helyi erőforrásról betöltött appletek nem

rendelkeznek a hálózatról letöltött appletek korlátaival

Page 13: Fejlett Programoz ási Technikák 2

13

Fejlett Programozási Technológiák 2.

Appletek létrehozása Forras.java javac Forras.java a legtöbb böngésző az oldal frissítésével nem

frissíti az appleteket (shift, ctrl + refresh) végső megoldás: kiüríteni a böngésző

gyorstárát, kilépni a böngészőből, belépni a böngészőbe

érdemes appletviewer-t használni a tesztelésre appletviewer forras.html figyeljünk arra, hogy a helyi elérési útvonal ne

tartalmazzon szóközöket

Page 14: Fejlett Programoz ási Technikák 2

14

Fejlett Programozási Technológiák 2.

Applet desktop alkalmazásimport javax.swing.*;import java.awt.*;public class Applet1c extends JApplet { public void init() { getContentPane().add(new JLabel("Applet!")); }public static void main(String[] args) { JApplet applet = new Applet1c(); JFrame frame = new JFrame("Applet1c"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(applet); frame.setSize(100,50); applet.init(); applet.start(); frame.setVisible(true); }}

Page 15: Fejlett Programoz ási Technikák 2

15

Fejlett Programozási Technológiák 2.

Appletek használata A showStatus(); metódussal írhatunk a státusz sorba másik applet metódushívás

public class Sender extends Applet implements ActionListener { . .receiver = getAppletContext().getApplet(receiverName);((Receiver)receiver).processRequestFrom(myName);}. . .public class Receiver extends Applet {public void processRequestFrom(String senderName) { label.setText("Received message from " + senderName + "!"); repaint(); }

Enumeration e = getAppletContext().getApplets(); Applet applet = (Applet)e.nextElement();

Page 16: Fejlett Programoz ási Technikák 2

16

Fejlett Programozási Technológiák 2.

Paraméterek <PARAM NAME=”nev” VALUE=”vili”> String nev = getParameter("nev") <APPLET CODEBASE=”URL”>

Page 17: Fejlett Programoz ási Technikák 2

17

Fejlett Programozási Technológiák 2.

Szálak sok böngésző az appleteket külön szálakban

futtatja gyakran külön szál csoportban Párhuzamos feladatok végrehajtására szálakat

használhatunk Runnable interfészt kell megvalósítani

Page 18: Fejlett Programoz ási Technikák 2

18

Fejlett Programozási Technológiák 2.

Kommunikáció a szerverrel

HTML (PARAM) java.net

(servlet listerner) RMI CORBA JDBC

Page 19: Fejlett Programoz ási Technikák 2

19

Fejlett Programozási Technológiák 2.

SQL, ODBC SQL (Sturctured Query Language)

adatbázis, tábla, sor , oszlop relációs adatbázis lekérdezés módosító lekérdezés nézet

ODBC (Open Database Connectivity) X/Open SQL CLI C nyelven alapuló interfész egységes felületet biztosít az adatbázisokhoz a gyártók saját meghajtókat írnak PC szabvány (csaknem ipari szabvány)

Page 20: Fejlett Programoz ási Technikák 2

20

Fejlett Programozási Technológiák 2.

JDBC

A Java platform legfontosabb összetevője

Platform és szállító független Egy egyszerű Java API a programozók

számára JDBC meghajtó menedzser Gyártó specifikus meghajtók mellyel az

egyes gyártók optimalizálhatják a kapcsolatot

Hasonló megoldás mint a Microsoft igen sikeres ODBC megoldása (C nyelv)

Az adatok titkosítása az szállító meghajtó feladata

Page 21: Fejlett Programoz ási Technikák 2

21

Fejlett Programozási Technológiák 2.

JDBC JDBC 1.0

SQL 92 egyszerű hívásszintű interfész

JDBC 2.0 sokkal összetettebb funkciók, alkalmazásszerverek connection pooling distributed transaction

JDBC 3.0 SQL 99

Page 22: Fejlett Programoz ási Technikák 2

22

Fejlett Programozási Technológiák 2.

JDBC meghajtók JDBC-ODBC bridge plus ODBC driver

JDBC-t ODBC-re alakítja az ODBC meghajtó kommunikál az adatbázissal JDBC/ODBC bridge nem támogatja a JDBC2-t az ODBC-t kell beállítanunk nem ajánlott a haszálata

Native-API partly-Java driver a meghajtó részben Java nyelven részben más nyelven íródott platform specifikus

JDBC-Net pure Java driver egyszerű Java kliens könyvtár mely adatbázis független hálózati

protokollon keresztül kommunikál egy szerver komponenssel mely ezt továbbítja az adatbázisnak

Native-protocol pure Java driver egyszerű Java könyvtár mely közvetlenül az adatbázissal kommunikál

Page 23: Fejlett Programoz ási Technikák 2

23

Fejlett Programozási Technológiák 2.

Miért nem ODBC Bonyolult Kevés utasítás, bonyolult szintaxis C specifikus, Pointer függő Kevésbé biztonságos, nehezebben telepíthető

mint a JDBC

Page 24: Fejlett Programoz ási Technikák 2

24

Fejlett Programozási Technológiák 2.

Használata Használható

Java alkalmazásokbanApplet-ekben

csak a szerverrel tud kapcsolatot létesíteni

Három, vagy több rétegű alkalmazásokban

KliensKözépső réteg

(Servlet, EJBean)Adatbázis

SzeverJDBC

http, RMI, …

Page 25: Fejlett Programoz ási Technikák 2

25

Fejlett Programozási Technológiák 2.

Three-tier Model

Page 26: Fejlett Programoz ási Technikák 2

26

Fejlett Programozási Technológiák 2.

JDBC installálása

PostgreSQL pgjdbc2.jar ->…\lib\ext postmaster –i pg_hba.conf

CLASSPATH windows:

http://www.ejip.net/faq/postgresql_win_setup_faq.jsp

Page 27: Fejlett Programoz ási Technikák 2

27

Fejlett Programozási Technológiák 2.

JDBC kapcsolat felépítés I. Meghajtó betöltése:

try { Class.forName("org.postgresql.Driver"); } catch(java.lang.ClassNotFoundException e) { System.err.print("ClassNotFoundException: "); System.err.println(e.getMessage()); } java -Djdbc.drivers=org.postgresql.Driver Teszt

Adatbázis címzése: jdbc:<alprotokoll>:<adatbázis hivatkozás> jdbc:odbc://teszt.com:5000;UID=scott;PWD=tiger jdbc:postgresql://160.114.36.248/teszt

Page 28: Fejlett Programoz ási Technikák 2

28

Fejlett Programozási Technológiák 2.

JDBC kapcsolat felépítés II. Kapcsolat objektum:

Connection con; con = DriverManager.getConnection(url, "Rendszergazda",

”x"); Kifejezés:

Statement stmt; stmt = con.createStatement(); stmt.close();

con.close(); kilépéskor le kell zárnunk minden kapcsolatot !! (a

szemétgyűjtő nem tudja megtenni helyettünk a statemenet-et igen)

Page 29: Fejlett Programoz ási Technikák 2

29

Fejlett Programozási Technológiák 2.

Példa:import java.sql.*;public class Teszt { public static void main(String args[]) { String url = "jdbc:postgresql://160.114.36.248/teszt"; Connection con; String createString; createString = "create table Teszt1 (COF_NAME VARCHAR(32), " + "SUP_ID INTEGER, PRICE FLOAT, SALES INTEGER, " + "TOTAL INTEGER)"; Statement stmt; try {Class.forName("org.postgresql.Driver");}

catch(java.lang.ClassNotFoundException e) { System.err.print("ClassNotFoundException: "); System.err.println(e.getMessage());} try { con = DriverManager.getConnection(url, "Rendszergazda", "Alert"); stmt = con.createStatement(); stmt.executeUpdate(createString); stmt.close(); con.close(); } catch(SQLException ex) { System.err.println("SQLException: " +

ex.getMessage());} }}

Page 30: Fejlett Programoz ási Technikák 2

30

Fejlett Programozási Technológiák 2.

JDBC kapcsolat felépítés III.

Connection Pooling ConnectionPoolDataSource

interfész 1:X kapcsolat fizikai kapcsolatok helyett

logikai kapcsolatok a kliens nem érzékel semmit Alkalmazás szerver biztosítja

ezt a funkciót (Tomcat is)

Page 31: Fejlett Programoz ási Technikák 2

31

Fejlett Programozási Technológiák 2.

Példacom.acme.jdbc.ConnectionPoolDS cpds =

new com.acme.jdbc.ConnectionPoolDS();

cpds.setServerName(“bookserver”);

cpds.setDatabaseName(“booklist”);

cpds.setPortNumber(9040);

cpds.setDescription(“Connection pooling for bookserver”);

Context ctx = new InitialContext();

ctx.bind(“jdbc/pool/bookserver_pool”, cpds);

com.acme.appserver.PooledDataSource ds =

new com.acme.appserver.PooledDataSource();

ds.setDescription(“Datasource with connection pooling”);

ds.setDataSourceName(“jdbc/pool/bookserver_pool”);

Context ctx = new InitialContext();

ctx.bind(“jdbc/bookserver”, ds);

Context ctx = new InitialContext();

DataSource ds = (DataSource)ctx.lookup(" jdbc/bookserver");

Connection con = ds.getConnection("user", "pwd");

Page 32: Fejlett Programoz ási Technikák 2

32

Fejlett Programozási Technológiák 2.

JDBC objektumok

Page 33: Fejlett Programoz ási Technikák 2

33

Fejlett Programozási Technológiák 2.

Connection Egy kapcsolatot jelent az adatbázissal Egy alkalmazásnak egy-vagy több kapcsolat

objektuma lehet, egy-vagy több adatbázissal Connection.getMetaData

DatabaseMetaData, információ az adatbázisról DriverManager.getConnection(URL)

a DriverManager megpróbál egy megfelelő meghajtót keresni az URL-ben szereplő adatbázishoz

DataSource ds.getConnection("user", "pwd");

Page 34: Fejlett Programoz ási Technikák 2

34

Fejlett Programozási Technológiák 2.

Metadata DatabaseMetaData dbmd = con.getMetaData(); kb. 150 metódust használhatunk a legtöbb resultset objektumot ad vissza sok metódus bonyolult névvel rendelkezik, célszerű

olyan metódusokat használni melyek ezeket megadják

Page 35: Fejlett Programoz ási Technikák 2

35

Fejlett Programozási Technológiák 2.

Metadata – Általános információk getURL getUserName getDatabaseProductVersion,

getDriverMajorVersion and getDriverMinorVersion getSchemaTerm, getCatalogTerm and

getProcedureTerm nullsAreSortedHigh and nullsAreSortedLow usesLocalFiles and usesLocalFilePerTable getSQLKeywords

Page 36: Fejlett Programoz ási Technikák 2

36

Fejlett Programozási Technológiák 2.

Metadata-Lehetőségek supportsAlterTableWithDropColumn supportsBatchUpdates supportsTableCorrelationNames supportsPositionedDelete supportsFullOuterJoins supportsStoredProcedures supportsMixedCaseQuotedIdentifiers supportsANSI92EntryLevelSQL supportsCoreSQLGrammar

Page 37: Fejlett Programoz ási Technikák 2

37

Fejlett Programozási Technológiák 2.

Metadata - korlátok getMaxRowSize getMaxStatementLength getMaxTablesInSelect getMaxConnections getMaxCharLiteralLength getMaxColumnsInTable

Page 38: Fejlett Programoz ási Technikák 2

38

Fejlett Programozási Technológiák 2.

Statement paraméter nélküli kifejezések egyszerű SQL kifejezések létrehozására használandó executeQuery (

egyszerű lekérdezés Select * from t executeUpdate

INSERT UPDATE DELETE CREATE TABLE DROP TABLE a visszatérési értéke egy integer mely az érintett sorok számát adja meg

egyébként 0 execute

olyan esetekben használják amikor több mint egy válasz érkezikConnection con = DriverManager.getConnection(url, "sunny", ""); Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2");

Page 39: Fejlett Programoz ási Technikák 2

39

Fejlett Programozási Technológiák 2.

Példa: ExecuteStatement stmt = conn.createStatement();boolean b = stmt.execute(sql);if (b == true) {// b is true if a ResultSet is returnedResultSet rs;rs = stmt.getResultSet();while (rs.next()) {...}} else {// b is false if an update count is returnedint rows = stmt.getUpdateCount();if (rows > 0) {...}}

Page 40: Fejlett Programoz ási Technikák 2

40

Fejlett Programozási Technológiák 2.

Automatikusan Generált Kulcsok Statement.RETURN_GENERATEDKEYS getGeneratedKeys();

Statement stmt = conn.createStatement();int rows = stmt.executeUpdate("INSERT INTO ORDERS " +"(ISBN, CUSTOMERID) " +"VALUES (195123018, ’BILLG’)",Statement.RETURN_GENERATED_KEYS);ResultSet rs = stmt.getGeneratedKeys();boolean b = rs.next();if (b == true) {// retrieve the new key value...}

Page 41: Fejlett Programoz ási Technikák 2

41

Fejlett Programozási Technológiák 2.

Prepared Statement a Statement alosztálya előre fordított SQL kifejezések egy-vagy több paramétere lehet (IN) több metódust használhatunk az IN paraméterek beállítására sokkal hatékonyabb lehet mint a Statement objektum (előre

fordított) gyakran használt kifejezések létrehozására használandó többször futtatható, a beállított paraméterek megmaradnak

Page 42: Fejlett Programoz ási Technikák 2

42

Fejlett Programozási Technológiák 2.

PéldaConnection con = DriverManager.getConnection(

"jdbc:my_subprotocol:my_subname");con.setTransactionIsolation(TRANSACTION_READ_COMMITTED);PreparedStatement pstmt = con.prepareStatement(

"SELECT EMP_NO, SALARY FROM EMPLOYEES WHERE EMP_NO = ?",ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

pstmt.setFetchSize(25);pstmt.setString(1, "1000010");ResultSet rs3 = pstmt.executeQuery();

pstmt.setString(1, "Hi"); for (int i = 0; i < 10; i++) {

pstmt.setInt(2, i);int rowCount = pstmt.executeUpdate();

} setNull

Page 43: Fejlett Programoz ási Technikák 2

43

Fejlett Programozási Technológiák 2.

Statement pooling

Page 44: Fejlett Programoz ási Technikák 2

44

Fejlett Programozási Technológiák 2.

Callable Statement segítségével SQL tárolt eljárásokat futathatunk supportsStoredProcedures() getProcedures() {? = call procedure_name[(?, ?, ...)]} IN paraméterek OUT paraméterek

regisztrálni kell nincs külön lehetőség nagy adatok kezelésére

INOUT paraméterek

Page 45: Fejlett Programoz ási Technikák 2

45

Fejlett Programozási Technológiák 2.

Példa INCallableStatement cstmt = con.prepareCall(

"{call updatePrices(?, ?)}");cstmt.setString(1, "Colombian");cstmt.setFloat(2, 8.49f);cstmt.addBatch();

cstmt.setString(1, "Colombian_Decaf");cstmt.setFloat(2, 9.49f);cstmt.addBatch();int [] updateCounts = cstmt.executeBatch();

Page 46: Fejlett Programoz ási Technikák 2

46

Fejlett Programozási Technológiák 2.

Példa OUTCallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");cstmt.registerOutParameter(1, java.sql.Types.TINYINT);cstmt.registerOutParameter(2, java.sql.Types.DECIMAL);ResultSet rs = cstmt.executeQuery();// . . . byte x = cstmt.getByte(1);java.math.BigDecimal n = cstmt.getBigDecimal(2);

Page 47: Fejlett Programoz ási Technikák 2

47

Fejlett Programozási Technológiák 2.

Példa INOUTCallableStatement cstmt = con.prepareCall("{call reviseTotal(?)}");

cstmt.setByte(1, (byte)25);

cstmt.registerOutParameter(1, java.sql.Types.TINYINT);

cstmt.executeUpdate();

byte x = cstmt.getByte(1);

Page 48: Fejlett Programoz ási Technikák 2

48

Fejlett Programozási Technológiák 2.

Result Set Az előző három objektum eredménye Alapesetben nem írható és nem görgethető (csak egyszer lehet

rajta végigmenni) A JDBC 2.0 API ezeket lehetővé teszi Nem minden meghajtó képes erre (pl.: postgresql) getXXX(név vagy sorszám) metódusok (select a, select * ) getMetaData updateRow(), insertRow(), deleteRow(), refreshRow() JDBC 2.0

previous first last absolute relative afterLast beforeFirst

Page 49: Fejlett Programoz ási Technikák 2

49

Fejlett Programozási Technológiák 2.

Meta Data:ResultSet rs = stmt.executeQuery(sqlString);

ResultSetMetaData rsmd = rs.getMetaData();

int colType [] = new int[rsmd.getColumnCount()];

for (int idx = 0, int col = 1; idx < colType.length; idx++, col++)

colType[idx] = rsmd.getColumnType(col);

Page 50: Fejlett Programoz ási Technikák 2

50

Fejlett Programozási Technológiák 2.

Result set (JDBC 3.0) Kurzor:

TYPE_FORWARD_ONLY TYPE_SCROLL_INSENSITIVE TYPE_SCROLL_SENSITIVE

Párhuzamosság CONCUR_READ_ONLY CONCUR_UPDATABLE

Tarthatóság: HOLD_CURSORS_OVER_COMMIT CLOSE_CURSORS_OVER_COMMIT

Használata:Connection conn = ds.getConnection(user, passwd);Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY,ResultSet.CLOSE_CURSORS_AT_COMMIT);ResultSet rs = stmt.executeQuery(“select author, title, isbn from booklist”);

Page 51: Fejlett Programoz ási Technikák 2

51

Fejlett Programozási Technológiák 2.

Result set updateXXX CONCUR_UPDATABLE SQL parancsok nélül módosíthatjuk a rekordokat akkor működnek ha :

van elsődleges kulcs a lekérdezés nem tartalmaz JOIN ill. GROUP BY kifejezést

int n = rs.getInt(3); // n=5. . .rs.updateInt(3, 88); int n = rs.getInt(3); // n = 88

rs.absolute(4);rs.updateString(2, "321 Kasten");rs.updateFloat(3, 10101.0f);rs.updateRow();

Page 52: Fejlett Programoz ási Technikák 2

52

Fejlett Programozási Technológiák 2.

Result set insert, deleters.first();rs.deleteRow();

rs.moveToInsertRow();rs.updateObject(1, myArray);rs.updateInt(2, 3857);rs.updateString(3, "Mysteries");rs.insertRow();rs.first();

Page 53: Fejlett Programoz ási Technikák 2

53

Fejlett Programozási Technológiák 2.

Példajava.sql.Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");

while (rs.next()) {

int i = rs.getInt("a");

String s = rs.getString("b");

float f = rs.getFloat("c");

System.out.println("ROW = " + i + " " + s + " " + f);

}

Page 54: Fejlett Programoz ási Technikák 2

54

Fejlett Programozási Technológiák 2.

2. Példa rs.beforeFirst();while (rs.next()) {

System.out.println(rs.getString("EMP_NO") +" " + rs.getFloat("SALARY");

}-----------------------------------------------------------------rs.afterLast();while (rs.previous()) {

System.out.println(rs.getString("EMP_NO") +" " + rs.getFloat("SALARY");

}-----------------------------------------------------------------ResultSet rs = stmt.executeQuery(

"SELECT LAST_NAME, FIRST_NAME FROM EMPLOYEES");rs.last();int numberOfRows = rs.getRow();System.out.println("XYZ, Inc. has " + numberOfRows + " employees");rs.beforeFirst();while (next()) {

. . .}

Page 55: Fejlett Programoz ási Technikák 2

55

Fejlett Programozási Technológiák 2.

Tranzakciók bankbetét átutalás

A helyen csökken B helyen növekszik

egy tranzakció egy vagy több kifejezést tartalmaz melyek csak együtt hajtódnak végre (egyébként visszaállítja az eredeti állapotot - rollback)

a kapcsolat objektum auto-commit módban van azaz minden egyes kifejezést külön külön hajt végre

ha ez le van tiltva akkor a tranzakció addig nem ér véget amíg a commit vagy rollback metódusokat meg nem hívják

a tranzakció kezdete az auto-commit mód letiltásával kezdődik a JDBC 2.0 API segítségével elosztott tranzakciókat is

végrehajthatunk JDBC 3.0 SavePoint

Page 56: Fejlett Programoz ási Technikák 2

56

Fejlett Programozási Technológiák 2.

A tranzakciók elkülönítése piszkos olvasás (dirty read)

a tranzakció írásai a commit esemény előtt is olvashatóak azaz valaki olvashatja azt az adatot amit esetleg később visszavonnak

(rollback) a többi tranzakció nem konzisztens adatok alapján működhet

megismételhetetlen olvasás (nonrepeatable read) A tranzakció olvas egy sort B tranzakció megváltoztatja A tranzakció újra olvassa ugyanazt a megváltozott sort

fantom olvasás (phantom read) A tranzakció olvassa az összes sort amely a WHERE feltételben van B tranzakció beilleszt egy sort amely ugyanennek a feltételnek fele meg A tranzakció újraértékeli a kifejezést és beveszi a fantom sort is

Page 57: Fejlett Programoz ási Technikák 2

57

Fejlett Programozási Technológiák 2.

A tranzakciók elkülönítési szintjei 5 szint:

TRANSACTION_NONE nincs tranzakció kezelés

TRANSACTION_READ_UNCOMMITTED a nem végleges módosítások láthatóak (dirty read, …)

TRANSACTION_READ_COMMITTED csak a végleges adatok olvashatóak (nincs dirty read, de van másik kettő)

TRANSACTION_REPEATABLE_READ a másik tranzakció nem is írhatja az A tranzakció által érintett sorokat

(phantom még lehet) TRANSACTION_SERIALIZABLE

minden problémát kiküszöböl con.setTransactionIsolation(TRANSACTION_READ_UNCOMM

ITTED); magasabb elkülönítés lassabb működés (sok zárolás,

egymásra várnak …) a fentiek természetesen adatbázis-kezelő függőek (MySQL –

gyenge tranzakció kezelés)

Page 58: Fejlett Programoz ási Technikák 2

58

Fejlett Programozási Technológiák 2. con.setAutoCommit( false ); bError = false; try { for( ... ) {

if( bError ) { break; } stmt.executeUpdate( ... ); } if( bError ) { con.rollback(); } else { con.commit(); } } / catch ( SQLException SQLe) { con.rollback(); ... } // end catch catch ( Exception e) { con.rollback(); ... } // end catch

Page 59: Fejlett Programoz ási Technikák 2

59

Fejlett Programozási Technológiák 2.

Tranzakciók: SavePoint DatabaseMetaData.supportsSavepoints

Statement stmt = conn.createStatement();int rows = stmt.executeUpdate("INSERT INTO TAB1 (COL1) VALUES " +"(’FIRST’)");// set savepointSavepoint svpt1 = conn.setSavepoint("SAVEPOINT_1");rows = stmt.executeUpdate("INSERT INTO TAB1 (COL1) " +"VALUES (’SECOND’)");...conn.rollback(svpt1);...conn.commit();

Connection.releaseSavepoint

Page 60: Fejlett Programoz ási Technikák 2

60

Fejlett Programozási Technológiák 2.

Elosztott tranzakciók

Tranzakció kezelő (JTA) JDBC meghajtó:

XADataSource XAConnection XAResource

Alkalmazás szerver

Page 61: Fejlett Programoz ási Technikák 2

61

Fejlett Programozási Technológiák 2.

XADataSource, XAConnection javax.sql XAConnection -> PooledConnection:

public interface XAConnection extends PooledConnection {javax.transaction.xa.XAResource getXAResource()throws SQLException;}

XADataSource:public interface XADataSource {XAConnection getXAConnection() throws SQLException;XAConnection getXAConnection(String user,String password) throws SQLException;...

Page 62: Fejlett Programoz ási Technikák 2

62

Fejlett Programozási Technológiák 2.

PéldaContext ctx = new InitialContext();

DataSource ds = (DataSource)ctx.lookup(“jdbc/inventory”);

Connection con = ds.getConnection(“myID”,“mypasswd”);

// Assume xads is a driver’s implementation of XADataSource

XADataSource xads = (XADataSource)ctx.lookup(“jdbc/xa/" + "inventory_xa”);

// xacon implements XAConnection

XAConnection xacon = xads.getXAConnection(“myID”, “mypasswd”);

// Get a logical connection to pass back up to the application

Connection con = xacon.getConnection();

Page 63: Fejlett Programoz ási Technikák 2

63

Fejlett Programozási Technológiák 2.

XAResource JTA - X/Open Group XA interface XAConnection.getXAResource – egy tranzakció lehet Az alkalmazás szerver ezt adja át a tranzakció menedzsernek Two phase commit Fontosabb metódusok (xid):

start end prepare commit rollback

Page 64: Fejlett Programoz ási Technikák 2

64

Fejlett Programozási Technológiák 2.

Példajavax.transaction.xa.XAResource resourceA = XAConA.getXAResource();javax.transaction.xa.XAResource resourceB = XAConB.getXAResource();…resourceA.start(xid, javax.transaction.xa.TMNOFLAGS);resourceA.end(xid, javax.transaction.xa.TMSUCCESS);resourceB.start(xid, javax.transaction.xa.TMNOFLAGS);resourceB.end(xid, javax.transaction.xa.TMSUCCESS);…resourceA.prepare(xid);resourceB.prepare(xid);…resourceA.commit(xid, false);resourceB.commit(xid, false);…resourceA.rollback(xid);resourceB.rollback(xid);

Page 65: Fejlett Programoz ási Technikák 2

65

Fejlett Programozási Technológiák 2.

Nagy adatmennyiség JDBC 3.0 SQL 3

getXXX, setXXX Array BLOB (Binary Large Object) CLOB (Character Large Object)

getCharacterStream

JDBC 1.0LONGVARBINARY LONGVARCHAR

getBinaryStream getAsciiStream getUnicodeStream

locator

Page 66: Fejlett Programoz ási Technikák 2

66

Fejlett Programozási Technológiák 2.

Példajava.sql.Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery("SELECT x FROM Table2");// Now retrieve the column 1 results in 4 K chunks:byte [] buff = new byte[4096];while (rs.next()) {

Clob cdata = rs. getCLOB(1);java.io.InputStream fin = cdata.getAsciiStream();for (;;) {

int size = fin.read(buff);if (size == -1) {

break;}output.write(buff, 0, size);

}}

Page 67: Fejlett Programoz ási Technikák 2

67

Fejlett Programozási Technológiák 2.

NULL érték típustól függően kezeli

null - karakterekre0 - számokra false - boolean

int n = rs.getInt(3);

boolean b = rs.wasNull();

Page 68: Fejlett Programoz ási Technikák 2

68

Fejlett Programozási Technológiák 2.

Kötegelt utasítások

növeli a teljesítményt addBatch()

// turn off autocommitcon.setAutoCommit(false);Statement stmt = con.createStatement();stmt.addBatch("INSERT INTO employees VALUES (1000, 'Joe

Jones')");stmt.addBatch("INSERT INTO departments VALUES (260, 'Shoe')");stmt.addBatch("INSERT INTO emp_dept VALUES (1000, 260)");// submit a batch of update commands for executionint[] updateCounts = stmt.executeBatch();

Page 69: Fejlett Programoz ási Technikák 2

69

Fejlett Programozási Technológiák 2.

Függvények használata getNumericFunctions() getStringFunctions() getSystemFunctions() getTimeDateFunctions() supportsConvert() getXXXFunctions()

UPDATE myTableSET circularVal = squared * { fn PI() }...

Page 70: Fejlett Programoz ási Technikák 2

70

Fejlett Programozási Technológiák 2.

A mai előadás tartalma: Java Applet

Felépítése Tulajdonságai Paraméterátadás

JDBC Típusai Kapcsolat típusok Statement objektumok RecordSet Tranzakciók

Page 71: Fejlett Programoz ási Technikák 2

71

Fejlett Programozási Technológiák 2.

A következő előadás tartalma: Számítógépes biztonság Jáva és a biztonság

Biztonsági architektúra

Titkosító architektúra JCE JAAS JSSE GSSE