07.01.2013 Views

Architektury informačních systémů

Architektury informačních systémů

Architektury informačních systémů

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!