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
Architektura JDBC Aplikační kód JDBC API Ovladač JDBC java.sql.* javax.sql.* DB API Databáze Datová vrstva informačního systému 5
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 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 Datová vrstva informačního systému 7
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 8
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 } Datová vrstva informačního systému 9
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 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 Datová vrstva informačního systému 11
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 12
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(); Datová vrstva informačního systému 13
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 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(?,?) Datová vrstva informačního systému 15
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 16
Transakce try { con.setautocommit(false); stmt.executeupdate( ); con.commit(); } catch( SQLException e ) { con.rollback(); } Datová vrstva informačního systému 17
Open Database Connectivity ODBC
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) Datová vrstva informačního systému 19
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 20
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 Datová vrstva informačního systému 21
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 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"="" Datová vrstva informačního systému 23
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 24
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 Datová vrstva informačního systému 25
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 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); Datová vrstva informačního systému 27
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 28
Odpojení od zdroje dat // uvolnění zástupce příkazu SQLFreeHandle(SQL_HANDLE_STMT, hstmt); // odpojení od databáze SQLDisconnect(hDbc); // 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
PHP & MySQL
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 Datová vrstva informačního systému 31
Databáze MySQL MySQL Server Databáze Tabulky Datová vrstva informačního systému 32
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 Datová vrstva informačního systému 33
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 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); Datová vrstva informačního systému 35
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 36
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