Datová vrstva informačního systému Miroslav Beneš
Obsah přednášky z
JDBC z z z
z
ODBC z z z
z
architektura ovladače použití architektura ovladače a zdroje dat použití
PHP & MySQL Datová vrstva informačního systému
2
Java Database Connectivity JDBC
JDBC z z
z
z
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 z z
objektové rozhraní možnost spolupráce s ODBC Datová vrstva informačního systému
4
Architektura JDBC Aplikační kód JDBC API
java.sql.* javax.sql.* Ovladač JDBC 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č z
z z
zprostředkování komunikace aplikace s konkrétním typem databáze implementován obvykle výrobcem databáze dotazovací jazyk – SQL z z
z
předá se databázi ovladač vyhodnotí přímo
reprezentován specifickou třídou z z
sun.jdbc.odbc.JdbcOdbcDriver com.mysql.jdbc.Driver Datová vrstva informačního systému
7
Typy JDBC ovladačů z
Typ 1: z z
z
Typ 2: z
z
komunikace s nativním ovladačem
Typ 3: z z
z
využívá ODBC (přes JDBC-ODBC bridge) obtížně konfigurovatelné
komunikuje s centrálním serverem (Network Server) síťovým protokolem pro rozsáhlé heterogenní systémy
Typ 4: z z
založen čistě na jazyce Java přímý přístup do databáze Datová vrstva informačního systému
8
Registrace ovladače z
konkrétní ovladač je pevně spojen s aplikací
new com.mysql.jdbc.Driver() z
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.
2.
DriverManager se dotáže všech registrovaných ovladačů Rozpozná-li ovladač své url, vrátí objekt Connection Datová vrstva informačního systému
11
Objekt Statement z
Reprezentuje SQL příkaz: z z z
z
Statement PreparedStatement CallableStatement
Vytvoření instance příkazu: Statement stmt = con.createStatement();
z
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 z
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 z
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 z
z
Možnost předkompilace – opakované provedení příkazu Parametry z z
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 z z z z z
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čů z
Ovladače založené na souborech z z z
z
přímý přístup k datům (ovladač = zdroj dat) analýza a interpretace dotazů dBase
Ovladače založené na SŘBD z z
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 z
Systémové datové zdroje z z
z
informace jsou uloženy přímo v systému (registry) identifikovány jménem zdroje
Souborové datové zdroje z z z
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. 2. 3. 4. 5. 6.
Připojení k datovému zdroji Inicializace Vytvoření a provedení dotazu Získání výsledku Ukončení transakce 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 z
Přímé provedení dotazu
SQLCHAR query[] = “INSERT INTO …”; SQLExecDirect(hStmt, query, SQL_NTS); z
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 z
Modulární struktura z
z
sdílené knihovny (.dll, .so)
Podpora mnoha databázových rozhraní z z z z z
ODBC MySQL, PostgreSQL Microsoft SQL Server Oracle, Sybase, Informix dBase Datová vrstva informačního systému
31
Databáze MySQL MySQL Server
Tabulky Databáze
Datová vrstva informačního systému
32
Správa databáze z
Standardní klienti z z z
z
Aplikace s grafickým rozhraním z z
z
mysql mysqladmin mysqldump MySQL Control Center WinMySQLAdmin
Aplikace s WWW rozhraním z
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 “
\n”; foreach( $r as $val ) echo “\t$val | \n”; echo “
\n”; } mysql_free_result($h);
Datová vrstva informačního systému
36
Další zdroje informací z
ODBC z z
z
JDBC z
z
www.microsoft.com/data/odbc/ www.unixodbc.org/
java.sun.com/products/jdbc
PHP & MySQL z z z
www.php.net www.mysql.com www.phpmyadmin.net Datová vrstva informačního systému
37