1 Java technológiák előadás JDBC - adatbáziskezelés ANTAL Margit Sapientia - EMTE 20102 Az előadás célja JDBC API Data Access Object (DAO) tervezési m...
´ ak ´ - 10. eload ˝ as ´ Java technologi ´ ´ JDBC - adatbaziskezel es ANTAL Margit Sapientia - EMTE
2010
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
˝ as ´ celja ´ Az eload
JDBC API ´ minta Data Access Object (DAO) tervezesi Connection Pool DataSource
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
JDBC API
´ ´ interfeszek) ´ ´ Olyan Java t´ıpusok (osztalyok es gyujtem enye ˝ ´ amelyek keretet biztos´ıtanak adatbazis alapu´ rendszerek ´ ere ´ fejlesztes Platformfuggetlen ¨ ´ ´ DBMS-fuggetlen Az adatbazisokkal kapcsolatos kod ¨
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
JDBC driver
´ ıtoje ˝ bocsajtja ´ ´ unkre. A DBMS kesz´ rendelkezes ¨ ´ ´ ´ Feladata: atalak´ ıtani a JDBC metodush´ ıvasokat nat´ıv ´ ´ adatbazis API h´ıvasokk a´ Driverek: Apache Java DB (Derby) MySql PostgreSQL Microsoft SQL server ...
´ kapcsolat Adatforras ´ ´ SQL utas´ıtasok kuld ¨ ese ´ ´ ´ SQL eredmenyek lekerdez ese ´ Java t´ıpusok koz ¨ otti ¨ lekepz ´ esek ´ SQL es ´ ´ asa ´ Adatbazis metadadatok szolgaltat ´ Kivetelek
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ kapcsolat Adatforras
T´ıpus DriverManager
Ki biztos´ıtja java.sql
´ Megjegyzes JDBC driverek managementje
Driver
Vendor
DBMS kapcsolat
Connection
Vendor
DBMS munkamenet managementje
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ ´ ´ SQL utas´ıtasok vegrehajt asa
T´ıpus Statement
Ki biztos´ıtja Vendor
´ Megjegyzes Statikus SQL parancs
PreparedStatement
Vendor
˝ Eloford´ ıtott SQL parancs
CallableStatement
Vendor
´ Tarolt ´ as ´ eljar
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
PreparedStatement vs. CallableStatement
PreparedStatement vs. CallableStatement ˝ Az eloford´ ıtott SQL parancs (PreparedStatement) ˝ objektum egy elozetesen leford´ıtott SQL parancsot ´ ´ gyorsabb, mint a (Statement) tartalmaz. Vegrehajt asa ´ objektume. ´ ´ as ´ h´ıvas ´ ara ´ alkalmas. A CallableStatement tarolt eljar
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
CallableStatement CREATE DEFINER=‘antalm‘@‘localhost‘ PROCEDURE ‘updatemissedquestions‘(IN qid INT) BEGIN declare a integer; set transaction isolation level serializable; select hanyszor into a from missedquestions where kerdesid=qid; if a>0 then update missedquestions set hanyszor=a+1 where kerdesid=qid; else insert into missedquestions (kerdesid,hanyszor) values (qid,1); end if; commit; end; ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ ´ ´ SQL eredmenyek lekerdez ese T´ıpus ResultSet
´ Java t´ıpusok koz ¨ otti ¨ lekepz ´ esek ´ SQL es
T´ıpus Date
Ki biztos´ıtja java.sql
´ Megjegyzes ´ SQL datum
Time
java.sql
SQL ido˝
TimeStamp
java.sql
˝ elyeg ´ SQL idob
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ ´ ´ Adatbazis metaadatok szolgaltat asa
T´ıpus DatabaseMetaData
Ki biztos´ıtja Vendor
´ Megjegyzes ´ ´ ok ´ Adatbazis informaci
ResultSetMetaData
Vendor
´ ok ´ ResultSet informaci
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ Kivetelek
T´ıpus SQLException
Ki biztos´ıtja java.sql
´ Megjegyzes ´ Adatbazis ´ er ´ es ´ hiba hozzaf
SQLWarning
java.sql
´ Adatbazis ´ er ´ es ´ kivetel ´ hozzaf
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
Java DB
˝ Jellemzok: ´ od ´ u´ Apache DB projekt ny´ılt forrask http:\\db.apache.org a driver: derbyclient.jar
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ ´ ıtasa ´ Adatbazis kapcsolat megvalos´ I 1
´ ıto´ ceg ´ JDBC driverenek ´ ´ oja. ´ ˝ A szall´ regisztraci Elozetesen ´ ˝ eg ´ er ´ ol ˝ (Ajanlott ´ gondoskodnunk kell a driver elerhet os ´ hozzaadni a projekthez a derbyclient.jar csomagot) Class.forName ("org.apache.derby.jdbc.ClientDriver");
´ ´ ıtasa ´ Adatbazis kapcsolat megvalos´ II String query ="SELECT * FROM student"; ResultSet rs = stmt.executeQuery(query); ´ ´ vegz ´ unk ´ Ha modos´ ıtast ¨ az adatbazison: String query = "DELETE FROM student where id in(2,4,6)"; int nrRecords = stmt.executeUpdate(query); 5
´ ´ Eredmenyek feldolgozasa List<Student> studentList = new LinkedList<student>(); while( results.next() ){ String SID = results.getInt( 1 ); String name = results.getString(2); String address = results.getString(3); Student item = new Student( SID, name, address); ANTAL Margit
´ ´ URL hatarozza meg az adatbazis t´ıpust Szintaxis: jdbc:alprotokoll:alnev ´ alprotokoll: adatbazis-kezel o˝ fugg ¨ o˝ mechanizmus ´ az alprotokoll hatarozza ´ ´ at ´ alnev: meg ennek formaj jdbc:derby://localhost:1527/student jdbc:odbc:images
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ ag ´ novel ¨ ´ Hordozhatos ese
´ Az adatbazisf ugg ¨ o˝ adatokat helyezzuk ¨ el egy ´ ajlban: ´ tulajdonsagf jdbcDriver = org.apache.derby.jdbc.ClientDriver jdbcURL = jdbc:derby://localhost:1527/student jdbcUser = public jdbcPassword = public
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ ¨ ese ´ ´ ol ´ Tulajdonsagok betolt fajlb
Properties p = new Properties(); p.load(new FileInputStream("database")); String jdbcDriver=p.getProperty ("jdbcDriver"); String jdbcUrl=p.getProperty("jdbcUrl"); String jdbcUser=p.getProperty("jdbcUser"); String jdbcPassword=p.getProperty ("jdbcPassword");
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ ´ ´ Adatbazisok hasznalata webalkalmazasokban
´ modell elemeinek megtervezese. ´ Az alkalmazas ´ ese ´ adattabl ´ akra. ´ A modell elemek lekepz ´ esi ´ tervezesi ´ minta hasznalat ´ ara ´ ep ´ ul Adateler ¨ o˝ uzleti ¨ ´ szerv´ız komponensek megtervezese.
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ ese ´ ´ akra ´ Modell elemek lekepz adattabl Domain Objects Course CID name
Student *
*
price
SID name address
Registration
Database Tables <
> Course CID name price
*
<
> Registration
*
SID name address
CID SID
ANTAL Margit
<
> Student
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ esi ´ objektum tervezesi ´ minta(DAO) Adateler
Data Access Object ¨ ´ karbantartas ´ at, ´ elvalasztva ´ Megkonny´ ıti az alkalmazas az uzleti ¨ ´ az adateler ´ esi ´ logikat ´ ol. ´ logikat ´ aban ´ ´ ´ ul Altal minden egyes entitashoz (domain object) kesz ¨ egy-egy DAO ˝ ok: ¨ Elony ´ adateler ´ esi ´ logika szetv ´ alaszt ´ ´ uzleti logika es asa ¨ ´ esi ´ logika ujrafelhaszn ´ az adateler alhat o´ ´
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ DAO alkalmazasa
Student
Hallgato Feliratkozas eloadasra
RegisterService
StudentDAO
getCourse getStudent
insert
register
Adminisztrator uj eloadas felvitele
CourseService getCourse createCourse
Course
CourseDAO retrieve insert
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ ´ ´ as ´ kritikaja ´ A hagyomanyos adatbazis kapcsolod ´ ¨ helyen is szuks ´ van Egy Java EE alkalmazasban tobb ¨ eg ´ ´ ´ adatbazis kapcsolatra: webreteg (webkontener), uzleti ¨ ´ ´ reteg (alkalmazasszerver)!!! ´ ´ Ha egy szervlet hoz letre egy adatbazis kapcsolatot, akkor ´ ´ as ´ ez a kapcsolat megmarad, viszont parhuzamos kiszolgal ´ szinkronizal ´ ast ´ igenyel. ´ ´ eseten Csak a webretegben ´ erhet o˝ el!!! ´ ˝ eg ´ egy kapcsolathalmaz (connection Egy masik lehetos ´ ´ ´ szerint lehet pool) alland o´ fenntartasa, ahonnan igeny ´ utan ´ visszatenni. A kapcsolatot kivenni, majd hasznalat ´ hatok ´ or ¨ eben ´ kapcsolathalmazt lehet a webalkalmazas ´ ´ tarolni. Ekkor viszont csak a web komponensek fernek ´ az uzleti ´ hozza, reteg komponensei viszont nem. ¨
´ ind´ıtasakor ´ ´ Az alkalmazas letrehozunk egy kapcsolathalmazt (Connection Pool). ´ komponese szuks ´ eseten ´ kivesz egy Az alkalmazas ¨ eg ´ ıtett kapcsolatot a halmazbol. ´ felep´ ´ ese ´ utan ´ visszateszi a kapcsolatot a A muveletek elvegz ˝ halmazba. ´ ´ ıthato´ az A kapcsolathalmaz (Conection Pool) merete all´ ´ ˝ ´ igenyeknek megfeleloen - ezt minden alkalmazasra be kell hangolni.
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
Connection Pool
ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ es ´ JNDI API Adatforras DataSource ˝ ´ amely egy adatbazis ´ ´ Olyan eroforr as, kapcsolathoz szuks ¨ eges ´ okat ´ informaci tartalmazza: URL driver username password JNDI - Java Naming and Directory Interface ´ ´ ´ konyvt ¨ ´ ´ ehez ´ ´ API. Nevad ashoz es arak eler hasznalt ´ ´ ak ´ a komponensek Enterprise alkalmazasok hasznalj ´ es ´ ere. ´ eler ˝ e´ teszi a komponensek regisztraci ´ oj ´ at ´ es ´ eler ´ es ´ et. ´ Lehetov ´ Minden Java EE alkalmazasszerver biztos´ıtja ezt a ´ ast. ´ szolgaltat (a Tomcat is !!!) ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ hasznalat ´ anak ´ ˝ Adatforras elonyei
Kevesebb munka - Nem kell meg´ırni a ”connection pool” mechanizmust ´ ag ´ - barmely ´ ´ Hordozhatos alkalmazasszerveren fog ¨ muk ˝ odni
´ hasznalata ´ Adatforras -(1) public class DAO { protected DataSource datasource; public DAO(){ try { Context ctx = new InitialContext(); if( ctx == null ) throw new RuntimeException ("JNDI Context coluld not be found"); datasource = (DataSource) ctx.lookup("jdbc/distedudb"); } catch (Exception e) { e.printStackTrace(); } } } ANTAL Margit
´ ak ´ Java technologi
˝ as ´ JDBC - adatbaziskezel ´ ´ 10. eload es
´ hasznalata ´ Adatforras -(2)
public class CourseDAO extends DAO{ public CourseDAO(){ super(); } public List getCourses(){ ... Connection con=null; PreparedStatement ps = null; ResultSet rs=null; try{ con=datasource.getConnection(); ps = con.prepareStatement(GET_ALL_COURSES); ... } ... } } ANTAL Margit