Adatbázis használat a webszervernél
Web és adatbázis Webhez kell adatbázis általában relációs adatbázis SQL interface használata fontos a hatékonyság Web saját maga is használ adatbázist alkalmazásszerver a bean-ek tárolására session-változók tárolására
Két szervertípus - két használat 1. generációs szerver cgi-bin scripteket használ, PERL nyelven nincs vagy nehézkes állapotprogramozás üzleti logika és oldalgenerálás összekeverve 2. generációs web alkalmazás szerveres megoldás, Java-ban könnyű állapotprogramozás változatos kapcsolat az adatbázishoz szétválasztva az üzleti logika és a megjelenítés (pl. JSP)
Hagyományos web
Cgi-bin megoldás PERL nyelvű programozás általános DB/SQL modul használata konkrét adatbázishoz konkrét meghajtó könnyű kezelhetőség kapcsolat megnyitás utasítás megnyitás utasítás előkészület utasítás végrehajtás eredmények felhasználása utasítás lezárás kapcsolat lezárása
Előkészületek Adatbázis meghajtók beintegrálása DBI modul használata Adatbázis kapcsolat létrehozása #!/usr/bin/perl use DBI; require("../cgi-lib.pl"); my $dbase = ’dbstudent'; ... my $dbh = DBI->connect("DBI:mysql:$dbase", $user, $pwd) or die ”Nem lehet kapcsolódni: $DBI::errstr\n";
Utasításkészítés SQL utasításokat adatként konkrétan leírni paraméterek helyét ki lehet jelölni ?-lel my $sql = "select nev, beonev, tit, t20.reszlnev, t21.reszlnev from bekiat as t1, rszl as t20, rszl as t21, dolgozo, munkakor where erv = '1' AND t1.ig = ? AND t1.ig = t20.reszl AND t1.fooszt = t21.reszl AND t1.tsz = dolgozo.tsz AND t1.beo = munkakor.beo nev LIKE ? order by nev, t20.reszlnev";
A végrehajtás előkészítése Kiválasztunk egy előkészített utasítás létrehozunk egy “DBI-utasítást” my $sql = "select nev, beonev, tit, t20.reszlnev, t21.reszlnev ...; my $dbh = DBI->connect("DBI:mysql:$dbase", $user, $pwd) or die ”Nem megy a CONNECT statement: $DBI::errstr\n"; my $sth = $dbh->prepare($sql[0]) or die ”A SELECT nem megy: $dbh->errstr\n”;
Utasítás végrehajtás Konkrét paraméterek előállítása paraméterek behelyettesítése my $sql = "select nev, beonev, tit, t20.reszlnev, t21.reszlnev ...; my $dbh = ...; my $sth = $dbh->prepare($sql[0]) or die ”Az elökészítés nem megy: $dbh->errstr\n”; $sth->execute($ig, $kereso) or die ”Nem fut le a SELECT: $sth->errstr";
Eredmények kezelése Egy tábla-rekord adódik át egyszerre sorrend a SELECT-ben definiált $sth->execute($ig, $kereso) or die ”Nem fut le a SELECT: $sth->errstr"; while(@row = $sth->fetchrow_array) { print "<tr>"; print "<td bgcolor=white><i><b>$row[2] $row[0]</b></i></td>"; print "<td bgcolor=white>$row[1]</td><td bgcolor=white> $row[3], $row[4]</td></tr>\n"; }
Befejezés Két fázis utasítás lezárása kapcsolat lezárása $sth->execute($ig, $kereso) or die ”Nem fut le a SELECT: $sth->errstr"; while(@row = $sth->fetchrow_array) { ... } $sth->finish; $dbh->disconnect;
Java nyelvű alkalmazások
Adatbázis kapcsolatok Egyedi „connector” technológia IBM-IMS-hez (hierarchikus adatbázis) LotusNotes adatbázis: RDBMS módosítva Általános SQL adatbázisokhoz általános és rendszerfüggetlen
SQL adatbázis kapcsolatok Alsó szintű interface közvetlen kapcsolat: JDBC Magas interface szint adatbázis tábla és mezőszerkezet átírása Java objektumokba „mapper” program SQL-t nem is kell/lehet használni automatikus generálás off-line használat alsó szintű interface hívása
JDBC Java DataBase Connectivity 1996-ban 1.0 verzió, 1999-ben 2.0 verzió Sun/JavaSoft találmánya kiindulás az ODBC-ből CLI - X/Open Call Level Interface megvalósítva: MS-ODBC C nyelvű API nemcsak adatbázishoz: pl. Excel-hez
JDBC architektúra JDBC-API meghajtó (azaz adatbázis) független adatbázis függőség a meghajtó behívásánál legalsó szinten konkrét “driver” pl. Oracle-driver, Sybase-driver több is működhet egyszerre használat is egyértelműen leírva java.sql csomagban
JDBC meghajtók közvetlen meghajtó JDBC-ODBC bridge hálózati meghajtó távoli JDBC ODBC RDBMS RDBMS RDBMS
JDBC felhasználás az alkalmazás- szerverben Összetett példa R M I J D B C R M I J D B C O D B C JDBC --- ODBC bridge JDBC felhasználás az alkalmazás- szerverben Excel tábla Internet Excel-szerver alkalmazás szerver
Kezelési szerkezet try { // meghajtó betöltés // kapcsolat az adatbázishoz // utasítás létrehozása // eredmény létrehozása // eredmény elemzése } catch (SQLException e) { // kivételes esetek } finally { // utasítás bezárása // kapcsolat bezárása }
SQL és Java típusok Egyértelmű összerendelés mindegyikhez get/set-hozzáférés SQL tipus Java tipus metódus neve VARCHAR String getString setString NUMERIC BigDecimal getBigDecimal setBigDecimal INTEGER int getInt setInt BIGINT long getLong setLong REAL float getFloat setFloat DATE java.sql.Date getDate setDate TIMESTAMP java.sql.TimeStamp getTimeStamp setTimeStamp
Előkészületek Meghajtó betöltése Kapcsolat kapcsolati URL kapcsolat létrehozása Class.forName (“com.sybase.jdbc.SybDriver”); jdbc:<alprotokoll>:<alnév>:<gép>:<port>:<adatbázis> String dbnm = “jdbc:sybase:Tds:dbmachine:5001:dbstudent”; Connection con = DriverManager.getConnection (dbnm, “uname”, “passwd”);
Akciók az adatbázisban Keresés executeQuery paramétere a SELECT utasítás Módosítás executeUpdate UPDATE és INSERT utasításokhoz Egyebek execute COMMIT, ROLLBACK kiadására
Keresés és eredménye Keresés Eredmény Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery ( “select * from table1 where field1 like ‘e%’”); while (rs.next()) { System.out.println( rs.getString(1) + rs.getFloat(2)); } // while
Keresési formák Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery ( “select * from table1 where field1 like ‘e%’”); String namestart = i.getItem(); ResultSet rs = stmt.executeQuery ( “select * from table1 where field1 like ‘“ + namestart + “%’”); PreparedStatement pstmt = con.preparedStatement( “select * from table1 where field1 like ? AND num = ?”); pstmt.setString (1, i.getItem()+”%”); pstmt.setInt (2, 2002); ResultSet rs = stmt.executeQuery ();
Eredmények kezelése Ciklusban történik a kiírás egyes mezőkről tudni kell a típusát getXXX() interface (getInt, getByte, …) SQL-null és a Java-null nem azonos! mező sorszám while (rs.next() ){ if (!rs.wasNull()) { System.out.println(rs.getInt(2)); System.out.println(rs.getInt(“num”)); } else { ... } } mezőnév
Egyszerű példa import java.sql.*: public class SimpleJDBC { public static main (String args[]) { try { Class.forName (“com.sybase.jdbc.SybDriver”); String dbid = “jdbc:sybase:Tds:dbmachine:5001:dbstudent”; Connection con = DriverManager.getConnenction (dbid, “uname”, “passwd”); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery ( “select * from table1 where field1 like ‘e%’”); while (rs.next()) { System.out.println(rs.getString(1) + rs.getFloat(2)); } // while } cactch (Exception e) { } } }
EJB Enterprise Java Beans SQL- és JDBC-kódírás nélkül táblakezelés + tranzakciókezelés + perzisztencia + párhumazos hozzáférés + pool-ozás megoldása EJB-API meghatározza a formát EJB konténer biztosítja a futási környzetet
Middleware JDBC hívás alacsony szintűnek minősül Logikai interface eltakarja a JDBC-t általános interface-t ad Ezt a middleware-t kell a servlet-nek, webservice-nek, stb. használni!