Upload
others
View
10
Download
0
Embed Size (px)
Citation preview
1Java Database Connectivity with JDBC
Obsah1 Úvod2 Relační-databázový model3 Relační databaze přehled: databáze knih4 SQL
4.1 Základní SELECT Query4.2 klauzule WHERE 4.3 klauzule ORDER BY4.4 Výběr dat (Merging Data) z více tabulek: INNER JOIN4.5 příkaz INSERT 4.6 příkaz UPDATE 4.7 příkaz DELETE
5 Práce s databází pomocí JDBC5.1 Připojení a dotazy v databázi5.2 Dotazy v databázi (knihy) books
6 Uložené procedury7 Objektově relační mapování
2
1 Úvod
• 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)
3
1 Úvod
• RDBMS– Relational database management system
– Cloudscape 5.0.4• www.ibm.com/software/data/cloudscape
• JDBC– Java Database Connectivity
– JDBC driver
4
2 Relační databázový model
• Relační databáze– Tabulka
• Řádky, sloupce
– Primární klíč• jedinečná data
• SQL příkaz– dotaz (query)
5
2 Relační databázový model
Obr. 1 Tabulka Employee – vzorek dat
Number Name Department Salary Location
23603 Jones 413 1100 New Jersey
24568 Kerwin 413 2000 New Jersey
34589 Larson 642 1800 Los Angeles
35761 Myers 611 1400 Orlando
47132 Neumann 413 9000 New Jersey
78321 Stephens 611 8500 Orlando
Row
ColumnPrimary key
6
2 Relační databázový model
Obr. 2 Výsledek vyběru rozdílnýchDepartment a Location z tabulky Employee.
Department Location
413 New Jersey
611 Orlando
642 Los Angeles
7
3 Relační databáze p řehled: databáze books
• Vzorek databáze books– Čtyři tabulky
• authors, publishers, authorISBN a titles
– Relace (vztahy) mezi tabulkami
8
3 Relační databáze p řehled: databáze books
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 authorsauthorsauthorsauthors databáze books.
authorIDauthorIDauthorIDauthorID firstNamefirstNamefirstNamefirstName lastNamelastNamelastNamelastName 1 Harvey Deitel 2 Paul Deitel 3 Tem Nieto 4 Sean Santry Obr. 4 Vzorek dat z tabulky authors.
9
3 Relační databáze p řehled: databáze books
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 publisherspublisherspublisherspublishers tabulka z databáze books.
publisherID publisherName1 Prentice Hall2 Prentice Hall PTGObr. 6 Data z tabulky publishers.
10
3 Relační databáze p řehled: databáze books
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 titlestitlestitlestitles z databáze books.
11
3 Relační databáze p řehled: databáze books
isbnisbnisbnisbn titletitletitletitle editioneditioneditionedition----NumberNumberNumberNumber
copycopycopycopy----rightrightrightright
publishpublishpublishpublish----erIDerIDerIDerID
imageFileimageFileimageFileimageFile pricepricepriceprice
0130895725 C How to Program
3 2001 1 chtp3.jpg 74.95
0130384747 C++ How to Program
4 2002 1 cpphtp4.jpg 74.95
0130461342 Java Web Services for Experienced Programmers
1 2002 1 jwsfep1.jpg 54.95
0131016210 Java How to Program
5 2003 1 jhtp5.jpg 74.95
0130852473 The Complete Java 2 Training Course
5 2002 2 javactc5.jpg 109.95
0130895601 Advanced Java 2 Platform How to Program
1 2002 1 advjhtp1.jpg 74.95
Obr. 8 Vzorek dat z tabulky titles databáze books.
12
3 Relační databáze p řehled: databáze books
Sloupec Popis authorID AuthorID je číslo, cizí klíč k tabulce authors. isbn ISBN knihy je cizí klíč k tabulce titles.. Obr. 9 tabulka authorISBNauthorISBNauthorISBNauthorISBN databáze books.
authorID isbn authorID isbn1 0130895725 2 01391630502 0130895725 3 01308292932 0132261197 3 01302841732 0130895717 3 01302841812 0135289106 4 0130895601Obr. 10 Vzorek dat z tabulky authorISBN databáze books.
13
3 Relační databáze p řehled: databáze books
Obr. 11 Tabulka relací v databázibooks .
authorISBN
authorID
isbn
authors
authorID
firstName
lastName
publishers
publisherID
publisherName
titles
isbn
title
editionNumber
copyright
publisherID
imageFile
price
1 8 1
8
18
14
4 SQL
• SQL přehled
• SQL klíčová slova
SQL klíčová slova PopisSELECT 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ů.
15
4.1 Základní SELECT Query
• Nejjednodušší forma SELECT query– SELECT* FROMjménoTabulky
• SELECT* FROMauthors
• Vybere specifikované položky z tabulky– SELECTauthorID , lastName FROMauthors
authorID lastName1 Deitel2 Deitel3 Nieto4 SantryObr. 13 Vzorek authorID a lastName data z
authors tabulky.
16
4.2 Klauzule WHERE
• určuje kritéria výběru– SELECTjménoSloupce1, jménoSloupce2, … FROM
jménoTabulkyWHEREkritéria• SELECTtitle, editionNumber, copyright
FROMtitles
WHEREcopyright > 2000
• klauzule WHERE– podmínkové operátory– <, >, <=, >=, =, <>– LIKE
• znaky wildcard % a _
17
4.2 Klauzule WHERE
titletitletitletitle editionNumbereditionNumbereditionNumbereditionNumber copyrightcopyrightcopyrightcopyright C How to Program 3 2001 C++ How to Program 4 2002 The Complete C++ Training Course
4 2002
Internet and World Wide Web How to Program
2 2002
Java How to Program 5 2003 XML How to Program 1 2001 Perl How to Program 1 2001 Advanced Java 2 Platform How to Program
1 2002
Obr. 14 Vzorek názvů s copyrights po roce after 2000 z tabulky titles.
18
4.2 Klauzule WHERE
• SELECTauthorID, firstName, lastName
FROMauthors
WHERElastNameLIKE ‘D%’
authorID firstName lastName1 Harvey Deitel2 Paul DeitelObr. 15 Autoři jejichž přijmení začíná D z tabulky
authors .
19
4.2 Klauzule WHERE
• SELECTauthorID, firstName, lastName
FROMauthors
WHERElastNameLIKE ‘_i%’
authorID firstName lastName3 Tem NietoObr. 16 Jediný autor z tabulku authors
jehož přijmení obsahuje i jako druhé písmeno.
20
4.3 Klauzule ORDER BY
• Volitelná klauzule ORDER BY– SELECTjménoSloupce1, jménoSloupce2, … FROM
jménoTabulkyORDER BYsloupecASC
– SELECTjménoSloupce1, jménoSloupce2, … FROMjménoTabulkyORDER BYsloupecDESC
• ORDER BYvíce položek– ORDER BYcolumn1 sortingOrder, column2 sortingOrder,
…
• Kombinace klauzulíWHEREa ORDER BY
21
4.3 Klauzule ORDER BY
• SELECTauthorID, firstName, lastName
FROMauthors
ORDER BYlastNameASC
authorID firstName lastName2 Paul Deitel1 Harvey Deitel3 Tem Nieto4 Sean SantryObr. 17 Vzorek dat z tabulky authors v
vzestupném pořadí podle lastName.
22
4.3 Klauzule ORDER BY
• SELECTauthorID, firstName, lastName
FROMauthors
ORDER BYlastNameDESC
authorID firstName lastName4 Sean Santry3 Tem Nieto2 Paul Deitel1 Harvey DeitelObr.18 Vzorek dat z tabulky authors v
sestupném pořadí podle lastName.
23
4.3 Klauzule ORDER BY
• SELECTauthorID, firstName, lastName
FROMauthors
ORDER BYlastName, firstName
authorID firstName lastName1 Harvey Deitel2 Paul Deitel3 Tem Nieto4 Sean SantryObr. 19 Vzorek dat tabulky authors v
vzestupném pořadí podle lastName a podle firstName.
24
4.3 Klauzule ORDER BY
• SELECTisbn, title, editionNumber, copyright, price
FROMtitles WHEREtitle LIKE ‘%How to Program’
ORDER BYtitle ASCisbn title edition-
Numbercopy-right
price
0130895601 Advanced Java 2 Platform How to Program 1 2002 74.950130895725 C How to Program 3 2001 74.950130384747 C++ How to Program 4 2002 74.950130308978 Internet and World Wide Web How to
Program2 2002 74.95
0130284181 Perl How to Program 1 2001 74.950134569555 Visual Basic 6 How to Program 1 1999 74.950130284173 XML How to Program 1 2001 74.95013028419x e-Business and e-Commerce How to
Program1 2001 74.95
Obr. 20 Vzorek knih z tabulky titles, jejíž názvy končí s textem How toProgram v vzestupném pořadí řazeném podle názvů (titulů).
254.4 Výběr dat z více tabulekMerging Data from Multiple Tables: Joining
• 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• SELECTsloupecJméno1, sloupecJméno2, …
FROMtabulka1
INNER JOIN tabulka2
ONtabulka1.sloupecJméno= table2.sloupecJméno2• SELECTfirstName, lastName, isbn
FROMauthors, authorISBN
INNER JOIN authorISBN
ONauthors.authorID = authorISBN.authorID
ORDER BYlastName, firstName
264.4 Výběr dat z více tabulekMerging Data from Multiple Tables: Joining
firstNamefirstNamefirstNamefirstName lastNamelastNamelastNamelastName isbnisbnisbnisbn firstNamefirstNamefirstNamefirstName lastNamelastNamelastNamelastName isbnisbnisbnisbn 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.
27
4.5 Příkaz INSERT
• Vkládářádek do tabulky– INSERT INTO tableName( columnName1, … ,
columnNameN)
VALUES( value1, … , valueN)• INSERT INTO authors ( firstName, lastName )
VALUES( ‘Sue’, ‘Smith’ )authorID firstName lastName1 Harvey Deitel2 Paul Deitel3 Tem Nieto4 Sean Santry5 Sue SmithObr. 22 Vzorek dat z tabulky Authors po operaci
INSERT.
28
4.6 Příkaz UPDATE
• Modifikuje data v tabulce– UPDATEtableName
SETcolumnName1= value1, … , columnNameN= valueN
WHEREcriteria• UPDATEauthors
SET lastName = ‘Jones’
WHERElastName = ‘Smith’ ANDfirstName = ‘Sue’authorID firstName lastName1 Harvey Deitel2 Paul Deitel3 Tem Nieto4 Sean Santry5 Sue JonesObr. 23 Vzorek dat tabulky authors po operaci update.
29
4.7 Příkaz DELETE
• Odstranění dat z tabulky– DELETE FROMtableNameWHEREcriteria
• DELETE FROMauthors
WHERElastName = ‘Jones’ANDfirstName = ‘Sue’
authorID firstName lastName1 Harvey Deitel2 Paul Deitel3 Tem Nieto4 Sean SantryObr. 24 Vzorek dat z tabulky authors po operaci DELETE.
30
5 Práce s databází pomocí rozhraní JDBC
• Navázání spojení s databází
• Zaslání dotazů a příkazů pro aktualizaci databázi
• Zobrazení výsledků dotazu
OsnovaConnection Connection Connection Connection ccccoooon = n = n = n = DriverManager.getConnectionDriverManager.getConnectionDriverManager.getConnectionDriverManager.getConnection
((((““““jdbc:myDriver:wombatjdbc:myDriver:wombatjdbc:myDriver:wombatjdbc:myDriver:wombat””””, , , , ““““myLoginmyLoginmyLoginmyLogin””””, , , , ““““myPasswordmyPasswordmyPasswordmyPassword””””););););
Statement stmt = Statement stmt = Statement stmt = Statement stmt = con.createStatementcon.createStatementcon.createStatementcon.createStatement();();();();
ResultSetResultSetResultSetResultSet rsrsrsrs = = = = stmt.executeQuery(stmt.executeQuery(stmt.executeQuery(stmt.executeQuery(““““SELECTSELECTSELECTSELECT a, b, c FROM Table1a, b, c FROM Table1a, b, c FROM Table1a, b, c FROM Table1””””););););
while(rs.nextwhile(rs.nextwhile(rs.nextwhile(rs.next()) {()) {()) {()) {
intintintint x = x = x = x = rs.getInt(rs.getInt(rs.getInt(rs.getInt(““““aaaa””””););););
String s = String s = String s = String s = rs.getString(rs.getString(rs.getString(rs.getString(““““bbbb””””););););
float f = float f = float f = float f = rs.getFloat(rs.getFloat(rs.getFloat(rs.getFloat(““““cccc””””););););
}}}}
Fragment kódu -názorný p říklad uvedených krok ů
32
Fragment kódu
• vytváří instanci (objekt) od třídy DriverManagerpro 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
33
5. Ovlada če JDBC
• 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)
34Typy ovlada čů1. Připojení prost řednictvím zdroje dat ODBC
• Ovladač přemostění JDBC/ODBC (OpenDatabase 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)
35Typy 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)
36Typy 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
37Typy ovlada čů4. Přímé připojení k databázovému systému
• 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
38
5.1 Připojení a tvorba dotaz ů v databázi
• Zobrazení autorů (DisplayAuthors)– Získání celé tabulky authors
– Zobrazení dat v JTextArea
Osnova// // // // zobrazizobrazizobrazizobrazi obsahobsahobsahobsah tabulkytabulkytabulkytabulky authorsauthorsauthorsauthors
package paket1;package paket1;package paket1;package paket1;
import import import import java.sql.Connectionjava.sql.Connectionjava.sql.Connectionjava.sql.Connection;;;;
import import import import java.sql.Statementjava.sql.Statementjava.sql.Statementjava.sql.Statement;;;;
import import import import java.sql.DriverManagerjava.sql.DriverManagerjava.sql.DriverManagerjava.sql.DriverManager;;;;
import import import import java.sql.ResultSetjava.sql.ResultSetjava.sql.ResultSetjava.sql.ResultSet;;;;
import import import import java.sql.ResultSetMetaDatajava.sql.ResultSetMetaDatajava.sql.ResultSetMetaDatajava.sql.ResultSetMetaData;;;;
import import import import java.sql.SQLExceptionjava.sql.SQLExceptionjava.sql.SQLExceptionjava.sql.SQLException;;;;
public class public class public class public class DisplayAuthorsDisplayAuthorsDisplayAuthorsDisplayAuthors
{{{{
// JDBC // JDBC // JDBC // JDBC jmenojmenojmenojmeno driverudriverudriverudriveru a URL a URL a URL a URL databazedatabazedatabazedatabaze
static final String JDBC_DRIVER = "static final String JDBC_DRIVER = "static final String JDBC_DRIVER = "static final String JDBC_DRIVER = "com.mysql.jdbc.Drivercom.mysql.jdbc.Drivercom.mysql.jdbc.Drivercom.mysql.jdbc.Driver"; "; "; ";
static final String DATABASE_URL = "static final String DATABASE_URL = "static final String DATABASE_URL = "static final String DATABASE_URL = "jdbc:mysql://localhost/booksjdbc:mysql://localhost/booksjdbc:mysql://localhost/booksjdbc:mysql://localhost/books";";";";
// // // // spustenispustenispustenispusteni aplikaceaplikaceaplikaceaplikace
public static void main( String public static void main( String public static void main( String public static void main( String argsargsargsargs[] )[] )[] )[] )
{{{{
Connection Connection Connection Connection connectionconnectionconnectionconnection = null; = null; = null; = null;
Statement Statement Statement Statement statementstatementstatementstatement = null; = null; = null; = null;
// // // // pripojenipripojenipripojenipripojeni do do do do databazedatabazedatabazedatabaze books a books a books a books a dotazovanidotazovanidotazovanidotazovani databazedatabazedatabazedatabaze
try try try try
{{{{
Class.forNameClass.forNameClass.forNameClass.forName( JDBC_DRIVER ); ( JDBC_DRIVER ); ( JDBC_DRIVER ); ( JDBC_DRIVER ); // // // // nanananačtentententeníííí ovladaovladaovladaovladače e e e databazedatabazedatabazedatabaze mysqlmysqlmysqlmysql
Osnova// // // // vytvorenivytvorenivytvorenivytvoreni pripojenipripojenipripojenipripojeni k k k k databazidatabazidatabazidatabazi
connection = connection = connection = connection =
DriverManager.getConnectionDriverManager.getConnectionDriverManager.getConnectionDriverManager.getConnection( DATABASE_URL, "jhtp6", "jhtp6" );( DATABASE_URL, "jhtp6", "jhtp6" );( DATABASE_URL, "jhtp6", "jhtp6" );( DATABASE_URL, "jhtp6", "jhtp6" );
// // // // vytvorenivytvorenivytvorenivytvoreni instance Statement pro instance Statement pro instance Statement pro instance Statement pro dotazovanidotazovanidotazovanidotazovani v v v v databazidatabazidatabazidatabazi
statement = statement = statement = statement = connection.createStatementconnection.createStatementconnection.createStatementconnection.createStatement();();();();
// // // // databazovedatabazovedatabazovedatabazove dotazydotazydotazydotazy
ResultSetResultSetResultSetResultSet resultSetresultSetresultSetresultSet = = = = statement.executeQuerystatement.executeQuerystatement.executeQuerystatement.executeQuery( ( ( (
"SELECT "SELECT "SELECT "SELECT authorIDauthorIDauthorIDauthorID, , , , firstNamefirstNamefirstNamefirstName, , , , lastNamelastNamelastNamelastName FROM authors" );FROM authors" );FROM authors" );FROM authors" );
// // // // zpracovanizpracovanizpracovanizpracovani vysledkuvysledkuvysledkuvysledku dotazudotazudotazudotazu
ResultSetMetaDataResultSetMetaDataResultSetMetaDataResultSetMetaData metaDatametaDatametaDatametaData = = = = resultSet.getMetaDataresultSet.getMetaDataresultSet.getMetaDataresultSet.getMetaData();();();();
intintintint numberOfColumnsnumberOfColumnsnumberOfColumnsnumberOfColumns = = = = metaData.getColumnCountmetaData.getColumnCountmetaData.getColumnCountmetaData.getColumnCount();();();();
System.out.printlnSystem.out.printlnSystem.out.printlnSystem.out.println( "Authors Table of Books Database:" );( "Authors Table of Books Database:" );( "Authors Table of Books Database:" );( "Authors Table of Books Database:" );
for ( for ( for ( for ( intintintint i = 1; i <= i = 1; i <= i = 1; i <= i = 1; i <= numberOfColumnsnumberOfColumnsnumberOfColumnsnumberOfColumns; i++ ); i++ ); i++ ); i++ )
System.out.printfSystem.out.printfSystem.out.printfSystem.out.printf( "%( "%( "%( "%----8s8s8s8s\\\\t", t", t", t", metaData.getColumnNamemetaData.getColumnNamemetaData.getColumnNamemetaData.getColumnName( i ) );( i ) );( i ) );( i ) );
System.out.printlnSystem.out.printlnSystem.out.printlnSystem.out.println();();();();
while ( while ( while ( while ( resultSet.nextresultSet.nextresultSet.nextresultSet.next() ) () ) () ) () )
{{{{
for ( for ( for ( for ( intintintint i = 1; i <= i = 1; i <= i = 1; i <= i = 1; i <= numberOfColumnsnumberOfColumnsnumberOfColumnsnumberOfColumns; i++ ); i++ ); i++ ); i++ )
System.out.printfSystem.out.printfSystem.out.printfSystem.out.printf( "%( "%( "%( "%----8s8s8s8s\\\\t", t", t", t", resultSet.getObjectresultSet.getObjectresultSet.getObjectresultSet.getObject( i ) );( i ) );( i ) );( i ) );
System.out.printlnSystem.out.printlnSystem.out.printlnSystem.out.println();();();();
} // end while} // end while} // end while} // end while
} // end try} // end try} // end try} // end try
Osnovacatch ( catch ( catch ( catch ( SQLExceptionSQLExceptionSQLExceptionSQLException sqlExceptionsqlExceptionsqlExceptionsqlException ) ) ) )
{{{{
sqlException.printStackTracesqlException.printStackTracesqlException.printStackTracesqlException.printStackTrace();();();();
System.exitSystem.exitSystem.exitSystem.exit( 1 );( 1 );( 1 );( 1 );
} // end catch} // end catch} // end catch} // end catch
catch ( catch ( catch ( catch ( ClassNotFoundExceptionClassNotFoundExceptionClassNotFoundExceptionClassNotFoundException classNotFoundclassNotFoundclassNotFoundclassNotFound ) ) ) )
{{{{
classNotFound.printStackTraceclassNotFound.printStackTraceclassNotFound.printStackTraceclassNotFound.printStackTrace(); (); (); ();
System.exitSystem.exitSystem.exitSystem.exit( 1 );( 1 );( 1 );( 1 );
} // end catch} // end catch} // end catch} // end catch
finally finally finally finally // test, // test, // test, // test, zdazdazdazda statement a connection statement a connection statement a connection statement a connection jsoujsoujsoujsou spravnespravnespravnespravne uzavreniuzavreniuzavreniuzavreni
{ { { {
try try try try
{ { { {
statement.closestatement.closestatement.closestatement.close(); (); (); ();
connection.closeconnection.closeconnection.closeconnection.close(); (); (); ();
} // end try } // end try } // end try } // end try
catch ( Exception catch ( Exception catch ( Exception catch ( Exception exceptionexceptionexceptionexception ) ) ) )
{ { { {
exception.printStackTraceexception.printStackTraceexception.printStackTraceexception.printStackTrace(); (); (); ();
System.exitSystem.exitSystem.exitSystem.exit( 1 ); ( 1 ); ( 1 ); ( 1 );
} // end catch } // end catch } // end catch } // end catch
} // end finally } // end finally } // end finally } // end finally
} // end main} // end main} // end main} // end main
} // end class } // end class } // end class } // end class DisplayAuthorsDisplayAuthorsDisplayAuthorsDisplayAuthors
OsnovaAuthorAuthorAuthorAuthors Table of Books Database:s Table of Books Database:s Table of Books Database:s Table of Books Database:authorIDauthorIDauthorIDauthorID firstNamefirstNamefirstNamefirstName lastNamelastNamelastNamelastName1111 HarveyHarveyHarveyHarvey DeitelDeitelDeitelDeitel2222 PaulPaulPaulPaul DeitelDeitelDeitelDeitel3333 TemTemTemTem NietoNietoNietoNieto4444 SeanSeanSeanSean SantrySantrySantrySantry
43
Navázání spojení s databází
• 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 DriverManagera 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
44
Navázání spojení s databází
• ovladač není explicitně registrovaný
• ovladač se vytvoří explicitně vytvořením jehiinstance:Class.forName( JDBC_DRIVER);
45
Formáty adres URL ovlada čů JDBC
• 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>
46
Formáty adres URL ovlada čů JDBC
• 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" );
47
Rozhraní DatabaseMetaDataDatabaseMetaDataDatabaseMetaDataDatabaseMetaData
• 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ů
48Struktura metod rozhraníDatabaseMetaData
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()
49
Třída Statement
• 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);
50
Třída ResultSet
• 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 ResultSetvětšinou zůstávají v databázovém serveru, pouze aktuální záznam je přenesen
51
Práce s objektem ResultSet
• 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()
52
Rozhraní ResultSetMetaDataResultSetMetaDataResultSetMetaDataResultSetMetaData
• 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ů
53
Zobrazení autor ů
• 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-production-bin.jar;.DisplayAuthors
54
5.2 Dotazování (Querying) v databázi books
• Dovoluje uživateli v programu zadat libovolný dotaz
• Zobrazí výsledky dotazu v JTable
Osnova// // // // TableModelTableModelTableModelTableModel, , , , kterykterykteryktery dodavadodavadodavadodava ResultSetResultSetResultSetResultSet data do data do data do data do JTableJTableJTableJTable....
package paket2;package paket2;package paket2;package paket2;
import import import import java.sql.Connectionjava.sql.Connectionjava.sql.Connectionjava.sql.Connection;;;;
import import import import java.sql.Statementjava.sql.Statementjava.sql.Statementjava.sql.Statement;;;;
import import import import java.sql.DriverManagerjava.sql.DriverManagerjava.sql.DriverManagerjava.sql.DriverManager;;;;
import import import import java.sql.ResultSetjava.sql.ResultSetjava.sql.ResultSetjava.sql.ResultSet;;;;
import import import import java.sql.ResultSetMetaDatajava.sql.ResultSetMetaDatajava.sql.ResultSetMetaDatajava.sql.ResultSetMetaData;;;;
import import import import java.sql.SQLExceptionjava.sql.SQLExceptionjava.sql.SQLExceptionjava.sql.SQLException;;;;
import import import import javax.swing.table.AbstractTableModeljavax.swing.table.AbstractTableModeljavax.swing.table.AbstractTableModeljavax.swing.table.AbstractTableModel;;;;
// // // // RadkyRadkyRadkyRadky a a a a sloupcesloupcesloupcesloupce ResultSetResultSetResultSetResultSet jsoujsoujsoujsou cislovanycislovanycislovanycislovany odododod 1 a 1 a 1 a 1 a radkyradkyradkyradky a a a a
// // // // sloupcesloupcesloupcesloupce JTableJTableJTableJTable jsoujsoujsoujsou cislovanycislovanycislovanycislovany odododod 0. 0. 0. 0. PriPriPriPri zpracovanizpracovanizpracovanizpracovani radkuradkuradkuradku nebonebonebonebo
// // // // sloupcusloupcusloupcusloupcu ResultSetResultSetResultSetResultSet pro pro pro pro pouzitipouzitipouzitipouziti v v v v JTableJTableJTableJTable, , , , jejejeje nutnenutnenutnenutne
// // // // pricistpricistpricistpricist 1 k 1 k 1 k 1 k cislucislucislucislu radkuradkuradkuradku nebonebonebonebo sloupcesloupcesloupcesloupce k k k k tomutomutomutomu, , , , abyabyabyaby se s se s se s se s radkyradkyradkyradky a a a a sloupcisloupcisloupcisloupci
// // // // ResultSetResultSetResultSetResultSet spravnespravnespravnespravne manipulovalomanipulovalomanipulovalomanipulovalo ((((naprnaprnaprnapr. . . . sloupecsloupecsloupecsloupec 0 0 0 0 JTableJTableJTableJTable jejejeje
// // // // sloupecsloupecsloupecsloupec 1 1 1 1 ResultSetResultSetResultSetResultSet a a a a radekradekradekradek 0 0 0 0 JTableJTableJTableJTable jejejeje radekradekradekradek 1 1 1 1 ResultSetResultSetResultSetResultSet).).).).
public class public class public class public class ResultSetTableModelResultSetTableModelResultSetTableModelResultSetTableModel extends extends extends extends AbstractTableModelAbstractTableModelAbstractTableModelAbstractTableModel
{{{{
private Connection private Connection private Connection private Connection connectionconnectionconnectionconnection;;;;
private Statement private Statement private Statement private Statement statementstatementstatementstatement;;;;
private private private private ResultSetResultSetResultSetResultSet resultSetresultSetresultSetresultSet;;;;
private private private private ResultSetMetaDataResultSetMetaDataResultSetMetaDataResultSetMetaData metaDatametaDatametaDatametaData;;;;
private private private private intintintint numberOfRowsnumberOfRowsnumberOfRowsnumberOfRows;;;;
// // // // sledovanisledovanisledovanisledovani statusustatusustatusustatusu pripojenipripojenipripojenipripojeni databazedatabazedatabazedatabaze
private private private private booleanbooleanbooleanboolean connectedToDatabaseconnectedToDatabaseconnectedToDatabaseconnectedToDatabase = false;= false;= false;= false;
Osnova// // // // konstruktorkonstruktorkonstruktorkonstruktor inicializujeinicializujeinicializujeinicializuje resultSetresultSetresultSetresultSet a a a a ziskaziskaziskaziska jehojehojehojeho meta data object;meta data object;meta data object;meta data object;
// k // k // k // k urceniurceniurceniurceni poctupoctupoctupoctu radkuradkuradkuradku
public public public public ResultSetTableModelResultSetTableModelResultSetTableModelResultSetTableModel( String driver, String ( String driver, String ( String driver, String ( String driver, String urlurlurlurl, , , ,
String username, String password, String query ) String username, String password, String query ) String username, String password, String query ) String username, String password, String query )
throws throws throws throws SQLExceptionSQLExceptionSQLExceptionSQLException, , , , ClassNotFoundExceptionClassNotFoundExceptionClassNotFoundExceptionClassNotFoundException
{ { { {
// // // // nahraninahraninahraninahrani tridytridytridytridy databazovehodatabazovehodatabazovehodatabazoveho driverudriverudriverudriveru
Class.forNameClass.forNameClass.forNameClass.forName( driver );( driver );( driver );( driver );
// // // // pripojenipripojenipripojenipripojeni k k k k databazidatabazidatabazidatabazi
connection = connection = connection = connection = DriverManager.getConnectionDriverManager.getConnectionDriverManager.getConnectionDriverManager.getConnection( ( ( ( urlurlurlurl, username, password );, username, password );, username, password );, username, password );
// // // // vytvorenivytvorenivytvorenivytvoreni Statement k Statement k Statement k Statement k dotazumdotazumdotazumdotazum v v v v databazidatabazidatabazidatabazi
statement = statement = statement = statement = connection.createStatementconnection.createStatementconnection.createStatementconnection.createStatement( ( ( (
ResultSet.TYPE_SCROLL_INSENSITIVEResultSet.TYPE_SCROLL_INSENSITIVEResultSet.TYPE_SCROLL_INSENSITIVEResultSet.TYPE_SCROLL_INSENSITIVE,,,,
ResultSet.CONCUR_READ_ONLYResultSet.CONCUR_READ_ONLYResultSet.CONCUR_READ_ONLYResultSet.CONCUR_READ_ONLY ););););
// // // // aktualizaceaktualizaceaktualizaceaktualizace statusustatusustatusustatusu pripojenipripojenipripojenipripojeni databazedatabazedatabazedatabaze
connectedToDatabaseconnectedToDatabaseconnectedToDatabaseconnectedToDatabase = true;= true;= true;= true;
// // // // nastaveninastaveninastaveninastaveni dotazudotazudotazudotazu a a a a jehojehojehojeho provedeniprovedeniprovedeniprovedeni
setQuerysetQuerysetQuerysetQuery( query );( query );( query );( query );
} } } } // end constructor // end constructor // end constructor // end constructor ResultSetTableModelResultSetTableModelResultSetTableModelResultSetTableModel
Osnova// // // // ziskaniziskaniziskaniziskani tridytridytridytridy, , , , kterakterakteraktera predstavujepredstavujepredstavujepredstavuje typtyptyptyp sloupcesloupcesloupcesloupce
public Class public Class public Class public Class getColumnClassgetColumnClassgetColumnClassgetColumnClass( ( ( ( intintintint column ) throws column ) throws column ) throws column ) throws IllegalStateExceptionIllegalStateExceptionIllegalStateExceptionIllegalStateException
{{{{
// // // // zjistenizjistenizjistenizjisteni, , , , zdazdazdazda jejejeje pripojenipripojenipripojenipripojeni k DB k DB k DB k DB platneplatneplatneplatne
if ( !if ( !if ( !if ( !connectedToDatabaseconnectedToDatabaseconnectedToDatabaseconnectedToDatabase ) ) ) )
throw new throw new throw new throw new IllegalStateExceptionIllegalStateExceptionIllegalStateExceptionIllegalStateException( "Not Connected to Database" );( "Not Connected to Database" );( "Not Connected to Database" );( "Not Connected to Database" );
// // // // urceniurceniurceniurceni tridytridytridytridy sloupcesloupcesloupcesloupce
try try try try
{{{{
String String String String classNameclassNameclassNameclassName = = = = metaData.getColumnClassNamemetaData.getColumnClassNamemetaData.getColumnClassNamemetaData.getColumnClassName( column + 1 );( column + 1 );( column + 1 );( column + 1 );
// // // // vracenivracenivracenivraceni objektuobjektuobjektuobjektu tridytridytridytridy, , , , kterakterakteraktera predstavujepredstavujepredstavujepredstavuje classNameclassNameclassNameclassName
return return return return Class.forNameClass.forNameClass.forNameClass.forName( ( ( ( classNameclassNameclassNameclassName ););););
} } } } // end try// end try// end try// end try
catch ( Exception catch ( Exception catch ( Exception catch ( Exception exceptionexceptionexceptionexception ) ) ) )
{{{{
exception.printStackTraceexception.printStackTraceexception.printStackTraceexception.printStackTrace();();();();
} } } } // end catch// end catch// end catch// end catch
return return return return Object.classObject.classObject.classObject.class; ; ; ;
} } } } // end method // end method // end method // end method getColumnClassgetColumnClassgetColumnClassgetColumnClass
Osnova// // // // ziskaniziskaniziskaniziskani tridytridytridytridy, , , , kterakterakteraktera predstavujepredstavujepredstavujepredstavuje typtyptyptyp sloupcesloupcesloupcesloupce
public Class public Class public Class public Class getColumnClassgetColumnClassgetColumnClassgetColumnClass( ( ( ( intintintint column ) throws column ) throws column ) throws column ) throws IllegalStateExceptionIllegalStateExceptionIllegalStateExceptionIllegalStateException
{{{{
// // // // zjistenizjistenizjistenizjisteni, , , , zdazdazdazda jejejeje pripojenipripojenipripojenipripojeni k DB k DB k DB k DB platneplatneplatneplatne
if ( !if ( !if ( !if ( !connectedToDatabaseconnectedToDatabaseconnectedToDatabaseconnectedToDatabase ) ) ) )
throw new throw new throw new throw new IllegalStateExceptionIllegalStateExceptionIllegalStateExceptionIllegalStateException( "Not Connected to Database" );( "Not Connected to Database" );( "Not Connected to Database" );( "Not Connected to Database" );
// // // // urceniurceniurceniurceni tridytridytridytridy sloupcesloupcesloupcesloupce
try try try try
{{{{
String String String String classNameclassNameclassNameclassName = = = = metaData.getColumnClassNamemetaData.getColumnClassNamemetaData.getColumnClassNamemetaData.getColumnClassName( column + 1 );( column + 1 );( column + 1 );( column + 1 );
// // // // vracenivracenivracenivraceni objektuobjektuobjektuobjektu tridytridytridytridy, , , , kterakterakteraktera predstavujepredstavujepredstavujepredstavuje classNameclassNameclassNameclassName
return return return return Class.forNameClass.forNameClass.forNameClass.forName( ( ( ( classNameclassNameclassNameclassName ););););
} } } } // end try// end try// end try// end try
catch ( Exception catch ( Exception catch ( Exception catch ( Exception exceptionexceptionexceptionexception ) ) ) )
{{{{
exception.printStackTraceexception.printStackTraceexception.printStackTraceexception.printStackTrace();();();();
} } } } // end catch// end catch// end catch// end catch
return return return return Object.classObject.classObject.classObject.class; ; ; ;
} } } } // end method // end method // end method // end method getColumnClassgetColumnClassgetColumnClassgetColumnClass
Osnova// // // // ziskaniziskaniziskaniziskani jmenajmenajmenajmena konkretnihokonkretnihokonkretnihokonkretniho sloupcesloupcesloupcesloupce v v v v ResultSetResultSetResultSetResultSet
public String public String public String public String getColumnNamegetColumnNamegetColumnNamegetColumnName( ( ( ( intintintint column ) throws column ) throws column ) throws column ) throws IllegalStateExceptionIllegalStateExceptionIllegalStateExceptionIllegalStateException
{ { { {
// // // // zjistenizjistenizjistenizjisteni, , , , zdazdazdazda jejejeje DB DB DB DB dostupnadostupnadostupnadostupna
if ( !if ( !if ( !if ( !connectedToDatabaseconnectedToDatabaseconnectedToDatabaseconnectedToDatabase ) ) ) )
throw new throw new throw new throw new IllegalStateExceptionIllegalStateExceptionIllegalStateExceptionIllegalStateException( "Not Connected to Database" );( "Not Connected to Database" );( "Not Connected to Database" );( "Not Connected to Database" );
// // // // urceniurceniurceniurceni jmenajmenajmenajmena sloupcesloupcesloupcesloupce
try try try try
{{{{
return return return return metaData.getColumnNamemetaData.getColumnNamemetaData.getColumnNamemetaData.getColumnName( column + 1 ); ( column + 1 ); ( column + 1 ); ( column + 1 );
} } } } // end try// end try// end try// end try
catch ( catch ( catch ( catch ( SQLExceptionSQLExceptionSQLExceptionSQLException sqlExceptionsqlExceptionsqlExceptionsqlException ) ) ) )
{{{{
sqlException.printStackTracesqlException.printStackTracesqlException.printStackTracesqlException.printStackTrace();();();();
} } } } // end catch// end catch// end catch// end catch
return ""; return ""; return ""; return ""; // // // // pripripripri problemechproblemechproblemechproblemech vracivracivracivraci prazdnyprazdnyprazdnyprazdny retezecretezecretezecretezec mistomistomistomisto jmenajmenajmenajmena
////////sloupcesloupcesloupcesloupce
} } } } // end method // end method // end method // end method getColumnNamegetColumnNamegetColumnNamegetColumnName
Osnova// // // // vracivracivracivraci pocetpocetpocetpocet radkuradkuradkuradku v v v v ResultSetResultSetResultSetResultSet
public public public public intintintint getRowCountgetRowCountgetRowCountgetRowCount() throws () throws () throws () throws IllegalStateExceptionIllegalStateExceptionIllegalStateExceptionIllegalStateException
{ { { {
// // // // zjistenizjistenizjistenizjisteni, , , , zdazdazdazda jejejeje DB DB DB DB pripojenapripojenapripojenapripojena
if ( !if ( !if ( !if ( !connectedToDatabaseconnectedToDatabaseconnectedToDatabaseconnectedToDatabase ) ) ) )
throw new throw new throw new throw new IllegalStateExceptionIllegalStateExceptionIllegalStateExceptionIllegalStateException( "Not Connected to Database" );( "Not Connected to Database" );( "Not Connected to Database" );( "Not Connected to Database" );
return return return return numberOfRowsnumberOfRowsnumberOfRowsnumberOfRows;;;;
} } } } // end method // end method // end method // end method getRowCountgetRowCountgetRowCountgetRowCount
// // // // ziskaniziskaniziskaniziskani hodnotyhodnotyhodnotyhodnoty z z z z konkretnihokonkretnihokonkretnihokonkretniho radkuradkuradkuradku a a a a sloupcesloupcesloupcesloupce
public Object public Object public Object public Object getValueAtgetValueAtgetValueAtgetValueAt( ( ( ( intintintint row, row, row, row, intintintint column ) column ) column ) column )
throws throws throws throws IllegalStateExceptionIllegalStateExceptionIllegalStateExceptionIllegalStateException
{{{{
// // // // zjistenizjistenizjistenizjisteni, , , , zdazdazdazda jejejeje DB DB DB DB dostupnadostupnadostupnadostupna
if ( !if ( !if ( !if ( !connectedToDatabaseconnectedToDatabaseconnectedToDatabaseconnectedToDatabase ) ) ) )
throw new throw new throw new throw new IllegalStateExceptionIllegalStateExceptionIllegalStateExceptionIllegalStateException( "Not Connected to Database" );( "Not Connected to Database" );( "Not Connected to Database" );( "Not Connected to Database" );
// // // // ziskaniziskaniziskaniziskani hodnotyhodnotyhodnotyhodnoty v v v v konkretnimkonkretnimkonkretnimkonkretnim radkuradkuradkuradku a a a a sloupcisloupcisloupcisloupci v v v v ResultSetResultSetResultSetResultSet
try try try try
{{{{
resultSet.absoluteresultSet.absoluteresultSet.absoluteresultSet.absolute( row + 1 );( row + 1 );( row + 1 );( row + 1 );
return return return return resultSet.getObjectresultSet.getObjectresultSet.getObjectresultSet.getObject( column + 1 );( column + 1 );( column + 1 );( column + 1 );
} } } } // end try// end try// end try// end try
Osnovacatch ( catch ( catch ( catch ( SQLExceptionSQLExceptionSQLExceptionSQLException sqlExceptionsqlExceptionsqlExceptionsqlException ) ) ) )
{{{{
sqlException.printStackTracesqlException.printStackTracesqlException.printStackTracesqlException.printStackTrace();();();();
} } } } // end catch// end catch// end catch// end catch
return ""; // return ""; // return ""; // return ""; // pripripripri problemechproblemechproblemechproblemech vracivracivracivraci prazdnyprazdnyprazdnyprazdny retezecretezecretezecretezec
} } } } // end method // end method // end method // end method getValueAtgetValueAtgetValueAtgetValueAt
// // // // nastaveninastaveninastaveninastaveni novehonovehonovehonoveho retezceretezceretezceretezce databazovehodatabazovehodatabazovehodatabazoveho dotazudotazudotazudotazu
public void public void public void public void setQuerysetQuerysetQuerysetQuery( String query ) ( String query ) ( String query ) ( String query )
throws throws throws throws SQLExceptionSQLExceptionSQLExceptionSQLException, , , , IllegalStateExceptionIllegalStateExceptionIllegalStateExceptionIllegalStateException
{{{{
// // // // zjistenizjistenizjistenizjisteni, , , , zdazdazdazda jejejeje DB DB DB DB dostupnadostupnadostupnadostupna
if ( !if ( !if ( !if ( !connectedToDatabaseconnectedToDatabaseconnectedToDatabaseconnectedToDatabase ) ) ) )
throw new throw new throw new throw new IllegalStateExceptionIllegalStateExceptionIllegalStateExceptionIllegalStateException( "Not Connected to Database" );( "Not Connected to Database" );( "Not Connected to Database" );( "Not Connected to Database" );
// // // // specifikacespecifikacespecifikacespecifikace dotazudotazudotazudotazu a a a a jehojehojehojeho vykonanivykonanivykonanivykonani
resultSetresultSetresultSetresultSet = = = = statement.executeQuerystatement.executeQuerystatement.executeQuerystatement.executeQuery( query );( query );( query );( query );
// // // // ziskaniziskaniziskaniziskani meta meta meta meta datdatdatdat z z z z ResultSetResultSetResultSetResultSet
metaDatametaDatametaDatametaData = = = = resultSet.getMetaDataresultSet.getMetaDataresultSet.getMetaDataresultSet.getMetaData();();();();
// // // // urceniurceniurceniurceni poctupoctupoctupoctu radkuradkuradkuradku v v v v ResultSetResultSetResultSetResultSet
resultSet.lastresultSet.lastresultSet.lastresultSet.last(); (); (); (); // // // // presunpresunpresunpresun nananana posledniposledniposledniposledni radekradekradekradek
numberOfRowsnumberOfRowsnumberOfRowsnumberOfRows = = = = resultSet.getRowresultSet.getRowresultSet.getRowresultSet.getRow(); (); (); (); // // // // ziskaniziskaniziskaniziskani cislacislacislacisla radkuradkuradkuradku
Osnova// // // // uvedomeniuvedomeniuvedomeniuvedomeni JTableJTableJTableJTable, , , , zezezeze se model se model se model se model zmenilzmenilzmenilzmenil
fireTableStructureChangedfireTableStructureChangedfireTableStructureChangedfireTableStructureChanged();();();();
} } } } // end method // end method // end method // end method setQuerysetQuerysetQuerysetQuery
// // // // uzavreniuzavreniuzavreniuzavreni Statement a ConnectionStatement a ConnectionStatement a ConnectionStatement a Connection
public void public void public void public void disconnectFromDatabasedisconnectFromDatabasedisconnectFromDatabasedisconnectFromDatabase() () () ()
{ { { {
if ( !if ( !if ( !if ( !connectedToDatabaseconnectedToDatabaseconnectedToDatabaseconnectedToDatabase ) ) ) )
return;return;return;return;
try try try try
{ { { {
statement.closestatement.closestatement.closestatement.close(); (); (); ();
connection.closeconnection.closeconnection.closeconnection.close(); (); (); ();
} } } } // end try// end try// end try// end try
catch ( catch ( catch ( catch ( SQLExceptionSQLExceptionSQLExceptionSQLException sqlExceptionsqlExceptionsqlExceptionsqlException ) ) ) )
{ { { {
sqlException.printStackTracesqlException.printStackTracesqlException.printStackTracesqlException.printStackTrace(); (); (); ();
} } } } // end catch// end catch// end catch// end catch
finally // update database connection statusfinally // update database connection statusfinally // update database connection statusfinally // update database connection status
{ { { {
connectedToDatabaseconnectedToDatabaseconnectedToDatabaseconnectedToDatabase = false; = false; = false; = false;
} } } } // end finally// end finally// end finally// end finally
} } } } // end method // end method // end method // end method disconnectFromDatabasedisconnectFromDatabasedisconnectFromDatabasedisconnectFromDatabase
} } } } // end class // end class // end class // end class ResultSetTableModelResultSetTableModelResultSetTableModelResultSetTableModel
63
Třída ResultSet - pokra čování
• jednosměrná nebo obousměrná sada záznamůforward-only-recordsetscrollable recordset
• vlastnosti třídy uvedeny v tabulkách
64
5.2 Dotazování v databázi books
Statický typ konstanty ResultSet
Popis
TYPE_FORWARD_ONLY Specifikuje, že kurzor ResultSet se může posunout
pouze směrem dopředu (např. Od mprvního řádku k poslednímu řádku v ResultSet).
TYPE_SCROLL_INSENSITIVE 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.
TYPE_SCROLL_SENSITIVE 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.
Obr. 28 Konstanty ResultSetResultSetResultSetResultSet pro specifikaci typu ResultSet.
65
5.2 Dotazování v databázi books
StatickStatickStatickStatické concurrency constant ResultSetResultSetResultSetResultSet
Popis
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 ResultSetResultSetResultSetResultSet pro specifikaci vlastností result.
Osnova// // // // zobrazizobrazizobrazizobrazi obsahobsahobsahobsah tabulkytabulkytabulkytabulky Authors v Authors v Authors v Authors v databazidatabazidatabazidatabazi BooksBooksBooksBooks
package paket2;package paket2;package paket2;package paket2;
import import import import java.awt.BorderLayoutjava.awt.BorderLayoutjava.awt.BorderLayoutjava.awt.BorderLayout;;;;
import import import import java.awt.event.ActionListenerjava.awt.event.ActionListenerjava.awt.event.ActionListenerjava.awt.event.ActionListener;;;;
import import import import java.awt.event.ActionEventjava.awt.event.ActionEventjava.awt.event.ActionEventjava.awt.event.ActionEvent;;;;
import import import import java.awt.event.WindowAdapterjava.awt.event.WindowAdapterjava.awt.event.WindowAdapterjava.awt.event.WindowAdapter;;;;
import import import import java.awt.event.WindowEventjava.awt.event.WindowEventjava.awt.event.WindowEventjava.awt.event.WindowEvent;;;;
import import import import java.sql.SQLExceptionjava.sql.SQLExceptionjava.sql.SQLExceptionjava.sql.SQLException;;;;
import import import import javax.swing.JFramejavax.swing.JFramejavax.swing.JFramejavax.swing.JFrame;;;;
import import import import javax.swing.JTextAreajavax.swing.JTextAreajavax.swing.JTextAreajavax.swing.JTextArea;;;;
import import import import javax.swing.JScrollPanejavax.swing.JScrollPanejavax.swing.JScrollPanejavax.swing.JScrollPane;;;;
import import import import javax.swing.ScrollPaneConstantsjavax.swing.ScrollPaneConstantsjavax.swing.ScrollPaneConstantsjavax.swing.ScrollPaneConstants;;;;
import import import import javax.swing.JTablejavax.swing.JTablejavax.swing.JTablejavax.swing.JTable;;;;
import import import import javax.swing.JOptionPanejavax.swing.JOptionPanejavax.swing.JOptionPanejavax.swing.JOptionPane;;;;
import import import import javax.swing.JButtonjavax.swing.JButtonjavax.swing.JButtonjavax.swing.JButton;;;;
import import import import javax.swing.Boxjavax.swing.Boxjavax.swing.Boxjavax.swing.Box;;;;
public class public class public class public class DisplayQueryResultsDisplayQueryResultsDisplayQueryResultsDisplayQueryResults extends extends extends extends JFrameJFrameJFrameJFrame
{{{{
// JDBC driver, database URL, username and password// JDBC driver, database URL, username and password// JDBC driver, database URL, username and password// JDBC driver, database URL, username and password
static final String JDBC_DRIVER = "static final String JDBC_DRIVER = "static final String JDBC_DRIVER = "static final String JDBC_DRIVER = "com.mysql.jdbc.Drivercom.mysql.jdbc.Drivercom.mysql.jdbc.Drivercom.mysql.jdbc.Driver";";";";
static final String DATABASE_URL = "static final String DATABASE_URL = "static final String DATABASE_URL = "static final String DATABASE_URL = "jdbc:mysql://localhost/booksjdbc:mysql://localhost/booksjdbc:mysql://localhost/booksjdbc:mysql://localhost/books";";";";
static final String USERNAME= "jhtp6";static final String USERNAME= "jhtp6";static final String USERNAME= "jhtp6";static final String USERNAME= "jhtp6";
static final String PASSWORD= "jhtp6";static final String PASSWORD= "jhtp6";static final String PASSWORD= "jhtp6";static final String PASSWORD= "jhtp6";
Osnova// // // // standardnistandardnistandardnistandardni dotazdotazdotazdotaz ---- ziskaziskaziskaziska vsechnavsechnavsechnavsechna data z data z data z data z tabulkytabulkytabulkytabulky authorsauthorsauthorsauthors
static final String DEFAULT_QUERY = "SELECT * FROM authors";static final String DEFAULT_QUERY = "SELECT * FROM authors";static final String DEFAULT_QUERY = "SELECT * FROM authors";static final String DEFAULT_QUERY = "SELECT * FROM authors";
private private private private ResultSetTableModelResultSetTableModelResultSetTableModelResultSetTableModel tableModeltableModeltableModeltableModel;;;;
private private private private JTextAreaJTextAreaJTextAreaJTextArea queryAreaqueryAreaqueryAreaqueryArea;;;;
// // // // vytvorenivytvorenivytvorenivytvoreni ResultSetTableModelResultSetTableModelResultSetTableModelResultSetTableModel a GUIa GUIa GUIa GUI
public public public public DisplayQueryResultsDisplayQueryResultsDisplayQueryResultsDisplayQueryResults() () () ()
{ { { {
super( "Displaying Query Results" );super( "Displaying Query Results" );super( "Displaying Query Results" );super( "Displaying Query Results" );
// // // // vytvorenivytvorenivytvorenivytvoreni ResultSetTableModelResultSetTableModelResultSetTableModelResultSetTableModel a a a a zobrazizobrazizobrazizobrazi tabulkutabulkutabulkutabulku databazedatabazedatabazedatabaze
try try try try
{{{{
// // // // vytvorenivytvorenivytvorenivytvoreni TableModelTableModelTableModelTableModel pro pro pro pro vysledkyvysledkyvysledkyvysledky dotazudotazudotazudotazu SELECT * FROM authorsSELECT * FROM authorsSELECT * FROM authorsSELECT * FROM authors
tableModeltableModeltableModeltableModel = new = new = new = new ResultSetTableModelResultSetTableModelResultSetTableModelResultSetTableModel( JDBC_DRIVER, DATABASE_URL, ( JDBC_DRIVER, DATABASE_URL, ( JDBC_DRIVER, DATABASE_URL, ( JDBC_DRIVER, DATABASE_URL,
USERNAME, PASSWORD, DEFAULT_QUERY );USERNAME, PASSWORD, DEFAULT_QUERY );USERNAME, PASSWORD, DEFAULT_QUERY );USERNAME, PASSWORD, DEFAULT_QUERY );
// // // // nastaveninastaveninastaveninastaveni JTextAreaJTextAreaJTextAreaJTextArea veveveve kterekterekterektere uzivateluzivateluzivateluzivatel zapisezapisezapisezapise dotazydotazydotazydotazy
queryAreaqueryAreaqueryAreaqueryArea = new = new = new = new JTextAreaJTextAreaJTextAreaJTextArea( DEFAULT_QUERY, 3, 100 );( DEFAULT_QUERY, 3, 100 );( DEFAULT_QUERY, 3, 100 );( DEFAULT_QUERY, 3, 100 );
queryArea.setWrapStyleWordqueryArea.setWrapStyleWordqueryArea.setWrapStyleWordqueryArea.setWrapStyleWord( true );( true );( true );( true );
queryArea.setLineWrapqueryArea.setLineWrapqueryArea.setLineWrapqueryArea.setLineWrap( true );( true );( true );( true );
OsnovaJScrollPaneJScrollPaneJScrollPaneJScrollPane scrollPanescrollPanescrollPanescrollPane = new = new = new = new JScrollPaneJScrollPaneJScrollPaneJScrollPane( ( ( ( queryAreaqueryAreaqueryAreaqueryArea,,,,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDEDScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDEDScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDEDScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, , , ,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVERScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVERScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVERScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER ););););
// // // // nastaveninastaveninastaveninastaveni JButtonJButtonJButtonJButton pro pro pro pro odeslaniodeslaniodeslaniodeslani (submitting) (submitting) (submitting) (submitting) dotazudotazudotazudotazu
JButtonJButtonJButtonJButton submitButtonsubmitButtonsubmitButtonsubmitButton = new = new = new = new JButtonJButtonJButtonJButton( "Submit Query" );( "Submit Query" );( "Submit Query" );( "Submit Query" );
// // // // vytvorenivytvorenivytvorenivytvoreni Box k Box k Box k Box k umisteniumisteniumisteniumisteni queryAreaqueryAreaqueryAreaqueryArea a a a a
// // // // submitButtonsubmitButtonsubmitButtonsubmitButton do GUIdo GUIdo GUIdo GUI
Box Box Box Box boxboxboxbox = = = = Box.createHorizontalBoxBox.createHorizontalBoxBox.createHorizontalBoxBox.createHorizontalBox();();();();
box.addbox.addbox.addbox.add( ( ( ( scrollPanescrollPanescrollPanescrollPane ););););
box.addbox.addbox.addbox.add( ( ( ( submitButtonsubmitButtonsubmitButtonsubmitButton ););););
// // // // vytvorenivytvorenivytvorenivytvoreni JTableJTableJTableJTable pro pro pro pro tableModeltableModeltableModeltableModel
JTableJTableJTableJTable resultTableresultTableresultTableresultTable = new = new = new = new JTableJTableJTableJTable( ( ( ( tableModeltableModeltableModeltableModel ););););
// // // // umisteniumisteniumisteniumisteni komponentkomponentkomponentkomponent GUI co GUI co GUI co GUI co obsahuobsahuobsahuobsahu panepanepanepane
add( box, add( box, add( box, add( box, BorderLayout.NORTHBorderLayout.NORTHBorderLayout.NORTHBorderLayout.NORTH ););););
add( new add( new add( new add( new JScrollPaneJScrollPaneJScrollPaneJScrollPane( ( ( ( resultTableresultTableresultTableresultTable ), ), ), ), BorderLayout.CENTERBorderLayout.CENTERBorderLayout.CENTERBorderLayout.CENTER ););););
Osnova// // // // vytvorenivytvorenivytvorenivytvoreni event listener pro event listener pro event listener pro event listener pro submitButtonsubmitButtonsubmitButtonsubmitButton
submitButton.addActionListenersubmitButton.addActionListenersubmitButton.addActionListenersubmitButton.addActionListener( ( ( (
new new new new ActionListenerActionListenerActionListenerActionListener() () () ()
{{{{
// // // // predanipredanipredanipredani dotazudotazudotazudotazu modelumodelumodelumodelu tabletabletabletable
public void public void public void public void actionPerformedactionPerformedactionPerformedactionPerformed( ( ( ( ActionEventActionEventActionEventActionEvent event )event )event )event )
{{{{
// // // // vykonanivykonanivykonanivykonani novehonovehonovehonoveho dotazudotazudotazudotazu
try try try try
{{{{
tableModel.setQuerytableModel.setQuerytableModel.setQuerytableModel.setQuery( ( ( ( queryArea.getTextqueryArea.getTextqueryArea.getTextqueryArea.getText() );() );() );() );
} } } } // end try// end try// end try// end try
catch ( catch ( catch ( catch ( SQLExceptionSQLExceptionSQLExceptionSQLException sqlExceptionsqlExceptionsqlExceptionsqlException ) ) ) )
{{{{
JOptionPane.showMessageDialogJOptionPane.showMessageDialogJOptionPane.showMessageDialogJOptionPane.showMessageDialog( null, ( null, ( null, ( null,
sqlException.getMessagesqlException.getMessagesqlException.getMessagesqlException.getMessage(), "Database error", (), "Database error", (), "Database error", (), "Database error",
JOptionPane.ERROR_MESSAGEJOptionPane.ERROR_MESSAGEJOptionPane.ERROR_MESSAGEJOptionPane.ERROR_MESSAGE ););););
// // // // blokblokblokblok try pro try pro try pro try pro osetreniosetreniosetreniosetreni neplatnehoneplatnehoneplatnehoneplatneho uzivatelskehouzivatelskehouzivatelskehouzivatelskeho dotazudotazudotazudotazu
// // // // pomocipomocipomocipomoci vykonanivykonanivykonanivykonani standardnihostandardnihostandardnihostandardniho dotazudotazudotazudotazu
try try try try
{{{{
tableModel.setQuerytableModel.setQuerytableModel.setQuerytableModel.setQuery( DEFAULT_QUERY );( DEFAULT_QUERY );( DEFAULT_QUERY );( DEFAULT_QUERY );
queryArea.setTextqueryArea.setTextqueryArea.setTextqueryArea.setText( DEFAULT_QUERY );( DEFAULT_QUERY );( DEFAULT_QUERY );( DEFAULT_QUERY );
} } } } // end try// end try// end try// end try
Osnovacatch ( catch ( catch ( catch ( SQLExceptionSQLExceptionSQLExceptionSQLException sqlException2 ) sqlException2 ) sqlException2 ) sqlException2 )
{{{{
JOptionPane.showMessageDialogJOptionPane.showMessageDialogJOptionPane.showMessageDialogJOptionPane.showMessageDialog( null, ( null, ( null, ( null,
sqlException2.getMessage(), "DatabasesqlException2.getMessage(), "DatabasesqlException2.getMessage(), "DatabasesqlException2.getMessage(), "Database error", error", error", error",
JOptionPane.ERROR_MESSAGEJOptionPane.ERROR_MESSAGEJOptionPane.ERROR_MESSAGEJOptionPane.ERROR_MESSAGE ););););
// // // // zjistenizjistenizjistenizjisteni, , , , zdazdazdazda jejejeje pripojenipripojenipripojenipripojeni k DB k DB k DB k DB uzavreneuzavreneuzavreneuzavrene
tableModel.disconnectFromDatabasetableModel.disconnectFromDatabasetableModel.disconnectFromDatabasetableModel.disconnectFromDatabase();();();();
System.exitSystem.exitSystem.exitSystem.exit( 1 ); // ( 1 ); // ( 1 ); // ( 1 ); // ukonceniukonceniukonceniukonceni aplikaceaplikaceaplikaceaplikace
} } } } // end inner catch// end inner catch// end inner catch// end inner catch
} } } } // end outer catch// end outer catch// end outer catch// end outer catch
} } } } // end // end // end // end actionPerformedactionPerformedactionPerformedactionPerformed
} } } } // end // end // end // end ActionListenerActionListenerActionListenerActionListener inner classinner classinner classinner class
); ); ); ); // end call to // end call to // end call to // end call to addActionListeneraddActionListeneraddActionListeneraddActionListener
setSizesetSizesetSizesetSize( 500, 250 ); // ( 500, 250 ); // ( 500, 250 ); // ( 500, 250 ); // nastaveninastaveninastaveninastaveni velikostivelikostivelikostivelikosti oknaoknaoknaokna
setVisiblesetVisiblesetVisiblesetVisible( true ); // ( true ); // ( true ); // ( true ); // zobrazenizobrazenizobrazenizobrazeni oknaoknaoknaokna
} } } } // end try// end try// end try// end try
catch ( catch ( catch ( catch ( ClassNotFoundExceptionClassNotFoundExceptionClassNotFoundExceptionClassNotFoundException classNotFoundclassNotFoundclassNotFoundclassNotFound ) ) ) )
{{{{
JOptionPane.showMessageDialogJOptionPane.showMessageDialogJOptionPane.showMessageDialogJOptionPane.showMessageDialog( null, ( null, ( null, ( null,
""""MySQLMySQLMySQLMySQL driver not found", "Driver not found",driver not found", "Driver not found",driver not found", "Driver not found",driver not found", "Driver not found",
JOptionPane.ERROR_MESSAGEJOptionPane.ERROR_MESSAGEJOptionPane.ERROR_MESSAGEJOptionPane.ERROR_MESSAGE ););););
System.exitSystem.exitSystem.exitSystem.exit( 1 ); // ( 1 ); // ( 1 ); // ( 1 ); // ukonceniukonceniukonceniukonceni aplikaceaplikaceaplikaceaplikace
} } } } // end catch// end catch// end catch// end catch
Osnovacatch ( catch ( catch ( catch ( SQLExceptionSQLExceptionSQLExceptionSQLException sqlExceptionsqlExceptionsqlExceptionsqlException ) ) ) )
{{{{
JOptionPane.showMessageDialogJOptionPane.showMessageDialogJOptionPane.showMessageDialogJOptionPane.showMessageDialog( null, ( null, ( null, ( null, sqlException.getMessagesqlException.getMessagesqlException.getMessagesqlException.getMessage(), (), (), (),
"Database error", "Database error", "Database error", "Database error", JOptionPane.ERROR_MESSAGEJOptionPane.ERROR_MESSAGEJOptionPane.ERROR_MESSAGEJOptionPane.ERROR_MESSAGE ););););
// // // // zjistenizjistenizjistenizjisteni, , , , zdazdazdazda jejejeje pripojenipripojenipripojenipripojeni k DB k DB k DB k DB zavrenozavrenozavrenozavreno
tableModel.disconnectFromDatabasetableModel.disconnectFromDatabasetableModel.disconnectFromDatabasetableModel.disconnectFromDatabase();();();();
System.exitSystem.exitSystem.exitSystem.exit( 1 ); // ( 1 ); // ( 1 ); // ( 1 ); // ukonceniukonceniukonceniukonceni aplikaceaplikaceaplikaceaplikace
} } } } // end catch// end catch// end catch// end catch
// // // // uvolneniuvolneniuvolneniuvolneni oknaoknaoknaokna, , , , kdyzkdyzkdyzkdyz uzivateluzivateluzivateluzivatel ukonciukonciukonciukonci aplikaciaplikaciaplikaciaplikaci ((((totototototototo zastinizastinizastinizastini
//////// (overrides)(overrides)(overrides)(overrides) standardnistandardnistandardnistandardni HIDE_ON_CLOSE)HIDE_ON_CLOSE)HIDE_ON_CLOSE)HIDE_ON_CLOSE)
setDefaultCloseOperationsetDefaultCloseOperationsetDefaultCloseOperationsetDefaultCloseOperation( DISPOSE_ON_CLOSE );( DISPOSE_ON_CLOSE );( DISPOSE_ON_CLOSE );( DISPOSE_ON_CLOSE );
Osnova// // // // zjistenizjistenizjistenizjisteni, , , , zdazdazdazda jejejeje uzavrenouzavrenouzavrenouzavreno pripojenipripojenipripojenipripojeni k DB, k DB, k DB, k DB, kdyzkdyzkdyzkdyz uzivateluzivateluzivateluzivatel ukonciukonciukonciukonci aplikaciaplikaciaplikaciaplikaci
addWindowListeneraddWindowListeneraddWindowListeneraddWindowListener((((
new new new new WindowAdapterWindowAdapterWindowAdapterWindowAdapter() () () ()
{{{{
// // // // odpojeniodpojeniodpojeniodpojeni odododod databazedatabazedatabazedatabaze a a a a ukonceniukonceniukonceniukonceni, , , , kdyzkdyzkdyzkdyz jejejeje uzavrenouzavrenouzavrenouzavreno oknooknooknookno
public void public void public void public void windowClosedwindowClosedwindowClosedwindowClosed( ( ( ( WindowEventWindowEventWindowEventWindowEvent event )event )event )event )
{{{{
tableModel.disconnectFromDatabasetableModel.disconnectFromDatabasetableModel.disconnectFromDatabasetableModel.disconnectFromDatabase();();();();
System.exitSystem.exitSystem.exitSystem.exit( 0 );( 0 );( 0 );( 0 );
} } } } // end method // end method // end method // end method windowClosedwindowClosedwindowClosedwindowClosed
} } } } // end // end // end // end WindowAdapterWindowAdapterWindowAdapterWindowAdapter inner classinner classinner classinner class
); ); ); ); // end call to // end call to // end call to // end call to addWindowListeneraddWindowListeneraddWindowListeneraddWindowListener
} } } } // end // end // end // end DisplayQueryResultsDisplayQueryResultsDisplayQueryResultsDisplayQueryResults constructorconstructorconstructorconstructor
// // // // spustenispustenispustenispusteni aplikaceaplikaceaplikaceaplikace
public static void main( String public static void main( String public static void main( String public static void main( String argsargsargsargs[] ) [] ) [] ) [] )
{{{{
new new new new DisplayQueryResultsDisplayQueryResultsDisplayQueryResultsDisplayQueryResults(); (); (); ();
} } } } // end main// end main// end main// end main
} } } } // end class // end class // end class // end class DisplayQueryResultsDisplayQueryResultsDisplayQueryResultsDisplayQueryResults
Osnova
Výstup programus využitím GUI
74
6 Uložené procedury
• 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
75
Internet a zdroje na webu
• Sun Microsystems JDBC home page– Java.sun.com/products/jdbc
• SQL materials– www.sql.org
• Cloudscape database home page– www.cloudscape.com
76
7 Objektov ě relační mapování
• 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)
77
Význam ORM
• „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í
78
Dědičnost
• 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
79
Příklad hierarchie t říd
80
Mapování d ědičnosti
• 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
81
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’);
Horizontální mapování
id a b
id
id
a
a
C
C
d
e
B
D
E
82
Vertikální mapování
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’);
id a id c id e . . . . . .
CA E
83
Mapování pomocí unie
Vytvoř nový objekt typu B
INSERT INTO T(id, type, a, b) VALUES(100, ‘B’, ‘a’, ‘b’);
Vyber všechny hodnoty typu E
SELECT id,a,c,e FROM T WHERE type=‘E’;
Vyber konkrétní hodnotu typu E
SELECT a,c,e FROM T WHERE id=100;
Vyber všechny hodnoty a (např. login a jméno všech osob)
SELECT a FROM T
id type a b c d e
T
84
Mapování pomocí unie
Vytvoř nový objekt typu B
INSERT INTO T1(id, type, a, b)VALUES(100,’B’,’a’,’b ’);
Vyber všechny hodnoty typu E
SELECT id, a, c, e FROM T2 WHERE type=‘E’;
Vyber konkrétní hodnotu typu E
SELECT a, c, e FROM T2 WHERE id= 100;
Vyber všechny hodnoty a (např. login a jméno všech osob)
(SELECT id, a FROM T1) UNION (SELECT id, a FROM T2)
id type c d ea
T2
id type ba
T1
85
Dědičnost - hodnocení
• 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
86
Strukturovaná data
• Zanořený objekt (např. adresa osoby)
• Kolekce (např. kontakty osoby)
87
Zanořené objekty
• Vložení atributů do vnějšího objektu
• Osamostatnění zanořeného objektu
id ulice psč obec
adresa
id id_adr id ulice psč obec
88
Vztahy
• 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
89
Vztah 1:1
Vyber hodnotu A příslušnou konkrétní hodnotě B
SELECT A.* FROM A,B WHERE A.b=B.id AND B.id=100
Vyber hodnotu A příslušnou konkrétní hodnotě B
SELECT B.* FROM A,B WHERE A.b=B.id AND A.id=100
id b id
b
a
A B
90
Vztah 1:N
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
id id a
A B
A
a
a
a
B
91
Vztah M:N
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
id a idb
A AB B
A B
92
Použití nástroj ů pro ORM
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
93
Přístupy k automatizaci ORM
• 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
94
Další informace
• http://java.sun.com/products/jdo/index.jsp
• http://www.hibernate.org