Programovací jazyk Java
11. přednáška
Obsah
- Práce s relační databází prostřednictvím rozhraní JDBC
JDBC – Java Database Connectivity
- jednotné rozhraní pro přístup k jakékoliv databázi
- inspirované technologií ODBC (Open Database Connectivity) fy Microsoft
- jednotné = nezávislé na databázi
- výrobce databáze musí dodat JDBC driver (ovladač)
- umožňuje
- vykonávání SQL dotazů
- přístup k výsledkům dotazů
- balíky
- verze
- JDK 1.1 – JDBC 1.0
- JDK 1.2 – JDBC 2.0
- JDK 1.4 – JDBC 3.0
- JDK 1.6 – JDBC 4.0
Postup připojení k databázi
- Registrace ovladače databáze u aplikace pomocí metody forName(String className) třídy Class.
- Příklad registrace JDBC-ovladače databázového systému MySQL:
Class.forName("com.mysql.jdbc.Driver");
- Připojení k databázi: metoda getConnection(String url, String user, String password) třídy
DriverManager vrací spojení na databázi jako instanci třídy Connection.
- Příklad – připojujeme se k databázi knihovna databázového serveru MySQL na serveru
saturn.mendelu.cz, uživatel se jmenuje uziv a heslo je heslo:
Connection spojeni =
DriverManager.getConnection("jdbc:mysql://saturn.mendelu.cz/knihovna?useUnicode=true&characterEncoding=UTF-8",
"uziv", "heslo");
- Příklad – připojujeme se k databázi knihovna databázového serveru MySQL na lokálním počítači, uživatel
se jmenuje uziv a heslo je heslo:
Connection spojeni = DriverManager.getConnection("jdbc:mysql://localhost:3306/knihovna?characterEncoding=iso-8859-2&useUnicode=true",
"uziv", "heslo");
- Pozn.: Parametry useUnicode a characterEncoding nastavují formát kódování textu.
- Příprava na zadávání dotazů na databázi: z objektu reprezentujícího spojení na databázi (objekt typu
Connection) získáme metodou createStatement() objekt typu Statement.
- Příklad:
Statement stmt = spojeni.createStatement();
- Samotné zadávání dotazů na databázi je realizováno voláním následujících metod objektu typu Statement, jejichž
parametrem je String s SQL dotazem. Všechny tyto metody v případě neúspěšného volání dotazu vyhodí
SQLException:
- Metodou int executeUpdate(String sql) lze zadávat DML příkazy jazyka SQL, jako např. INSERT, UPDATE nebo
DELETE. Metoda pak vrací počet ovlivněných řádků. Při použití příkazů DDL (např. CREATE TABLE), které nic nevrací,
metoda vrací hodnotu 0.
Příklad:
stmt.executeUpdate("INSERT INTO knihy (autor, nazev) VALUES ('Božena Němcová', 'Dědeček');");
- Metoda ResultSet executeQuery(String sql) slouží k získávání dat z databáze prostřednictvím SQL dotazů. Metoda vrací
objekt typu ResultSet (viz níže).
Příklad:
ResultSet vysledek = stmt.executeQuery("SELECT * FROM knihy WHERE nazev='Dědeček'");
- Ve speciálních případech, kdy odpovědí na jeden SQL dotaz není jeden ResultSet nebo jeden údaj o počtu
ovlivněných řádků, použijeme metodu boolean execute(String sql). Návratová hodnota říká, jestli prvním
v řadě očekávaných výsledků je ResultSet (pak vrátí true) nebo int (pak vrátí
false). Návratovými hodnotami lze procházet pomocí metody getMoreResult() a hodnoty získávat
pomoci metod getResutSet() a getUpdateCount().
Práce s výsledkem typu ResultSet
Pohyb po řádcích tabulky v objektu typu ResultSet
- Pro procházení jednosměrné sady je poskytována metoda next().
- V obousměrné sadě je kromě metody next() možno použít i metody absolute (int row) (přesun
vnitřního ukazatele na řádek dle zadaného čísla), first() (přesun vnitřního ukazatele na první
řádek), last() (přesun vnitřního ukazatele na poslední řádek), relative (int row) (přesun
vnitřního ukazatele o zadaný počet řádků vpřed nebo vzad), previous() (přesun vnitřního ukazatele na
předchozí řádek), beforeFirst() (přesun vnitřního ukazatele před první řádek) a další.
Čtení hodnot z aktuálního záznamu
- Pro získání hodnot jednotlivých položek aktuálního záznamu poskytuje ResultSet metody getXxx(),
např. getString(), getInt, getBlob nebo getObject(). Pro každý typ dat existují
dvě varianty metody: první s jedním parametrem typu int a druhá s jedním parametrem
typu String.
Varianta s int slouží pro číselné označení sloupce, jehož údaj chceme přečíst. Pozor, index prvního
sloupce není 0, ale 1. Druhá varianta odkazuje na sloupec pomocí jeho jména.
- Je-li výsledková sada ResultSet citlivá na změny databáze (tzn. prvním parametrem metody createStatement()
byla konstanta ResultSet.TYPE_SCROLL_SENSITIVE), lze aktuální záznam aktualizovat z databáze
zavoláním metody refreshRow().
Úprava dat v objektu typu ResultSet
- Jestliže ovladač umožňuje aktualizaci dat přímo přes ResultSet, máme k dispozici celou řadu
metod updateXxx() pro různé datové typy. Metody updateXxx() jsou definovány ve
dvou variantách pro zadání sloupce a to buď indexem nebo názvem. Dále je možné přidat řádek metodou insertRow() a
nebo zrušit řádek metodou deleteRow(). Jsou k dispozici i metody rowDeleted(),
rowInserted() a rowUpdated(), které vracejí true nebo false.
- Promítnutí změn do databáze proběhne po spuštění metody updateRow()!
Ukončení práce s databází
- Při ukončení práce s databází je třeba uzavřít spojení na databázi. To se provádí pomocí metody close() na
objektu Connection. Při zavolání této metody dojde k uvolnění všech souvisejících objektů (tj.
Statement, ResultSet apod., na nichž lze mimochodem také zavolat metodu close() a tím tak
vynutit uvolnění pouze těchto objektů) a uvolnění samotného objektu Connection.
- Neměli bychom zapomínat vždy uvolnit všechny alokované prostředky a uzavřít otevřená spojení, a to i v případě
výskytu výjimky. Jako ideální se jeví použít konstrukci try–catch–finally:
Connection conn = null;
try {
conn = DriverManager.getConnection(url,"user","password");
//...
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
conn.close();
conn = null;
}
Podobně je vhodné zacházet i s instancemi Statement, ResultSet apod.:
Statement st = null;
try {
st = conn.createStatement();
//...
} catch (Exception e) {
e.printStackTrace();
} finally {
if (st != null) {
st.close();
st = null;
}
}
The End