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