Databáze v Javě
Z MiS
Obsah |
Jaké databázové stroje podporuje Java?
JavaDB
- Databázový stroj je součástí JDK.
- Oraclem podporovaná distribuce databáze Apache Derby (opensource).
- Lze používat v režimu client-server.
- Jedná se o transakční databázi.
- Rozhraní: jazyk SQL.
- Vestavěný ovladač pro JDBC.
JDBC (Java DataBase Connectivity)
- Libovolná DB, podporující standard
JDBC. - Existují ovladače JDBC pro komunikaci s: MySQL, SQLite,...
ODBC (Open DataBaseConnectivity)
- Obecný standard pro komunikaci mezi aplikacemi a databázemi.
API pro práci s databází
- Průmyslový standard pro propojení aplikací Javy s SQL databází, tabulkovými daty, soubory.
- Implementace připojení k databázi pro Javu: obecné propojení na SQL databázi
- Realizována ovladačem pro konkrétní databázový stroj.
- JDBC-ODBC Bridge Driver
- Ovladač pro databáze standardu ODBC.
- Java Data Objects (JDO)
- Implementace uložení dat (persistence)
- Uložení objektů do databáze.
- Existují opensource i komerční implementace.
- Příklad implemetace: Speedo
- nekomerční
- Podporuje relační databáze.
- Aktuálně (2014) implementuje JDO 1.0.1, plánuje se podpora JDO 2.0.
Ověření/ruční připojení k serveru
- Záložka
Services(vedle stromu projektu)→ Databases → Drivers - Vybrat
MySQL (Connector/J Driver) -
Pravé tlačítko → Connect Using... - Zadejte přihlašovací údaje a název databáze pro připojení k serveru.
- V
Servicesse vytvoří připojení, pomocí něj mohu editovat tabulky atd.
Většina databázových serverů nepodporuje připojení z dálky!
Na vlastním serveru můžete pro konfiguraci nastavení přístupu z dálky použít návod: Vzdálený přístup k databázi.
Zařazení ovladače JDBC do projektu (NetBeans 8)
- Pravé tlačítko na projekt → Properties → Libraries → Add Library...
- V Global Libraries vyberte:
- Pro MySQL JDBC:
MySQL JDBC Driver. - Pro SQLite JDBC:
SQLite Driver.
- Pro MySQL JDBC:
- Pokud ovladač v seznamu není, můžete ovladač přidat ručně (uvádíme variantu pro MySQL)
- Stáhněte ovladač ručně z: MySQL.com → Connector/J
- Rozbalte archiv s ovladačem, stačí vám balíček JAR.
- Zkopírujte balíček do složky
./libvašeho projektu. -
Project Properties → Libraries → Add JAR File - Vyberte soubor:
mysql-connector-java...jar
Práce s JDBC
Import tříd
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;
- Ověř přítomnost ovladače
Class.forName("com.mysql.jdbc.Connection");
- resp. pro SQLite (Pozor na velikost písmen!!!):
Class.forName("org.sqlite.JDBC");
- Pokud ovladač není propojen, vyhodí: ClassNotFoundException.
- A proveď připojení k databázi
- MySQL:
String url = "jdbc:mysql://" + adresa-serveru + "/" + název-databáze"; Connection con = DriverManager.getConnection(url, userDB, passDB);
- SQLite:
String cestaKSouboru = "soubor.db";
Connection con = DriverManager.getConnection("jdbc:sqlite:"+cestaKSouboru);
- Vyhodí java.sql.SQLException při chybě připojení
- Příklad kódu
// Zkontrolujeme instalaci ovladače
try {
Class.forName("com.mysql.jdbc.Connection");
} catch (ClassNotFoundException ex) {
JOptionPane.showMessageDialog(
null,
"Ovladač databáze není správně zahrnut do projektu! Nenalezena třída: "+ ex.getMessage()+"!",
"Chyba ovladače JDBC",
JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
// Připojíme se
String host = "192.168.1.1"; // IP databázového stroje nebo doménové jméno
String nazevDatabaze = "programovani";
String userDB = "progoa";
String passDB = "progoauh";
String url = "jdbc:mysql://" + host + "/" + nazevDatabaze;
Connection con = null;
try {
con = DriverManager.getConnection(url, userDB, passDB);
} catch (SQLException ex) {
JOptionPane.showMessageDialog(
null,
"Chyba při otevření spojení s s databází:"+ ex.getMessage(),
"Chyba spojení s databází", JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
Pro připojení v rámci jednoho počítače můžeme použít pojmenovanou rouru (named pipe). Touto variantou se zde nebudeme zabývat.
Vytvoření dotazu
- Dotazy realizuje třída Statement
java.sql.Statement con.createStatement();
- Vyhodí SQLException při chybě přístupu k databázi
Select
statement.executeQuery(String select);
- Výsledky získáme
ResultSet statement.getResultSet();
ResultSet
- návratová hodnota
- každým dalším provedeným dotazem se předchozí smaže
boolean rs.next()
- na začátku čeká před první položkou výsledku
- každé volání funkce posune ukazatel na další položku
- vrací true, pokud další položka existuje
- Přístup k datům výsledku:
String rs.getString(číslo sloupce nebo název sloupce jako String) int rs.getInt(...) ...
- Sloupce dotazu jsou číslovány od 1.
- Použití:
while (rs.next()) { ... }
Update, Insert, Delete, DDL
statement.executeUpdate(String insert_etc)
- vrací int:
- počet změněných/vložených/smazaných řádků pro DML
- 0 pro dotazy DDL
- Vyhodí SQLException při chybě při provádění dotazu
Obecný dotaz
statement.execute(String sql)
- vrací boolean
- výsledky můžeme získat dodatečně
- Příklad kódu
Statement st = null;
try {
st = con.createStatement();
ResultSet rs = null;
rs = st.executeQuery("SELECT * FROM uzivatele");
int pocetRadku = st.executeUpdate("INSERT INTO uzivatele VALUES ('karel', PASSWORD('x'));");
} catch (SQLException ex) {
Logger.getLogger(DatabazePrvni.class.getName()).log(Level.SEVERE, null, ex);
}
if (con != null) {
try {
con.close();
} catch (SQLException ex) {
Logger.getLogger(DatabazePrvni.class.getName()).log(Level.SEVERE, null, ex);
}
}
Uzavření spojení
con.isClosed() con.close()
- Vyhodí SQLException pokud se nepodaří.