Java Database Connectivity with JDBC



Podobné dokumenty
Typ 2 - připojení prostřednictvím kódu nativního klienta pro přístup k síti

Semináˇr Java X JDBC Semináˇr Java X p.1/25

Návrh a tvorba WWW stránek 1/14. PHP a databáze

Použití databází na Webu

Úvod do databází. Modelování v řízení. Ing. Petr Kalčev

Databázové systémy. Cvičení 6: SQL

4. lekce Přístup k databázi z vyššího programovacího jazyka

Java a Caché IV: Manipulace s objekty

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

Tvorba informačních systémů

Databázové a informační systémy

Datová vrstva informačního systému. Miroslav Beneš

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Databáze I. Přednáška 4

Java - výjimky. private void vstup() throws IOException {... }

Databáze. Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu. Bedřich Košata

TÉMATICKÝ OKRUH TZD, DIS a TIS

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června krovacek@students.zcu.cz

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE

Datová vrstva informačního systému. Java Database Connectivity JDBC. Obsah přednášky JDBC. Datová vrstva informačního systému

8.2 Používání a tvorba databází

Databázové systémy Cvičení 5.2

Úvod do databázových systémů

O Apache Derby detailněji. Hynek Mlnařík

Object-relational mapping (JPA, Hibernate)

Databázové systémy. Doc.Ing.Miloš Koch,CSc.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Databázové systémy II. KIV/DB2 LS 2007/2008. Zadání semestrální práce

RMI Remote Method Invocation

Semestrální práce z DAS2 a WWW

Michal Krátký, Miroslav Beneš

Úvod do programovacích jazyků (Java)

Základy informatiky. 06 Databázové systémy. Kačmařík/Szturcová/Děrgel/Rapant

Teoretické minimum z PJV

Základy informatiky. 08 Databázové systémy. Daniela Szturcová

Ukládání a vyhledávání XML dat

Úvod do databázových systémů

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

Databázové systémy. Datová integrita + základy relační algebry. 4.přednáška

Tvorba informačních systémů

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

Jazyk SQL databáze SQLite. připravil ing. petr polách

Tvorba informačních systémů

Tvorba informačních systémů

Informační systémy ve zdravotnictví. 6. cvičení

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek

OBJECT DEFINITION LANGUAGE. Jonáš Klimeš NDBI001 Dotazovací Jazyky I 2013

7. Integrita a bezpečnost dat v DBS

7. Integrita a bezpečnost dat v DBS

Databáze 2011/2012 SQL DDL (CREATE/ALTER/DROP TABLE), DML (INSERT/UPDATE/DELETE) RNDr.David Hoksza, Ph.D.

Databázové a informační systémy Jana Šarmanová

Databáze I. Přednáška 7

KIV/ZIS cvičení 5. Tomáš Potužák

STARÁ DOBRÁ JAVA A PERSISTENCE S CACHÉ

UNIVERZITA PARDUBICE Fakulta elektrotechniky a informatiky. Databázová aplikace pro evidenci mechatronických stavebnic Michal Grof

Jazyk C# - přístup k datům

KMI / TMA Tvorba mobilních aplikací. 6. seminář ZS 2016/2017 Středa 13:15-15:45

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

5. POČÍTAČOVÉ CVIČENÍ

Programování v jazyku C# II. 5.kapitola

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

KTE / ZPE Informační technologie

Kurz Databáze. Přechod na SQL server. Obsah. Vytvoření databáze. Lektor: Doc. Ing. Radim Farana, CSc.

1 Administrace systému Moduly Skupiny atributů Atributy Hodnoty atributů... 4

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Tvorba informačních systémů

Soubor jako posloupnost bytů

Databázové systémy a SQL

Jazyk C# - přístup k datům

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

B0M33BDT Technologie pro velká data. Supercvičení SQL, Python, Linux

Inovace a zkvalitnění výuky prostřednictvím ICT. Základní seznámení s MySQL Ing. Kotásek Jaroslav

Kapitola 1: Co je Microsoft Access? 27 Kapitola 2: Mnoho tváří aplikace Microsoft Access 41 Kapitola 3: Návrh databázové aplikace 75

KIV/ZIS cvičení 6. Tomáš Potužák

DPKOM_06 Dědičnost entit a zpětná volání posluchači

Michal Krátký. Tvorba informačních systémů, 2008/2009. Katedra informatiky VŠB Technická univerzita Ostrava. Tvorba informačních systémů

Oracle XML DB. Tomáš Nykodým

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

Generické programování

Jalapeño: pekelně ostrá Java persistence v Caché. Daniel Kutáč Senior Sales Engineer

Kapitola 1: Úvod. Systém pro správu databáze (Database Management Systém DBMS) Účel databázových systémů

Programování v Javě I. Leden 2008

Programování v Javě I. Únor 2009

Vytváření a použití knihoven tříd

Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Databáze SQL SELECT. David Hoksza

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 26.3.

KIV/PIA 2013 Jan Tichava

Stručný obsah. K2118.indd :15:27

Stěhování aplikací. Michal Tomek, Sales Manager

Abstraktní datové typy: zásobník

Úvod do databázových systémů

Databázový systém označuje soubor programových prostředků, které umožňují přístup k datům uloženým v databázi.

Obsah. Kapitola 1. Kapitola 2. Kapitola 3. Kapitola 4. Úvod 11. Stručný úvod do relačních databází 13. Platforma 10g 23

Transkript:

Java Database Connectivity with JDBC Obsah 1 Úvod 2 Relační-databázový model 3 Relační databaze přehled: databáze knih 4 SQL 4.1 Základní SELECT Query 4.2 klauzule WHERE 4.3 klauzule ORDER BY 4.4 Výběr dat (Merging Data) z více tabulek: INNER JOIN 4.5 příkaz INSERT 4.6 příkaz UPDATE 4.7 příkaz DELETE 5 Práce s databází pomocí JDBC 5.1 Připojení a dotazy v databázi 5.2 Dotazy v databázi (knihy) books 6 Uložené procedury 7 Objektově relační mapování 1

1 Úvod 2 Databáze Kolekce dat DBMS Systém řízení databáze (Database management system) Ukládá a řídí data SQL Relational database Structured Query Language (strukturovaný dotazovací jazyk)

1 Úvod 3 RDBMS Relational database management system Cloudscape 5.0.4 JDBC www.ibm.com/software/data/cloudscape Java Database Connectivity JDBC driver

2 Relační databázový model 4 Relační databáze Tabulka Řádky, sloupce Primární klíč jedinečná data SQL příkaz dotaz (query)

2 Relační databázový model 5 Number Name Department Salary Location 23603 Jones 413 1100 New Jersey 24568 Kerwin 413 2000 New Jersey Row 34589 Larson 642 1800 Los Angeles 35761 Myers 611 1400 Orlando 47132 Neumann 413 9000 New Jersey 78321 Stephens 611 8500 Orlando Primary key Column Obr. 1 Tabulka Employee vzorek dat

2 Relační databázový model 6 Department Location 413 New Jersey 611 Orlando 642 Los Angeles Obr. 2 Výsledek vyběru rozdílných Department a Location z tabulky Employee.

3 Relační databáze přehled: databáze books 7 Vzorek databáze books Čtyři tabulky authors, publishers, authorisbn a titles Relace (vztahy) mezi tabulkami

3 Relační databáze přehled: databáze books 8 Sloupec Popis authorid AuthorID je číselna identifikace autora v databázi. V databázi books je to celé číslo, které je definované jako autoinkrementovatelné. Tím je dosaženo jedinečnosti tohoto čísla. Sloupec představuje primární klíč. firstname Jméno autora (string). lastname Přijmení autora ( string). Obr. 3 tabulka authors databáze books. authorid firstname lastname 1 Harvey Deitel 2 Paul Deitel 3 Tem Nieto 4 Sean Santry Obr. 4 Vzorek dat z tabulky authors.

3 Relační databáze přehled: databáze books 9 Sloupec Popis publisherid PublisherID je celé autoinkrementovatelné číslo v databázi books. Sloupec je využit jako primární klíč. publishername Jméno nakladatele ( string). Obr. 5 publishers tabulka z databáze books. publisherid publishername 1 Prentice Hall 2 Prentice Hall PTG Obr. 6 Data z tabulky publishers.

3 Relační databáze přehled: databáze books 10 Sloupec Popis isbn ISBN knihy ( string). Primární klíč v tabulce. title Název knihy ( string). editionnumber Ediční číslo knihy ( integer). copyright Copyright rok knihy ( string). publisherid Číslo publisherid ( integer). Cizí klíč k tabulce publishers. imagefile Jméno souboru obsahujícího obrázek titulní strany knihy (string). price Doporučená cena knihy ( real number). Obr. 7 tabulka titles z databáze books.

3 Relační databáze přehled: databáze books 11 isbn title edition- Number right imagefile price erid 0130895725 C How to 3 2001 1 chtp3.jpg 74.95 Program 0130384747 C++ How to 4 2002 1 cpphtp4.jpg 74.95 Program 0130461342 Java Web 1 2002 1 jwsfep1.jpg 54.95 Services for Experienced Programmers 0131016210 Java How to 5 2003 1 jhtp5.jpg 74.95 Program 0130852473 The Complete 5 2002 2 javactc5.jpg 109.95 Java 2 Training Course 0130895601 Advanced Java 2 1 2002 1 advjhtp1.jpg 74.95 Platform How to Program Obr. 8 Vzorek dat z tabulky titles databáze books.

3 Relační databáze přehled: databáze books 12 Sloupec Popis authorid AuthorID je číslo, cizí klíč k tabulce authors. isbn ISBN knihy je cizí klíč k tabulce titles.. Obr. 9 tabulka authorisbn databáze books. authorid isbn authorid isbn 1 0130895725 2 0139163050 2 0130895725 3 0130829293 2 0132261197 3 0130284173 2 0130895717 3 0130284181 2 0135289106 4 0130895601 Obr. 10 Vzorek dat z tabulky authorisbn databáze books.

81 3 Relační databáze přehled: databáze books 13 authors authorid authorisbn authorid 1 titles isbn firstname lastname isbn publishers publisherid 18 8 title editionnumber copyright publisherid imagefile publishername price Obr. 11 Tabulka relací v databázi books.

4 SQL 14 SQL přehled SQL klíčová slova SQL klíčová slova Popis SELECT Dodá data z jedné nebo více tabulek. FROM Specifikuje tabulky zahrnuté do dotazu. Vyžaduje SELECT. WHERE Kritéria pro výběr který určí, kteréřádky mají být dodány zpět, rušeny nebo aktualizovány. GROUP BY Kritéria pro seskupovánířádků. ORDER BY CKritéria pro řazenířádků. INNER JOIN Výběr řádků z více tabulek. INSERT Vlořenířádků do dané tabulky. UPDATE Aktualizace řádků v dané tabulce. DELETE Rušenířádků z dané tabulky. Obr. 12 SQL klíčová slova dotazů.

4.1 Základní SELECT Query 15 Nejjednodušší forma SELECT query SELECT * FROM jménotabulky SELECT * FROM authors Vybere specifikované položky z tabulky SELECT authorid, lastname FROM authors authorid lastname 1 Deitel 2 Deitel 3 Nieto 4 Santry Obr. 13 Vzorek authorid a lastname data z authors tabulky.

4.2 Klauzule WHERE 16 určuje kritéria výběru SELECT jménosloupce1, jménosloupce2, FROM jménotabulky WHERE kritéria SELECT title, editionnumber, copyright FROM titles WHERE copyright > 2000 klauzule WHERE podmínkové operátory <, >, <=, >=, =, <> LIKE znaky wildcard % a _

4.2 Klauzule WHERE 17 title editionnumber copyright C How to Program 3 2001 C++ How to Program 4 2002 The Complete C++ Training 4 2002 Course Internet and World Wide Web 2 2002 How to Program Java How to Program 5 2003 XML How to Program 1 2001 Perl How to Program 1 2001 Advanced Java 2 Platform 1 2002 How to Program Obr. 14 Vzorek názvů s copyrights po roce after 2000 z tabulky titles.

4.2 Klauzule WHERE 18 SELECT authorid, firstname, lastname FROM authors WHERE lastname LIKE D% authorid firstname lastname 1 Harvey Deitel 2 Paul Deitel Obr. 15 Autoři jejichž přijmení začíná D z tabulky authors.

4.2 Klauzule WHERE 19 SELECT authorid, firstname, lastname FROM authors WHERE lastname LIKE _i% authorid firstname lastname 3 Tem Nieto Obr. 16 Jediný autor z tabulku authors jehož přijmení obsahuje i jako druhé písmeno.

4.3 Klauzule ORDER BY 20 Volitelná klauzule ORDER BY SELECT jménosloupce1, jménosloupce2, FROM jménotabulky ORDER BY sloupec ASC SELECT jménosloupce1, jménosloupce2, FROM jménotabulky ORDER BY sloupec DESC ORDER BY více položek ORDER BY column1 sortingorder, column2 sortingorder, Kombinace klauzulí WHERE a ORDER BY

4.3 Klauzule ORDER BY 21 SELECT authorid, firstname, lastname FROM authors ORDER BY lastname ASC authorid firstname lastname 2 Paul Deitel 1 Harvey Deitel 3 Tem Nieto 4 Sean Santry Obr. 17 Vzorek dat z tabulky authors v vzestupném pořadí podle lastname.

4.3 Klauzule ORDER BY 22 SELECT authorid, firstname, lastname FROM authors ORDER BY lastname DESC authorid firstname lastname 4 Sean Santry 3 Tem Nieto 2 Paul Deitel 1 Harvey Deitel Obr.18 Vzorek dat z tabulky authors v sestupném pořadí podle lastname.

4.3 Klauzule ORDER BY 23 SELECT authorid, firstname, lastname FROM authors ORDER BY lastname, firstname authorid firstname lastname 1 Harvey Deitel 2 Paul Deitel 3 Tem Nieto 4 Sean Santry Obr. 19 Vzorek dat tabulky authors v vzestupném pořadí podle lastname a podle firstname.

4.3 Klauzule ORDER BY 24 SELECT isbn, title, editionnumber, copyright, price FROM titles WHERE title LIKE %How to Program ORDER BY title ASC isbn title edition- copyright price Number 0130895601 Advanced Java 2 Platform How to Program 1 2002 74.95 0130895725 C How to Program 3 2001 74.95 0130384747 C++ How to Program 4 2002 74.95 0130308978 Internet and World Wide Web How to 2 2002 74.95 Program 0130284181 Perl How to Program 1 2001 74.95 0134569555 Visual Basic 6 How to Program 1 1999 74.95 0130284173 XML How to Program 1 2001 74.95 013028419x e-business and e-commerce How to 1 2001 74.95 Program Obr. 20 Vzorek knih z tabulky titles, jejíž názvy končí s textem How to Program v vzestupném pořadí řazeném. podle názvů (titulů)

4.4 Výběr dat z více tabulek Merging Data from Multiple Tables: Joining 25 Rozdělit příbuzná data do oddělených tabulek Spojit tabulky Vybrat data z více tabulek do jednoho pohledu (přehledu) INNER JOIN SELECT sloupecjméno1, sloupecjméno2, FROM tabulka1 INNER JOIN tabulka2 ON tabulka1.sloupecjméno = table2.sloupecjméno2 SELECT firstname, lastname, isbn FROM authors, authorisbn INNER JOIN authorisbn ON authors.authorid = authorisbn.authorid ORDER BY lastname, firstname

4.4 Výběr dat z více tabulek Merging Data from Multiple Tables: Joining 26 firstname lastname isbn firstname lastname isbn Harvey Deitel 0130895601 Paul Deitel 0130895717 Harvey Deitel 0130284181 Paul Deitel 0132261197 Harvey Deitel 0134569555 Paul Deitel 0130895725 Harvey Deitel 0139163050 Paul Deitel 0130829293 Harvey Deitel 0135289106 Paul Deitel 0134569555 Harvey Deitel 0130895717 Paul Deitel 0130829277 Harvey Deitel 0130284173 Tem Nieto 0130161438 Harvey Deitel 0130829293 Tem Nieto 013028419x Paul Deitel 0130852473 Sean Santry 0130895601 Obr. 21 Vzorek authors a ISBN pro knihy, které autoři napsali, autoři sjou uvedeni ve vzestupném pořadí podle lastname a firstname.

4.5 Příkaz INSERT 27 Vkládářádek do tabulky INSERT INTO tablename ( columnname1,, columnnamen ) VALUES ( value1,, valuen ) INSERT INTO authors ( firstname, lastname ) authorid VALUES firstname ( Sue, Smith lastname ) 1 Harvey Deitel 2 Paul Deitel 3 Tem Nieto 4 Sean Santry 5 Sue Smith Obr. 22 Vzorek dat z tabulky Authors po operaci INSERT.

4.6 Příkaz UPDATE 28 Modifikuje data v tabulce UPDATE tablename SET columnname1 = value1,, columnnamen = valuen WHERE criteria UPDATE authors SET lastname = Jones WHERE lastname = Smith AND firstname = Sue authorid firstname lastname 1 Harvey Deitel 2 Paul Deitel 3 Tem Nieto 4 Sean Santry 5 Sue Jones Obr. 23 Vzorek dat tabulky authors po operaci update.

4.7 Příkaz DELETE 29 Odstranění dat z tabulky DELETE FROM tablename WHERE criteria DELETE FROM authors WHERE lastname = Jones AND firstname = Sue authorid firstname lastname 1 Harvey Deitel 2 Paul Deitel 3 Tem Nieto 4 Sean Santry Obr. 24 Vzorek dat z tabulky authors po operaci DELETE.

5 Práce s databází pomocí rozhraní JDBC 30 Navázání spojení s databází Zaslání dotazů a příkazů pro aktualizaci databázi Zobrazení výsledků dotazu

Connection con = DriverManager.getConnection ( jdbc:mydriver:wombat jdbc:mydriver:wombat, mylogin mylogin, mypassword mypassword ); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery( SELECT a, b, c FROM Table1 ); while(rs.next()) ()) { int x = rs.getint( a ); String s = rs.getstring( b ); float f = rs.getfloat( c ); } Osnova Fragment kódu - názorný příklad uvedených kroků

Fragment kódu 32 vytváří instanci (objekt) od třídy DriverManager pro připojení ke driveru databáze a logování do databáze vytváří instanci od třídy Statement, která provádí zadaný dotaz SQL v databázi vytváří instanci od třídy ResultSet, která získá zpět výsledky dotazu a zobrazí je

5. Ovladače JDBC 33 Nejdůležitější součástí balíčku java.sql je kolekce jeho rozhraní tato rozhraní definují způsob, jakým aplikace s relačními DB komunikují jedním z rozhraní je i rozhraní Driver obsahuje metodu pro databázové připojení ovladač JDBC souhrnné označení skupiny souvisejících souborů, které poskytují přístup k DBMS (obsahují nejen implementaci rozhraní java.sql, ale i podpůrné třídy napojení na DB)

Typy ovladačů 1. Připojení prostřednictvím zdroje dat ODBC 34 Ovladač přemostění JDBC/ODBC (Open Database Connectivity od Microsoft) JDBC-ODBC bridge driver ODBC součást systému Windows nastavení ovládací panely, nástroje pro správu, datové zdroje ODBC není příliš robustní dostatečný pro provádění testů a jednoduchých aplikací Nevýhoda nutnost instalace ovladačů ODBC na klientském počítači (ve Windows není problém, v jiných platformách ano)

Typy ovladačů 2. Připojení prostřednictvím kódu nativního klienta pro přístup k síti Většina DB systémů poskytuje klientské rozhraní umožňující uživatelům komunikovat s DB serverem Ovladač JDBC 2. typy obsahuje jednak kód v jazyce Java, jednak nativní kód a komunikuje s klientským softwarem příslušného DB systému. Nabízí lepší výkon než ovladače typu 1, ale může ztížit distribuci aplikace na cílovém počítači musí být nainstalován rovněž klientský síťový software daného systému (Oracle) 35

Typy ovladačů 3. Připojení prostřednictvím vrstvy aplikačního serveru Tento typ ovladače napsán kompletně v Javě odesílá databázové požadavky serverové komponentě za přenos databázových požadavků do formátu vhodného pro daný databázový systém odpovědna serverová komponenta nevýhoda nutnost existence serverové komponenty výhoda možnost změny DB serveru bez ovlivnění funkcí klientského kódu 36

Typy ovladačů 4. Přímé připojení k databázovému systému 37 Ovladač napsán celý v jazyce Java komunikuje přímo s DB serverem a komu používá protokol určený právě pro tento typ serveru ve stejném balíčku vaše aplikace a ovladač nevyžaduje žádný další klientský ani serverový software

5.1 Připojení a tvorba dotazů v databázi 38 Zobrazení autorů (DisplayAuthors) Získání celé tabulky authors Zobrazení dat v JTextArea

// zobrazi obsah tabulky authors package paket1; import java.sql.connection; import java.sql.statement; import java.sql.drivermanager; import java.sql.resultset; import java.sql.resultsetmetadata; import java.sql.sqlexception; Osnova public class DisplayAuthors { // JDBC jmeno driveru a URL databaze static final String JDBC_DRIVER = "com.mysql.jdbc.driver " com.mysql.jdbc.driver"; static final String DATABASE_URL = "jdbc:mysql://localhost/books " jdbc:mysql://localhost/books"; // spusteni aplikace public static void main( String args[] ) { Connection connection = null; Statement statement = null; // pripojeni do databaze books a dotazovani databaze try { Class.forName( JDBC_DRIVER ); // načten tení ovladače databaze mysql

// vytvoreni pripojeni k databazi connection = DriverManager.getConnection( ( DATABASE_URL, "jhtp6", "jhtp6" ); Osnova // vytvoreni instance Statement pro dotazovani v databazi statement = connection.createstatement(); // databazove dotazy ResultSet resultset = statement.executequery( "SELECT authorid, firstname, lastname FROM authors" ); // zpracovani vysledku dotazu ResultSetMetaData metadata = resultset.getmetadata(); int numberofcolumns = metadata.getcolumncount(); System.out.println( "Authors Table of Books Database:" ); for ( int i = 1; i <= numberofcolumns; i++ ) System.out.printf( "%-8s 8s\t", metadata.getcolumnname( i ) ); System.out.println(); while ( resultset.next() ) { for ( int i = 1; i <= numberofcolumns; i++ ) System.out.printf( "%-8s 8s\t", resultset.getobject( i ) ); System.out.println(); } // end while } // end try

catch ( SQLException sqlexception ) { sqlexception.printstacktrace(); System.exit( 1 ); } // end catch catch ( ClassNotFoundException classnotfound ) { classnotfound.printstacktrace(); System.exit( 1 ); } // end catch finally // test, zda statement a connection jsou spravne uzavreni { try { statement.close(); connection.close(); } // end try catch ( Exception exception ) { exception.printstacktrace(); System.exit( 1 ); } // end catch } // end finally } // end main } // end class DisplayAuthors Osnova

Authors Table of Books Database: authorid firstname lastname 1 Harvey Deitel 2 Paul Deitel 3 Tem Nieto 4 Sean Santry Osnova

Navázání spojení s databází 43 k navázání spojení s databází se používá rozhraní Driver metody tohoto rozhraní se nepoužívají přímo, ale prostřednictvím statické třídy DriverManager a její statické metody getconnection() ta vrací objekt typu Connection metoda getconnection() předává argumenty všem registrovaným ovladačům, dokud nenajde ten, jehož prostřednictvím se mu podaří navázat spojení s uvedenými argumenty

Navázání spojení s databází 44 ovladač není explicitně registrovaný ovladač se vytvoří explicitně vytvořením jehi instance: Class.forName( JDBC_DRIVER);

Formáty adres URL ovladačů JDBC 45 metoda getconnection() má tři varianty (podle zadaných argumentů) 1. adresa URL ovladače ODBC 2. ID uživatele pro darabázi 3. heslo pro databázi adresa URL specifikuje databázi hodnota typu String identifikující konkrétní ovladač JDBC a databázi tvar: jdbc:<podprotokol>:<podnázev>

Formáty adres URL ovladačů JDBC 46 hodnoty <podprotokol> a <podnázev> jsou závislé na databázi a použitém ovladači "jdbc:mysql://localhost/books"; navázání spojení: connection = DriverManager.getConnection( DATABASE_URL, "jhtp6", "jhtp6" );

Rozhraní DatabaseMetaData 47 definované metody umožňují zjistit: možnosti DB systému a příslušného ovladače, popis obsahu databáze (seznam schémat DB, seznam tabulek, seznam sloupců v jednotlivých tabulkách, datový typ sloupců

Struktura metod rozhraní DatabaseMetaData 48 1. metody sloužící k popisu funkcí a vlastností BD systému vrací většinou boolean, int String supportouterjoins(), getmaxconnections() 2. metody popisující obsah DB vrací objekt typu ResultSet (rozhraní) getschemas(), gettables()

Třída Statement 49 po připojení k DB objekt typu Statement umožňuje vykonávat příkazy jazyka SQL instanci třídy Statement se vytvoří metodou createstatement() metody: executequery(a String); executeupdate(a String); execute(a String);

Třída ResultSet 50 instance této třídy mohou být výsledkem spuštění metody executequery(), nebo execute() vrací více instancí třídy ResultSet vrácená data je možné zpracovat po řádcích, záznamech aktuální záznam current row / current record po vytvoření instance ResutlSet její kurzor nastaven na 1. záznam (objekt) objekty ResultSet většinou zůstávají v databázovém serveru, pouze aktuální záznam je přenesen

Práce s objektem ResultSet 51 Navigace mezi záznamy: next() vrací boolean, zda existuje další záznam Načítání dat: getxxx() načítání dat z aktuálního záznamu pro každý typ (třídu) existuje speciální metoda getobject() každá getxxx() obsahuje dvě implementace: celočíselný argument index sloupce String argument název sloupce Úprava dat: metody prefix updatexxx()

Rozhraní ResultSetMetaData 52 použití k dalšímu získání informací o databázi ve výsledku dotazu popis jednotlivých sloupců název sloupců typ dat sloupců počet sloupců

Zobrazení autorů 53 Aplikace musí nahrát DB driver před připojením k databázi 25ř. statická metoda forname - nahrávání třídy DB ovladače je nutné přidat mysql-connector-java-3.0.14-production-bin.jar do adresáře: C:\mysql-connertor-java-3.0.14-production java classpath c:\mysql-connector-java-3.0.14- production\mysql-connector-java-3.0.14-productionbin.jar;.displayauthors

5.2 Dotazování (Querying) v databázi books 54 Dovoluje uživateli v programu zadat libovolný dotaz Zobrazí výsledky dotazu v JTable

// TableModel, ktery dodava ResultSet data do JTable. package paket2; import java.sql.connection; import java.sql.statement; import java.sql.drivermanager; import java.sql.resultset; import java.sql.resultsetmetadata; import java.sql.sqlexception; import javax.swing.table.abstracttablemodel; Osnova // Radky a sloupce ResultSet jsou cislovany od 1 a radky a // sloupce JTable jsou cislovany od 0. Pri zpracovani radku nebo // sloupcu ResultSet pro pouziti v JTable, je nutne // pricist 1 k cislu radku nebo sloupce k tomu, aby se s radky a sloupci // ResultSet spravne manipulovalo (napr napr. sloupec 0 JTable je // sloupec 1 ResultSet a radek 0 JTable je radek 1 ResultSet). public class ResultSetTableModel extends AbstractTableModel { private Connection connection; private Statement statement; private ResultSet resultset; private ResultSetMetaData metadata; private int numberofrows; // sledovani statusu pripojeni databaze private boolean connectedtodatabase = false;

// konstruktor inicializuje resultset a ziska jeho meta data object; // k urceni poctu radku public ResultSetTableModel( String driver, String url, String username, String password, String query ) throws SQLException, ClassNotFoundException { // nahrani tridy databazoveho driveru Class.forName( driver ); Osnova // pripojeni k databazi connection = DriverManager.getConnection( url, username, password ); // vytvoreni Statement k dotazum v databazi statement = connection.createstatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); // aktualizace statusu pripojeni databaze connectedtodatabase = true; // nastaveni dotazu a jeho provedeni setquery( query ); } // end constructor ResultSetTableModel

// ziskani tridy, ktera predstavuje typ sloupce public Class getcolumnclass( int column ) throws IllegalStateException { // zjisteni, zda je pripojeni k DB platne if (!connectedtodatabase! ) throw new IllegalStateException( "Not Connected to Database" ); Osnova // urceni tridy sloupce try { String classname = metadata.getcolumnclassname( ( column + 1 ); // vraceni objektu tridy, ktera predstavuje classname return Class.forName( classname ); } // end try catch ( Exception exception ) { exception.printstacktrace(); } // end catch return Object.class; } // end method getcolumnclass

// ziskani tridy, ktera predstavuje typ sloupce public Class getcolumnclass( int column ) throws IllegalStateException { // zjisteni, zda je pripojeni k DB platne if (!connectedtodatabase! ) throw new IllegalStateException( "Not Connected to Database" ); Osnova // urceni tridy sloupce try { String classname = metadata.getcolumnclassname( ( column + 1 ); // vraceni objektu tridy, ktera predstavuje classname return Class.forName( classname ); } // end try catch ( Exception exception ) { exception.printstacktrace(); } // end catch return Object.class; } // end method getcolumnclass

// ziskani jmena konkretniho sloupce v ResultSet public String getcolumnname( int column ) throws IllegalStateException { // zjisteni, zda je DB dostupna if (!connectedtodatabase! ) throw new IllegalStateException( "Not Connected to Database" ); Osnova // urceni jmena sloupce try { return metadata.getcolumnname( column + 1 ); } // end try catch ( SQLException sqlexception ) { sqlexception.printstacktrace(); } // end catch return ""; // pri problemech vraci prazdny retezec misto jmena //sloupce } // end method getcolumnname

// vraci pocet radku v ResultSet public int getrowcount() throws IllegalStateException { // zjisteni, zda je DB pripojena if (!connectedtodatabase! ) throw new IllegalStateException( "Not Connected to Database" ); Osnova return numberofrows; } // end method getrowcount // ziskani hodnoty z konkretniho radku a sloupce public Object getvalueat( int row, int column ) throws IllegalStateException { // zjisteni, zda je DB dostupna if (!connectedtodatabase! ) throw new IllegalStateException( "Not Connected to Database" ); // ziskani hodnoty v konkretnim radku a sloupci v ResultSet try { resultset.absolute( row + 1 ); return resultset.getobject( column + 1 ); } // end try

catch ( SQLException sqlexception ) { sqlexception.printstacktrace(); } // end catch Osnova return ""; // pri problemech vraci prazdny retezec } // end method getvalueat // nastaveni noveho retezce databazoveho dotazu public void setquery( String query ) throws SQLException, IllegalStateException { // zjisteni, zda je DB dostupna if (!connectedtodatabase! ) throw new IllegalStateException( "Not Connected to Database" ); // specifikace dotazu a jeho vykonani resultset = statement.executequery( query ); // ziskani meta dat z ResultSet metadata = resultset.getmetadata(); // urceni poctu radku v ResultSet resultset.last(); // presun na posledni radek numberofrows = resultset.getrow(); // ziskani cisla radku

// uvedomeni JTable, ze se model zmenil firetablestructurechanged(); } // end method setquery Osnova // uzavreni Statement a Connection public void disconnectfromdatabase() { if (!connectedtodatabase! ) return; try { statement.close(); connection.close(); } // end try catch ( SQLException sqlexception ) { sqlexception.printstacktrace(); } // end catch finally // update database connection status { connectedtodatabase = false; } // end finally } // end method disconnectfromdatabase } // end class ResultSetTableModel

Třída ResultSet - pokračování 63 jednosměrná nebo obousměrná sada záznamů forward-only-recordset scrollable recordset vlastnosti třídy uvedeny v tabulkách

5.2 Dotazování v databázi books 64 Statický typ konstanty ResultSet TYPE_FORWARD_ONLY TYPE_SCROLL_INSENSITIVE TYPE_SCROLL_SENSITIVE Obr. 28 Popis Specifikuje, že kurzor ResultSet se může posunout pouze směrem dopředu (např. Od mprvního řádku k poslednímu řádku v ResultSet). Specifikuje, že kurzor ResultSet může rolovat v libovolném směru a že změny vytvořené v ResultSet během zpracování ResultSet nejsou reflektovány v ResultSet do doby než se program opět dotáže databáze. Specifikuje, že kurzor ResultSet může rolovat v libovolném směru a že změny udělané v ResultSet během zpracování ResultSet jsou okamžitě reflektovány v ResultSet. Konstanty ResultSet pro specifikaci typu ResultSet.

5.2 Dotazování v databázi books 65 Statické Popis concurrency constant ResultSet CONCUR_READ_ONLY Specifikuje, že ResultSet nemůže být aktualizován (např. Změny v obsahu ResultSet nemohou být reflektovány v databázi s ResultSet update methodami). CONCUR_UPDATABLE Specifikuje, že ResultSet může být aktualizován (např. Změny v obsahu ResultSet mohou být reflektovány v databázi s ResultSet update methodami). Obr. 29 Konstanty ResultSet pro specifikaci vlastností result.

// zobrazi obsah tabulky Authors v databazi Books package paket2; import java.awt.borderlayout; import java.awt.event.actionlistener; import java.awt.event.actionevent; import java.awt.event.windowadapter; import java.awt.event.windowevent; import java.sql.sqlexception; import javax.swing.jframe; import javax.swing.jtextarea; import javax.swing.jscrollpane; import javax.swing.scrollpaneconstants; import javax.swing.jtable; import javax.swing.joptionpane; import javax.swing.jbutton; import javax.swing.box; Osnova public class DisplayQueryResults extends JFrame { // JDBC driver, database URL, username and password static final String JDBC_DRIVER = "com.mysql.jdbc.driver " com.mysql.jdbc.driver"; static final String DATABASE_URL = "jdbc:mysql://localhost/books " jdbc:mysql://localhost/books"; static final String USERNAME= "jhtp6"; static final String PASSWORD= "jhtp6";

// standardni dotaz - ziska vsechna data z tabulky authors static final String DEFAULT_QUERY = "SELECT * FROM authors"; Osnova private ResultSetTableModel tablemodel; private JTextArea queryarea; // vytvoreni ResultSetTableModel a GUI public DisplayQueryResults() { super( "Displaying Query Results" ); // vytvoreni ResultSetTableModel a zobrazi tabulku databaze try { // vytvoreni TableModel pro vysledky dotazu SELECT * FROM authors tablemodel = new ResultSetTableModel( JDBC_DRIVER, DATABASE_URL, USERNAME, PASSWORD, DEFAULT_QUERY ); // nastaveni JTextArea ve ktere uzivatel zapise dotazy queryarea = new JTextArea( DEFAULT_QUERY, 3, 100 ); queryarea.setwrapstyleword( ( true ); queryarea.setlinewrap( true );

JScrollPane scrollpane = new JScrollPane( queryarea, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER ); Osnova // nastaveni JButton pro odeslani (submitting) dotazu JButton submitbutton = new JButton( "Submit Query" ); // vytvoreni Box k umisteni queryarea a // submitbutton do GUI Box box = Box.createHorizontalBox(); box.add( scrollpane ); box.add( submitbutton ); // vytvoreni JTable pro tablemodel JTable resulttable = new JTable( tablemodel ); // umisteni komponent GUI co obsahu pane add( box, BorderLayout.NORTH ); add( new JScrollPane( resulttable ), BorderLayout.CENTER );

// vytvoreni event listener pro submitbutton submitbutton.addactionlistener( Osnova new ActionListener() { // predani dotazu modelu table public void actionperformed( ActionEvent event ) { // vykonani noveho dotazu try { tablemodel.setquery( queryarea.gettext() ); } // end try catch ( SQLException sqlexception ) { JOptionPane.showMessageDialog( ( null, sqlexception.getmessage(), "Database error", JOptionPane.ERROR_MESSAGE ); // blok try pro osetreni neplatneho uzivatelskeho dotazu // pomoci vykonani standardniho dotazu try { tablemodel.setquery( DEFAULT_QUERY ); queryarea.settext( DEFAULT_QUERY ); } // end try

catch ( SQLException sqlexception2 ) { JOptionPane.showMessageDialog( ( null, sqlexception2.getmessage(), "Database error", JOptionPane.ERROR_MESSAGE ); Osnova // zjisteni, zda je pripojeni k DB uzavrene tablemodel.disconnectfromdatabase(); System.exit( 1 ); // ukonceni aplikace } // end inner catch } // end outer catch } // end actionperformed } // end ActionListener inner class ); // end call to addactionlistener setsize( 500, 250 ); // nastaveni velikosti okna setvisible( true ); // zobrazeni okna } // end try catch ( ClassNotFoundException classnotfound ) { JOptionPane.showMessageDialog( ( null, "MySQL driver not found", "Driver not found", JOptionPane.ERROR_MESSAGE ); System.exit( 1 ); // ukonceni aplikace } // end catch

catch ( SQLException sqlexception ) { JOptionPane.showMessageDialog( ( null, sqlexception.getmessage(), "Database error", JOptionPane.ERROR_MESSAGE ); Osnova // zjisteni, zda je pripojeni k DB zavreno tablemodel.disconnectfromdatabase(); System.exit( 1 ); // ukonceni aplikace } // end catch // uvolneni okna, kdyz uzivatel ukonci aplikaci (toto zastini // (overrides) standardni HIDE_ON_CLOSE) setdefaultcloseoperation( ( DISPOSE_ON_CLOSE );

// zjisteni, zda je uzavreno pripojeni k DB, kdyz uzivatel ukonci aplikaci addwindowlistener( Osnova new WindowAdapter() { // odpojeni od databaze a ukonceni, kdyz je uzavreno okno public void windowclosed( WindowEvent event ) { tablemodel.disconnectfromdatabase(); System.exit( 0 ); } // end method windowclosed } // end WindowAdapter inner class ); // end call to addwindowlistener } // end DisplayQueryResults constructor // spusteni aplikace public static void main( String args[] ) { new DisplayQueryResults(); } // end main } // end class DisplayQueryResults

Osnova Výstup programu s využitím GUI

6 Uložené procedury 74 Uložené procedury (Stored procedures) Uloží příkazy SQL v databázi Vyvolání SQL příkazů pomocí programu, který zpřístupní databázi Rozhraní CallableStatement Obdrží argumenty Výstup parametry

Internet a zdroje na webu 75 Sun Microsystems JDBC home page Java.sun.com/products/jdbc SQL materials www.sql.org Cloudscape database home page www.cloudscape.com

7 Objektově relační mapování 76 Význam objektově relačního mapování (ORM) Dědičnost Strukturovaná data Vztahy mezi objekty Nástroje pro ORM JDO (Java Data Object) Hibernate (databáze pro J2EE)

Význam ORM 77 Indepance mismatch nesoulad mezi objektovými technologiemi a relačním uložením dat Vrstva ORM odděluje logický a fyzický datový model Mapování objektového modelu na fyzické databázové schéma manuální automatizované smíšené Mapování má velký vliv na efektivitu aplikací

Dědičnost 78 Sdílení společné struktury a chování Možnost opakovaného využitíčásti implementace společných částí Možnosti generického přístupu k částem hierarchie objektů Např. provedení akce nad všemi osobami Abstraktní / konkrétní třídy

Příklad hierarchie tříd 79

Mapování dědičnosti 80 Horizontální mapování Tabulka pro každou konkrétní třídu Obsahuje atributy všech bázových tříd Vertikální mapování Tabulka pro každou konkrétní i abstraktní třídu Získání informací o objektu vyžaduje přístup do více tabulek Mapování pomocí unie Společná tabulka pro více tříd Neefektivní uložení dat

Horizontální mapování 81 B id a b D id a C d E id a C e Vyber všechny hodnoty a (např. login a jméno všech osob) (SELECT a FROM B) UNION (SELECT a FROM D) UNION (SELECT a FROM E) Vyber konkrétní hodnotu typu D SELECT * FROM D WHERE id=100; Vytvoř nový objekt typu B INSERT INTO B(id, a, b) VALUES(100, a, b );

Vertikální mapování 82 A C E id a... id c... id e Vyber všechny hodnoty a (např. login a jméno všech osob) SELECT * FROM A; Vyber všechny hodnoty typu E SELECT * FROM (A JOIN C JOIN E) WHERE A.id=100; Vytvoř nový objekt typu B INSERT INTO A(id,a) VALUES(100, a ); INSERT INTO B(id,b) VALUES(100, b );

Mapování pomocí unie 83 T id type a b c d e Vyber všechny hodnoty a (např. login a jméno všech osob) SELECT a FROM T Vyber konkrétní hodnotu typu E SELECT a,c,e FROM T WHERE id=100; Vyber všechny hodnoty typu E SELECT id,a,c,e FROM T WHERE type= E ; Vytvoř nový objekt typu B INSERT INTO T(id, type, a, b) VALUES(100, B, a, b );

T1 id type a b Mapování pomocí unie 84 T2 id type a c d e Vyber všechny hodnoty a (např. login a jméno všech osob) (SELECT id, a FROM T1) UNION (SELECT id, a FROM T2) Vyber konkrétní hodnotu typu E SELECT a, c, e FROM T2 WHERE id= 100; Vyber všechny hodnoty typu E SELECT id, a, c, e FROM T2 WHERE type= E ; Vytvoř nový objekt typu B INSERT INTO T1(id, type, a, b)values(100, B, a, b );

Dědičnost - hodnocení 85 Horizontální mapování Složité dotazy nad abstraktními třídami (union) Vertikální mapování Složitější výběr konkrétního objektu (union) Příliš mnoho tabulek Flexibilita vhodné pro návaznost na existující data Mapování pomocí unie Rozumné množství tabulek Nutnost zavedení informace o typu Větší prostorové nároky

Strukturovaná data 86 Zanořený objekt (např. adresa osoby) Kolekce (např. kontakty osoby)

Zanořené objekty 87 Vložení atributů do vnějšího objektu id ulice psč obec adresa Osamostatnění zanořeného objektu id id_adr id ulice psč obec

Vztahy 88 1:1 přímá reference na objekt cizí klíč = primární klíč druhého objektu může být obousměrný vztah 1:N reference na straně N vazební tabulka není nutná M:N vazební tabulka cizí klíče do obou svázaných tabulek

Vztah 1:1 89 A B a b id b id Vyber hodnotu A příslušnou konkrétní hodnotě B SELECT B.* FROM A,B WHERE A.b=B.id AND A.id=100 Vyber hodnotu A příslušnou konkrétní hodnotě B SELECT A.* FROM A,B WHERE A.b=B.id AND B.id=100

Vztah 1:N 90 A B a a a A B id id a Vyber všechny hodnoty B příslušné konkrétní hodnotě A SELECT B.* FROM A,B WHERE B.a=A.id AND A.id=100

Vztah M:N 91 A B A AB B id a b id Vyber všechny hodnoty B příslušné konkrétní hodnotě A SELECT B.* FROM A,AB,B WHERE AB.a=A.id AND AB.b=B.id AND A.id=100

Použití nástrojů pro ORM 92 1. Návrh objektového modelu např. UML 2. Implementace modelu např. Java 3. Doplnění podpůrných metod Perzistence vytvoření, uložení, načtení, zrušení objektu Transakce Referenční integrita

Přístupy k automatizaci ORM 93 Modifikace na úrovni zdrojového textu Dědičnost rozšíření o metody zajišťující perzistenci J2EE CMP (Container Managed Persistence) Modofikace vygenerovaných tříd JDO (Java Data Objects) Sun JSR 12 Mapování za běhu pomocí reflexe Hibernate

Další informace 94 http://java.sun.com/products/jdo/index.jsp http://www.hibernate.org