Tvorba informačních systémů Michal Krátký, Miroslav Beneš Katedra informatiky VŠB Technická univerzita Ostrava Tvorba informačních systémů, 2006/2007 c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 1/44
Obsah 5. Datová vrstva informačních systémů Datová vrstva,,, ADO.NET. Využití objektově-relačního modelu, SQL Injection. c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 2/44
Datová vrstva 5. Datová vrstva informačních systémů Oddělení aplikace od přístupu do databáze. Standardizovaný dotazovací jazyk - SQL. Standardizované rozhraní v programovacím jazyce - ODBC, JDBC, ADO.NET,.... c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 3/44
Standard pro přístup do databáze. SQL Access group, 1992. Umožňuje dotazovat data z libovolné aplikace bez ohledu v jaké databázi jsou uložena. Vložena mezivrstva - ovladač, překládající uživatelské dotazy na dotazy databáze. Správce ovladačů Driver Manager. ODBC-compliant. Od verze 2.0 je podporováno SQL. Standardy: X/Open a ISO: SQL Call Level Interface (SQL/CLI). c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 4/44
Architektura ODBC c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 5/44
Typy ovladačů 5. Datová vrstva informačních systémů Ovladače založené na souborech přímý přístup k datům (ovladače = 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. c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 6/44
Postup 5. Datová vrstva informačních systémů 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. c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 7/44
Připojení k datovému zdroji / / Alokace zastupce pro spravce ovladacu ODBC SQLHENV henv ; SQLAllocHandle (SQL_HANDLE_ENV, SQL_NULL_HANDLE, & henv ) ; / / Deklarace pozadovane verze ODBC SQLSetEnvAttr ( henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER ) SQL_OV_ODBC3, 0 ) ; / / Alokace zastupce pro databazove p r i p o j e n i SQLHDBC hdbc1 ; SQLAllocHandle (SQL_HANDLE_DBC, henv, & hdbc ) ; / / P r i p o j e n i k databazi, zdroj, u z i v a t e l, heslo SQLConnect ( hdbc, database, SQL_NTS, user, SQL_NTS, password, SQL_NTS ) ; c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 8/44
Inicializace aplikace / / Z i s k a n i i n f o r m a c i o SRBD, ovladaci,... SQLCHAR dbms_name [ 4 0 ] ; SQLGetInfo ( hdbc, SQL_DBMS_NAME, dbms_name, sizeof (dbms_name ), NULL ) ; / / Alokace zastupce pro p r i k a z ( dotaz ) SQLHANDLE hstmt ; SQLAllocHandle (SQL_HANDLE_STMT, hdbc, & hstmt ) ; c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 9/44
Vytvoření a provedení dotazu Přímé provedení dotazu SQLCHARquery [ ] = "INSERT INTO... " ; SQLExecDirect ( hstmt, query, SQL_NTS ) ; Přpravený dotaz SQLCHAR query = "SELECT jmeno FROM uziv WHERE l o g i n =? " ; SQLPrepare ( hstmt, query, SQL_NTS ) ; SQLBindParameter ( hstmt, 1,... ) ; SQLExecute ( hstmt ) ; c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 10/44
Získání výsledku / / Svazani promennych s vysledkem dotazu SQLCHAR jmeno [ 3 0 ] ; SQLINTEGER jmeno_ind ; SQLBindCol ( hstmt, 1, SQL_C_CHAR, jmeno, sizeof ( jmeno ), & jmeno_ind ) ; / / Cteni vysledku while ( SQLFetch ( hstmt )! = SQL_NO_DATA ) { i f ( jmeno_ind! = SQL_NULL_DATA ) cout < < jmeno ; } c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 11/44
Odpojení od zdroje dat / / Uvolneni zastupce prikazu SQLFreeHandle (SQL_HANDLE_STMT, hstmt ) ; / / Odpojeni od databaze SQLDisconnect ( hdbc ) ; / / Uvolneni zastupce prikazu SQLFreeHandle (SQL_HANDLE_DBC, hdbc ) ; / / Uvolneni zastupce p r o s t r e d i SQLFreeHandle (SQL_HANDLE_ENV, henv ) ; c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 12/44
Rozhraní pro unifikovaný přístup k datům. Použití i mimo klient-server SŘBD 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. c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 13/44
Architektura JDBC c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 14/44
Architektura JDBC c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 15/44
JDBC ovladač 5. Datová vrstva informačních systémů 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řidou: sun.jdbc.odbc.jdbcodbcdriver, com.mysql.jdbc.driver. c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 16/44
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ít ovým protokolem, pro rozsáhlé heterogenní systémy. Typ 4: založen čistě na jazyce Java, přímý přístup do databáze. c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 17/44
Registrace ovladače Konkretní ovladač je pevně spojen s aplikací new com.mysql.jdbc.driver() Výběr ovladače za běhu aplikace S t r i n g drivername = "com. mysql. jdbc. D r i v e r " ; t r y { Class. forname ( drivername ) ; } catch ( ClassNotFoundExceptione ) { / / obsluha vyjimky } c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 18/44
Identifikace spojení jdbc:driver:database jdbc:odbc:datasource;attr=value;... Příklad: jdbc:mysql://localhost/tis?user=tis &password=tis &useunicode=true &characterencoding=iso-8859-2 c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 19/44
Připojení k databázi Connection con = DriverManager.getConnection( url_string, user_string, password_string ); 1 DriverManager se dotáže všech registrovaných ovladačů. 2 Rozpozná-li ovladač své url, vrátí objekt Connection. c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 20/44
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"); c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 21/44
Objekt ResultSet Reprezentuje výsledek dotazu SELECT: Statement stmt = con. createstatement ( ) ; ResultSet rs = stmt. executequery ( "SELECT FROM u z i v a t e l " ) ; while ( rs. next ( ) ) { S t r i n g l o g i n = rs. g e t S t r i n g ( " l o g i n " ) ; S t r i n g jmeno = rs. g e t S t r i n g ( " jmeno " ) ; } rs. close ( ) ; stmt. close ( ) ; c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 22/44
Ošetření chyb 5. Datová vrstva informačních systémů public class SQLException extends Exception t r y {... } catch ( SQLException e ) { while ( e! = null ) { System. out. p r i n t l n ( e. getmessage ( ) ) ; System. out. p r i n t l n ( e. getsqlstate ( ) ) ; System. out. p r i n t l n ( e. geterrorcode ( ) ) ; e = e. getnextexception ( ) ; } } c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 23/44
Parametrizované příkazy Možnost předkompilace opakované provedení příkazu. Parametry označené znakem?, indexované od 1, INSERT INTO u z i v a t e l ( l o g i n, jmeno ) VALUES(?,? ) c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 24/44
Parametrizované příkazy PreparedStatement pstmt = con. preparestatement ( "INSERT... VALUES(?,? ) " ) ; pstmt. clearparameters ( ) ; pstmt. s e t S t r i n g ( 1, " wal007 " ) ; pstmt. s e t N u l l ( 2, Types.VARCHAR) ; c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 25/44
Transakce 5. Datová vrstva informačních systémů t r y { con. setautocommit ( false ) ; stmt. executeupdate (... ) ;... con. commit ( ) ; } catch ( SQLExceptione ) { con. r o l l b a c k ( ) ; } c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 26/44
Příklad, Oracle 1/2 DriverManager. r e g i s t e r D r i v e r (new OracleDriver ( ) ) ; S t r i n g connstr = " jdbc : o r a c l e : t h i n : @infra. cs. vsb. cz " + " :1521: d456 " ; Connection connection = DriverManager. getconnection ( connstr, " xxx ", " yyy " ) ; Statement statement = connection. createstatement ( ) ; boolean r e s u l t f = statement. execute ( "UPDATE PROBE_SET VALUE=1 WHERE ID = 2 " ) ; c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 27/44
Příklad, Oracle 2/2 ResultSet r e s u l t S e t = null ; i f ( r e s u l t f ) { r e s u l t S e t = statement. getresultset ( ) ; } i n t updatecount = statement. getupdatecount ( ) ; statement. close ( ) ; connection. close ( ) ; c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 28/44
Příklad - JSTL 5. Datová vrstva informačních systémů < s q l : setdatasource var= " datasource " d r i v e r = " org. g j t.mm. mysql. d r i v e r " u r l = " jdbc : mysql : / / l o c a l h o s t / db " user= " guest " password= " guest " / > < s q l : query datasource= " $ { datasource } "... / > c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 29/44
ADO.NET 5. Datová vrstva informačních systémů Přístup k datům na platformě.net. Možnost práce s XML daty. Propojení na další komponenty.net. c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 30/44
Architektura ADO.NET Komponenty zaměřené na obsah DataSet DataTable, DataRow, DataColumn DataRelation Komponenty pro správu Connection Command DataReader DataAdapter c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 31/44
Architektura ADO.NET c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 32/44
Komponenty ADO.NET DataReader rychlý přístup k datům, pouze čtení směrem vpřed. DataSet obsahuje kopii dat z datového zdroje, čtení a zápis dat a schématu ve formátu XML. DataAdapter abstrakce přípojení a příkazu, naplnění a synchronizace dat pro DataSet. c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 33/44
Příklad, Oracle 1/3 using System. Data ; using System. Data. O r a c l e C l i e n t ;... OracleConnection connection = new OracleConnection ( " Data Source= i n f o ; User ID=xxx ; Password=yyy " ) ; connection. Open ( ) ; OracleCommand command = new OracleCommand ( " s e l e c t from student ", connection ) ; OracleDataAdapter dbadapter = new OracleDataAdapter ( command ) ; DataSet dataset = new DataSet ( " student " ) ; c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 34/44
Příklad, Oracle 2/3 t r y { dbadapter. F i l l ( dataset ) ; } catch ( Exception exc ) { throw new Exception ( exc. Message ) ; }.... c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 35/44
Příklad, Oracle 3/3.... / / draw the r e s u l t System. Windows. Forms. DataGrid studentdatagrid= new System. Windows. Forms. DataGrid ( ) ; studentdatagrid. DataSource = dataset ; studentdatagrid. Update ( ) ;... connection. Close ( ) ; c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 36/44
Vazba ASP.NET na data <%@ Import Namespace= " System. Data. Odbc"%> <formrunat=" server " > <asp : L i s t B o x i d = " ListBox1 " runat=" server " Width= " 355px " Height= " 180px " DataTextField=" nazev " DataValueField= " i d " / > < / form> c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 37/44
Vazba ASP.NET na data void Page_Load ( Objectsender, EventArgse ) { i f (! IsPostBack ) { OdbcDataAdapter da = new OdbcDataAdapter ( "SELECT id, nazev FROM katedry ", "DSN=KatIS " ) ; System. Data. DataSet ds = newsystem. Data. DataSet ( ) ; } } da. F i l l ( ds, " Katedra " ) ; ListBox1. DataSource = ds. Tables [ " Katedra " ]. DefaultView ; ListBox1. DataBind ( ) ; c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 38/44
Využití objektově-relačního modelu Ukázka: Ukázka Oracle Spatial - rozšíření Oracle pro uložení prostorových dat. Prostorový atribut (např. tvar budovy) je uložen v atributu typu: SDO_GEOMETRY. OracleCommand command = mdatabase. CreateCommand ( ) ; S t r i n g INSERT = "INSERT INTO LayerBuilding ( " + " objid, id, f i d, area, shape ) " + " VALUES ( : objid, : id, : f i d, : area, " ; c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 39/44
Využití objektově-relačního modelu 2/2 S t r i n g shape = "SDO_GEOMETRY(2003, " + " 2065, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1), " + "SDO_ORDINATE_ARRAY( " ; command. CommandText = INSERT + shape + strpolygon + " ) ) ) " ; OracleParameter objidparam = new OracleParameter ( " o b j I d ", OracleDbType. Varchar2, 1 2 8 ) ; objidparam. Value = l a y e r B u i l d i n g. ObjId ; command. Parameters. Add ( objidparam ) ;... c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 40/44
SQL Injection 5. Datová vrstva informačních systémů S t r i n g s t r = "SELECT uniqueid FROM users WHERE username= " + userid + " AND password = " + password + " ; " ; Pokud userid=" or 1=1 --", pak: SELECT uniqueid FROM users WHERE username= OR 1 =1 AND password = heslo Získáme jedinečná čísla všech uživatelů. IS odolal? Zkuste: OR a = a atp. c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 41/44
Obrana proti SQL Injection V textových vstupech nahradit apostrof dvěma apostrofy. Testování hodnot datových typů. Použít parametrizované SQL příkazy: S t r i n g strquery = "SELECT uniqueid FROM users WHERE username=@username AND password=@password " ; A využít SqlCommand a SqlParameter pro nahrazení příslušného parametru. c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 42/44
Pomocné rámce datové vrstvy Implementace rozhraní k databázi: Pro každý záznam a tabulku vytvoříte třídu, např. Student a StudentTable. Můžeme využít rámec, který některou práci udělá za nás: Hibernate, http://www.hibernate.org/, pro J2EE a.net c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 43/44
Reference 5. Datová vrstva informačních systémů ODBC http://www.microsoft.com/data/odbc/ http://www.unixodbc.org/ JDBC http://java.sun.com/products/jdbc ADO.NET http://www.msdn.com/ c 2006-2007 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 44/44