Datová vrstva informačního systému Miroslav Beneš Obsah přednášky JDBC architektura ovladače použití ODBC architektura ovladače a zdroje dat použití PHP & MySQL Datová vrstva informačního systému 2 Java Database Connectivity JDBC JDBC rozhraní pro unifikovaný přístup k datům použití i mimo databáze data ve formě tabulek (CSV, XLS,...) ovladače jsou k dispozici pro většinu databázových systémů inspirováno rozhraním ODBC objektové rozhraní možnost spolupráce s ODBC Datová vrstva informačního systému 4 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 1
Architektura JDBC Aplikační kód JDBC API Ovladač JDBC DB API Databáze java.sql.* javax.sql.* Architektura JDBC ResultSet ResultSet ResultSet Statement PreparedStatement CallableStatement Aplikace Connection DriverManager Oracle driver JDBC-ODBC bridge Sybase driver ODBC driver Datová vrstva informačního systému 5 Datová vrstva informačního systému 6 JDBC ovladač zprostředkování komunikace aplikace s konkrétním typem databáze implementován obvykle výrobcem databáze dotazovací jazyk SQL předá se databázi ovladač vyhodnotí přímo reprezentován specifickou třídou sun.jdbc.odbc.jdbcodbcdriver com.mysql.jdbc.driver Typy JDBC ovladačů Typ 1: využívá ODBC (přes JDBC-ODBC bridge) obtížně konfigurovatelné Typ 2: komunikace s nativním ovladačem Typ 3: komunikuje s centrálním serverem (Network Server) síťovým protokolem pro rozsáhlé heterogenní systémy Typ 4: založen čistě na jazyce Java přímý přístup do databáze Datová vrstva informačního systému 7 Datová vrstva informačního systému 8 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 2
Registrace ovladače konkrétní ovladač je pevně spojen s aplikací new com.mysql.jdbc.driver() výběr ovladače za běhu aplikace String drivername = com.mysql.jdbc.driver ; try { Class.forName(driverName); catch( ClassNotFoundException e) { // obsluha výjimky Identifikace spojení jdbc:driver:database jdbc:odbc:datasource;attr=value; Příklad: jdbc:mysql://localhost/dais3?user=dais3 &password=dais3 &useunicode=true &characterencoding=iso-8859-2 Datová vrstva informačního systému 9 Datová vrstva informačního systému 10 Připojení k databázi Connection con = DriverManager.getConnection( url, uživatel, heslo ) 1. DriverManager se dotáže všech registrovaných ovladačů 2. Rozpozná-li ovladač své url, vrátí objekt Connection Objekt Statement Reprezentuje SQL příkaz: Statement PreparedStatement CallableStatement Vytvoření instance příkazu: Statement stmt = con.createstatement(); Provedení příkazu ResultSet rs = stmt.executequery( SELECT * FROM t ); int num = stmt.executeupdate( DELETE * FROM t ); Datová vrstva informačního systému 11 Datová vrstva informačního systému 12 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 3
Objekt ResultSet Reprezentuje výsledek dotazu SELECT Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery( SELECT * FROM uzivatel ); while( rs.next() ) { String login = rs.getstring( login ); String jmeno = rs.getstring( jmeno ); rs.close(); stmt.close(); Ošetření chyb public class SQLException extends Exception try { catch( SQLException e) { while( e!= null ) { System.out.println(e.getMessage()); System.out.println(e.getSQLState()); System.out.println(e.getErrorCode()); e = e.getnextexception(); Datová vrstva informačního systému 13 Datová vrstva informačního systému 14 Parametrizované příkazy Možnost předkompilace opakované provedení příkazu Parametry označené znakem? indexované od 1 INSERT INTO uzivatel(login,jmeno) VALUES(?,?) Parametrizované příkazy PreparedStatement pstmt = con.preparestatement( INSERT VALUES(?,?) ); pstmt.clearparameters(); pstmt.setstring(1, wal007 ); pstmt.setnull(2, Types.VARCHAR); Datová vrstva informačního systému 15 Datová vrstva informačního systému 16 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 4
Transakce try { con.setautocommit(false); stmt.executeupdate( ); con.commit(); catch( SQLException e ) { con.rollback(); Open Database Connectivity ODBC Datová vrstva informačního systému 17 ODBC Specifikace API pro databáze Nezávislé na databázi a jazyce Databázově závislé ovladače Správce ovladačů Driver Manager Založeno na specifikaci X/Open a ISO: SQL Call Level Interface (SQL/CLI) Architektura ODBC Aplikace ODBC API Správce ovladačů ODBC API (SPI) Ovladač Ovladač Ovladač Zdroj dat Zdroj dat Zdroj dat Datová vrstva informačního systému 19 Datová vrstva informačního systému 20 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 5
Typy ovladačů Ovladače založené na souborech přímý přístup k datům (ovladač = zdroj dat) analýza a interpretace dotazů dbase Ovladače založené na SŘBD dotazy se předávají ke zpracování SŘBD transformace ODBC SQL na konkrétní dialekt SQL Typy zdrojů dat Systémové datové zdroje informace jsou uloženy přímo v systému (registry) identifikovány jménem zdroje Souborové datové zdroje informace jsou uloženy v samostatném souboru (*.dsn) možnost sdílení, přenosu na jiné počítače identifikovány jménem souboru Datová vrstva informačního systému 21 Datová vrstva informačního systému 22 Příklad systémového zdroje [HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\Dais3] "Driver"="C:\\WINDOWS\\System32\\myodbc.dll" "Description"="Data Source for DAIS3" "Database"="dais3" "Server"="localhost" "User"="dais3" "Password"="dais3" "Port"="" "Option"="0" "Stmt"="" Postup 1. Připojení k datovému zdroji 2. Inicializace 3. Vytvoření a provedení dotazu 4. Získání výsledku 5. Ukončení transakce 6. Odpojení od datového zdroje Datová vrstva informačního systému 23 Datová vrstva informačního systému 24 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 6
Připojení k datovému zdroji // Alokace zástupce pro správce ovladačů ODBC SQLHENV henv; SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hEnv); // Deklarace požadované verze ODBC SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0); // Alokace zástupce pro databázové připojení SQLHDBC hdbc1; SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); // Připojení k databázi SQLConnect(hDbc, database, SQL_NTS, user, SQL_NTS, password, SQL_NTS); // jméno zdroje dat // uživatel // heslo Inicializace aplikace // Získání informací o SŘBD, ovladači,... SQLCHAR dbms_name[40]; SQLGetInfo(hDbc, SQL_DBMS_NAME, dbms_name, sizeof(dbms_name), NULL); // Alokace zástupce pro příkaz (dotaz) SQLHANDLE hstmt; SQLAllocHandle(SQL_HANDLE_STMT,hDbc,&hStmt); Datová vrstva informačního systému 25 Datová vrstva informačního systému 26 Vytvoření a provedení dotazu Přímé provedení dotazu SQLCHAR query[] = INSERT INTO ; SQLExecDirect(hStmt, query, SQL_NTS); Připravený dotaz SQLCHAR* query = SELECT jmeno FROM uziv WHERE login=? ; SQLPrepare(hstmt, query, SQL_NTS); SQLBindParameter(hStmt, 1, ); SQLExecute(hStmt); Získání výsledku // Svázání proměnných s výsledkem dotazu SQLCHAR jmeno[30]; SQLINTEGER jmeno_ind; SQLBindCol(hStmt, 1, SQL_C_CHAR, jmeno, sizeof(jmeno), &jmeno_ind); // Čtení výsledků while ( SQLFetch(hStmt)!= SQL_NO_DATA ) { if( jmeno_ind!= SQL_NULL_DATA ) cout << jmeno; Datová vrstva informačního systému 27 Datová vrstva informačního systému 28 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 7
Odpojení od zdroje dat // uvolnění zástupce příkazu SQLFreeHandle(SQL_HANDLE_STMT, hstmt); // odpojení od databáze SQLDisconnect(hDbc); PHP & MySQL // uvolnění zástupce příkazu SQLFreeHandle(SQL_HANDLE_DBC, hdbc); // uvolnění zástupce prostředí SQLFreeHandle(SQL_HANDLE_ENV, henv); Datová vrstva informačního systému 29 Přístup k databázím z PHP Modulární struktura sdílené knihovny (.dll,.so) Podpora mnoha databázových rozhraní ODBC MySQL, PostgreSQL Microsoft SQL Server Oracle, Sybase, Informix dbase Databáze MySQL MySQL Server Databáze Tabulky Datová vrstva informačního systému 31 Datová vrstva informačního systému 32 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 8
Správa databáze Standardní klienti mysql mysqladmin mysqldump Aplikace s grafickým rozhraním MySQL Control Center WinMySQLAdmin Aplikace s WWW rozhraním phpmyadmin Připojení k databázi // Připojení k serveru + autentizace mysql_connect("localhost", "uziv", "heslo"); // Výběr databáze mysql_select_db( databaze"); Datová vrstva informačního systému 33 Datová vrstva informačního systému 34 Provedení dotazu $query = SELECT login,jmeno FROM uziv ; $h = mysql_query($query); while( $r = mysql_fetch_object($h) ) { echo $r->login: $r->jmeno\n ; mysql_free_result($h); Provedení dotazu $h = mysql_query($query); $n = mysql_num_rows($h); for( $i = 0; $i < $n; $i++) { $r = mysql_fetch_array($h); echo <tr>\n ; foreach( $r as $val ) echo \t<td>$val</td>\n ; echo </tr>\n ; mysql_free_result($h); Datová vrstva informačního systému 35 Datová vrstva informačního systému 36 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 9
Další zdroje informací ODBC www.microsoft.com/data/odbc/ www.unixodbc.org/ JDBC java.sun.com/products/jdbc PHP&MySQL www.php.net www.mysql.com www.phpmyadmin.net Datová vrstva informačního systému 37 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 10