Fejlett Programoz ási Technikák 2.

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

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

Transcript of Fejlett Programoz ási Technikák 2.

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