1 / 27

JDBC = J ava D ata B ase C onnecti vity

JDBC = J ava D ata B ase C onnecti vity. Java neobsahuje žádné databáze - jen prostředky pro spojení s těmi, které splňují specifikaci JDBC. Ta má verze ( 1.0 ... 4 .0 pro Java SE 1.6 ) pro stále důmyslnější operace.

dora-nunez
Télécharger la présentation

JDBC = J ava D ata B ase C onnecti vity

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. JDBC = Java Data Base Connectivity Java neobsahuje žádné databáze - jen prostředky pro spojení stěmi, které splňují specifikaci JDBC. Ta má verze ( 1.0 ...4.0 pro Java SE 1.6 ) pro stále důmyslnější operace. Databázíse rozumí jednak vlastní data s jejich strukturou a jednak řídící software pro ukládání, vyhledávání a údržbu dat – tzv. DBMS ( Data Base Management System ). DBMS jsou velmi rozsáhlé softwarové systémy produkované specializovanými výrobci - např.: MySQL, Derby, Oracle, PointBase, Cloudscape, Sybase, IBM DB2... - jsou svolné ( compliant ) s normou JDBC některé verze – jejich vylepšování pokračuje. Soudobé DB jsou vesměs relační, ovládané standardním jazykem SQL ( Structured Query Language ) - ten využívají javské aplikace pro styk s DB. Výrobci dodávají ke svým DBMS drivery – tj.software splňující alespoň ANSI SQL-92 pro přístup DB z javských programů. Drivery lze vesměs zdarma stáhnout z Internetu - viz www.mysql.com , www.oracle.com atp. anebo jsou přikloženy např. k Netbeans s Derby. PJV13

  2. JDBC JDBC umí pracovat nejen s SQL3 a SQLJ, ale i se soubory obsahujícími tabulková data. JDBC překonává funkcionalitu MS UDA ( zahrnující OLE DB, ADO, RDS a ODBC ). Podporuje dvou- i třívrstvé modely přístupu k DB. Pro JDBC 3.0 jsou relevantní balíčky java.sql a javax.sql J2SE 1.5 přidala balíčky javax.sql.rowset, ~.serial, ~.spi J2SE 1.6 přidala interfejsy pro JDBC 4.0 PJV13

  3. JDBC Pro navázání spojení jsou třeba tyto informace: • class name JDBC driveru • URL určující datatabázi • jdbc:subprotocol: [//hostname:port/] subname • jdbc:namingService:DataSourceName [;attrName=attrValue]* • user name • password Tyto hodnoty lze získat ze: • souboru property: Properties p=new Properties(); p.load(...); String s=p.getProperty(...); • příkazové řádky • -Dname=value ... a v metodě: String s=System.getProperty(“name”); • JDBC driverů dle pořadí pomocí -Djdbc.drivers=... : ... třída DriverManager natáhne udané drivery při své inicializaci • GUI PJV13

  4. Typy driverů Driver category Java pure are preferred JDBC-NET JDBC Middleware ( Connector ) Java application using JDBC API URL Native Protocol URL JDBC driver manager URL Native API based proprietary DB protocols ( Direct ) library URL JDBC-ODBC bridge ODBC PJV13

  5. Kategorie driverů Preferované a Java-pure: • JDBC-NET – Komunikuje s mezivrstvou vhodným síťovým protokolem. • Native protocol – Překládá JDBC volání přímo do síťového protokolu DBMS, což umožňuje klientovi přímé volání DB. Pro dočasná řešení: • Native API based – Nástavba na klientské knihovně, překládá JDBC volání do volání té knihovny. • JDBC-ODBC Bridge – Připouští ODBC drivery jako JDBC drivery. Urychluje. Musí být instalován na každém klientovi. Nerobustní. PJV13

  6. Flow DriverManager Driver Driver Connection Connection Connection Statement Statement DatabaseMetaData Statement ResultSet ResultSet ResultSet PJV13

  7. java.sql Driver Driver Manager Connection Wrapper ResultSet Statement javax.sql javax.sql.rowset Driver PropertyInfo RowSet JdbcRowSet PreparedStatement javax.sql.rowset.spi Types SyncResolver CallableStatement javax.sql.rowset javax.sql.rowset CachedRowSet Joinable ParamaterMetaData javax.sql.rowset WebRowSet DatabaseMetaData FilteredRowSet ResultSetMetaData JoinRowSet javax.sql.rowset javax.sql RowSetMeta DataImpl SavePoint RowSetMetaData PJV13

  8. java.lang java.util java.sql Date Exception JDBC 2.0 Implementace viz javax.sql.rowset.serial SQL Warning Date SQL Exception Ref SQLData Time SQLOutput Array Data Truncation SQLInput Blob Timestamp Clob Struct BatchUpdate Exception JDBC 4.0 java.security Permission Serial Exception RowId NClob java.security SQLXML Basic Permission SyncFactory Exception enum SyncProvider Exception SQLPermission ClienInfo Status RowId Lifetime PJV13

  9. java.sql CommonDataSource RowSetInternal PooledConnection java.util EventObject ConnectionPool DataSource RowSetReader XAConnection XADataSource Connection Event javax.sql.rowset.spi XMLReader DataSource RowSet Event RowSetWriter firemní Derby javax.sql.rowset.spi EventListener Client DataSource XMLWriter javax.sql.rowset.spi TransactionalWriter Mysql DataSource Connection EventListener RowSetListener Oracle DataSource PJV13

  10. Třída DriverManager Nemá dostupný konstruktor, všechny metody jsou statické. Při své inicializaci se snaží natáhnout třídy zadané property jdbc.drivers= a pak kdykoli dynamicky - např.: Class.forName("oracle.jdbc.driver.OracleDriver"); Driver drv = new oracle.jdbc.driver.OracleDriver( ); jdbc.drivers = oracle.jdbc.driver.OracleDriver : abc.xzy.Driver Property se definuje pomocí –D option nebo v souboru. Při volání getConnection( ... ) hledá vhodný driver pro požadované připojení k DB. Důležité metody: • Connection getConnection( String url, String user, String password ) • Enumeration getDrivers( ) – pro výčet zaregistrovaných driverů • Driver getDriver( String url ) – pro přístup k driveru • void registerDriver( Driver driver ) - registrace • void deregisterDriver( Driver driver ) - uvolnění • void setLoginTimeout( int seconds ) – nastavení vyčkávacího času PJV13

  11. Interfejs Driver Má tyto metody: boolean acceptsURL( String url ) – předběžný test zda je spojení možné boolean jdbcCompliant( ) – test na svolnost DriverPropertyInfo[]getPropertyInfo(String url, Properties info) Connection connect( String url, Properties info ) – pokus o připojení - vrací null je-li driver nevhodný pro uvedené url. String getDatabaseProductName( ) int getMajorVersion( ) - vrací >= 1 int getMinorVersion( ) - vrací >= 0 PJV13

  12. Interfejs Connection Připojení k DB provádějí přetížené metodygetConnection( String url, ... ), třídy DriverManager která volají metodu connect( ... ) interfejsu Driver. Odpoví-li kladně, DriverManager vytvoří spojení, jinak vrátí null a vyzkouší se další driver. Nepodaří-li sespojení navázat dojde k SQLException. Drivery se probírají nejdříve podleseznamu property a pak ty v paměti již natažené. PJV13

  13. Interfejs Connection Statement createStatement( ... ) PreparedStatement prepareStatement( ... ) CallableStatement prepareCall( ... ) DatabaseMetaData getMetaData( ) String getCatalog( ) SQLWarning getWarnings( ) int getTransactionIsolation( ) void commit( ) void rollback( ) void close( ) - promptní uvolnění objektu PJV13

  14. Interfejs Statement ResultSet executeQuery( String sql ) int executeUpdate( String sql, ... )– přetížené metod boolean execute( String sql, ... ) – přetížené metody int[ ] executeBatch( ) void close( ) - promptní uvolnění objektu a i případného ResultSet void addBatch( String sql ) void clearBatch( ) SQLWarnings getWarnings( ) void clearWarning( ) getry-setry pro: • FetchSize • FetchDirection • MaxRows • MaxFieldSize • QueryTimeout PJV13

  15. Interfejs ResultSet boolean next( ), previous( ), first( ), last( ) – pro kursor boolean absolute( int row ), relative( int rows ) void beforeFirst( ), afterLast( ), moveToCurrentRow( ), moveToInsertRow( ) boolean isFirst( ), isLast( ), isBeforeFirst( ), isAfterLast( ) void deleteRow( ), insertRow( ), updateRow( ), refreshRow( ), cancelRowUpdates( ) boolean rowDeleted( ), rowInserted( ), rowUpdated( ) xxx getXXX( int colIndex ) / getXXX( String colName ) pro primitivy i objekty void updateXXX( int colIndex, ... ) /updateXXX( String colName, ... ) ResultSetMetaData getResultSetMetaData( ) int getConcurrency( ) void close( ) - promptní uvolnění objektu ( odlišně pro Blob, Clob, NClob) PJV13

  16. Interfejs ResultSetMetaData int getColumnCount( ) int getColumnType( int col ), getColumnDisplaySize( int col ), getScale( int col ),getPrecision( int col ) int isNullable( int col ) boolean isAutoIncrement( int col ), isCaseSensitive( int col ), isSigned(int col ), isSearchable( int col ), isReadOnly( int col ), isWritable( int col ), isDefinitelyWritable( int col ), isCurrency( int col ) String getCatalogueName( int col ), getSchemaName( int col ), getColumnName( int col ), getColumnClassName( int col ), getColumnLabel( int col ), getColumnTypeName( int col ), getTableName( int col ) PJV13

  17. Některé příkazy SQL DROP TABLE t1 CREATE TABLE t2 ( s1 CHAR(15 ), s2 INT ); INSERT INTO t2 VALUES ('abcd', 333 ); DELETE FROM t2 [WHERE s2 != 50 ] ; SELECT s2, s1, ... FROM t2[WHERE s2 > 123 ][ ORDER BY s1] ; SELECT * FROM t2[WHERE s2 > 123 ] [ ORDER BY s1 ] ; UPDATE t2 SET s2 = 666[WHERE s2 > 123 ] ; Klauzule WHERE může obsahovat AND OR = != < <= > >= [] – jsou metazávorky PJV13

  18. SQL vs. Java Typy • CHAR, VARCHAR, LONGVARCHAR - String • NUMERIC, DECIMAL – java.math.BigDecimal • BIT – boolean • TINYINT – byte • SMALLINT – short • INTEGER – integer • BIGINT – long • REAL – float • FLOAT, DOUBLE – double • BINARY, VARBINARY, LONGVARBINARY – byte[ ] • DATE – java.sql.Date • TIME – java.sql.Time • TIMESTAMP – java.sql.Timestamp Ve verzi 2.0 jsou již zahrnuty SQL3 typy: BLOB, CLOB, ARRAY a strukturované typy REF a objekt. obsluhované metodami getXXX, setXXX a updateXXX. PJV13

  19. Příklad pro Derby / MySQL / Oracle Před spuštěním je třeba zajistit cestu k driverům, tj.classpath musí vést ke zkompilovaným třídám driverů, které bývají uloženy v adresářích souborů typu jar či zip - viz firemní stránky. • derbyclient.jar v …\jdk1.6\db\lib\ či...\AppServer\derby\lib\ • mysql-connector-java-3.1.8a.zip ( http://dev.mysql.com/downloads ) • classes12.zip ( www.oracle.com/technology/software/index.html ) Class.forName( "org.apache.derby.jdbc.ClientDriver" ); Class.forName( "org.gjt.mm.mysql.Driver" ); Class.forName( "oracle.jdbc.driver.OracleDriver" ); String derby = "jdbc:derby://localhost:1527/samples" , mysql = "jdbc:mysql://localhost:3306/Z" , oracle = "jdbc:oracle:thin:@cs.felk.cvut.cz:1526:oracle" ; Connection c1 = DriverManager.getConnection( derby, "app", "app" ), c2 = DriverManager.getConnection( mysql, "root", "" ), c3 = DriverManager.getConnection( oracle, "scott", "tiger" ); Statement stmt=c3.createStatement( ); PJV13

  20. Příklad / pokračování stmt.executeUpdate( "CREATE TABLE z1 ( ca char(10), cb char(10))"); stmt.executeUpdate( " INSERT INTO z1 ( ca, cb ) VALUES( 'key', 'val' ) "); ResultSet rs = stmt.executeQuery( "SELECT * FROM z1" ); while( rs.next( ) ) { System.out.println ( rs.getString( "ca" ) + " " + rs.getString( "cb" )); } PJV13

  21. Interfejs DataSource Od JDBC 2.0 se doporučuje místo DriverManageru užívat DataSource, neb je portabilní s využitím JNDI ( Java Naming and Directory Interface ) import com.mysql.jdbc.jdbc2.optional.*; import oracle.jdbc.pool.*; import org.apache.derby.jdbc.*; // port DB MysqlDataSource ds1 = new MysqlDataSource( ); // 3306 MySQL OracleDataSource ds2 =new OracleDataSource( ); // 1526 Oracle ClientDataSourceds3 = newClientDataSource( );// 1527 Derby ds3.setDataBaseName( ...); ds3.setPortNumber( 1527 ); ds3.setUser( ... ); ds3.setPassword( ...); Connection c = ds3.getConnection( ); PJV13

  22. Prepared a Callable Statement PreparedStatement ps = con.prepareStatement( " UPDATE employees SET salary =?WHERE id = ? "); ps.setBigDecimal(1, 1538.00); ps.setInt(2, 777 ); CallableStatement cs = conn.prepareCall( "{call getTestData(? , ?)}"); cs.registerOutParameter(1 ,java.sql.Types.TINYINT); cs.registerOutParameter(2 ,java.sql.types.DECIMAL , 2); cs.executeUpdate(); byte x = cs.getByte(1); BigDecimal n = cs.getBigDecimal(2,2); PJV13

  23. Porovnání typů Statement PJV13

  24. Apache Derby v NetBeans 5.5 Je multiuser DB napsaná v Javě jednak embedded, jednak network, která reflektuje JDBC 4.0, SQL-99, SQL-2003. DB server musí být instalován např. na: C:\Sun\AppServer . Ve složce projektu Libraries -> Add JAR/Folder připojit derbyclient.jar . • Start DB serveru: Tools -> Java DB Database -> Start JavaDB Server Output: Server is ready to accept connection on port 1527 • Připojení DB: Runtime: Databases -> jdbc:derby://…/... [...on ...] -> RIGHT BUTTON Connect app app nebo public public • Vytvoření další DB: Tools->Java DB Database ->Create JavaDB Database ... vyplnit Connect user password Podrobně: http://www.netbeans.org/kb/50/derby-demo.html http://db.apache.org/derby/,http://wiki.netbeans.org/wiki/ PJV13

  25. Založení DB • Start Derby Database Server • Create Z database using public public - dále pro Windows: • C:\Sun\AppServer\derby>java -cp lib\derbyclient.jar;lib\derbytools.jar org.apache.derby.tools.ij ij version 10.1 • ij> connect'jdbc:derby://localhost:1527/Z;user=public;password=public'; • ij> run 'C:\...\Person.sql'; - dále pro Solaris: • /Sun/AppServer/derby>java -cp lib/derbyclient.jar:lib/derbytools.jar org.apache.derby.tools.ij ij version 10.1 • ij> connect'jdbc:derby://localhost:1527/Z;user=public;password=public'; • ij> run ‘/.../Person.sql'; PJV13

  26. Založení DB z řádky • Start the Derby Database Server • Create Z database using public public • Populate the databasein terminal window and type: • C:\Sun\AppServer\derby>java -cp lib\derbyclient.jar;lib\derbytools.jar org.apache.derby.tools.ij ij version 10.1 • ij> connect'jdbc:derby://localhost:1527/Z;user=public;password=public'; • ij> run 'C:\...\Person.sql'; -- Database name: Z --- obsah souboru Person.sql DROP TABLE Person; CREATE TABLE Person ( jmeno CHAR(15 ), tel INT ); INSERT INTO Person VALUES ( 'Dana', 3333 ); INSERT INTO Person VALUES ( 'Hana', 2222 ); INSERT INTO Person VALUES ( 'Jana', 1111 ); SELECT * FROM Person ORDER BY tel; PJV13

  27. Založení DBv Netbeans 6.0 • Tools -> Java DB Database -> Server • Windows -> Services • Tools -> Java DB Database -> CreateDatabase • Z public public somewhere OK • Services -> Databases -> jdcb:derby: … /Z Connect • Services -> Databases -> jdcb:derby: … /Z Execute Command • SQL Command: -- Database name: Z DROP TABLE Person; CREATE TABLE Person ( jmeno CHAR(15 ), tel INT ); INSERT INTO Person VALUES ( 'Dana', 3333 ); INSERT INTO Person VALUES ( 'Hana', 2222 ); INSERT INTO Person VALUES ( 'Jana', 1111 ); SELECT * FROM Person ORDER BY tel; • Run SQL ( Ctrl+Shift+E ) ikona se zeleným trojúhelníkem PJV13

More Related