Databáze v Javě
Z MiS
(Rozdíly mezi verzemi)
(→Zařazení ovladače JDBC do projektu (NetBeans 8)) |
(Přepracována struktura.) |
||
Řádka 5: | Řádka 5: | ||
* <code>JavaDB</code> — databázový stroj je součástí JDK. | * <code>JavaDB</code> — databázový stroj je součástí JDK. | ||
* Libovolná DB, podporující standard <code>JDBC</code> (například MySQL). | * Libovolná DB, podporující standard <code>JDBC</code> (například MySQL). | ||
− | * Libovolná DB podporující standard <code>ODBC</code>. | + | * Libovolná DB podporující obecný standard <code>ODBC</code> (Open DataBase Connectivity). |
− | == JavaDB == | + | === JavaDB === |
* Oraclem podporovaná distribuce databáze Apache Derby (opensource). | * Oraclem podporovaná distribuce databáze Apache Derby (opensource). | ||
* Lze používat v režimu client-server. | * Lze používat v režimu client-server. | ||
Řádka 13: | Řádka 13: | ||
* Rozhraní: jazyk SQL. | * Rozhraní: jazyk SQL. | ||
* Vestavěný ovladač pro JDBC. | * Vestavěný ovladač pro JDBC. | ||
+ | |||
== API pro práci s databází == | == API pro práci s databází == | ||
− | + | ||
+ | ; [[#JDBC|JDBC — The Java Database Connectivity]] | ||
*Průmyslový standard pro propojení aplikací Javy s SQL databází, tabulkovými daty, soubory. | *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 | *Implementace připojení k databázi pro Javu: obecné propojení na SQL databázi | ||
Řádka 21: | Řádka 23: | ||
*JDBC-ODBC Bridge Driver | *JDBC-ODBC Bridge Driver | ||
**Ovladač pro databáze standardu ODBC. | **Ovladač pro databáze standardu ODBC. | ||
− | + | ||
+ | ; Java Data Objects (JDO) | ||
*Implementace uložení dat (persistence) | *Implementace uložení dat (persistence) | ||
*Uložení objektů do databáze. | *Uložení objektů do databáze. | ||
Řádka 29: | Řádka 32: | ||
**Podporuje relační databáze. | **Podporuje relační databáze. | ||
**Aktuálně (2014) implementuje JDO 1.0.1, plánuje se podpora JDO 2.0. | **Aktuálně (2014) implementuje JDO 1.0.1, plánuje se podpora JDO 2.0. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
Řádka 61: | Řádka 59: | ||
* <code>Project Properties → Libraries → Add JAR File</code> | * <code>Project Properties → Libraries → Add JAR File</code> | ||
* Vyberte soubor: <code>mysql-connector-java...jar</code> | * Vyberte soubor: <code>mysql-connector-java...jar</code> | ||
+ | |||
== Práce s JDBC == | == 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; | |
− | + | ||
=== Navázání spojení === | === Navázání spojení === | ||
*Ověř přítomnost ovladače: | *Ověř přítomnost ovladače: | ||
**Třída: <tt>com.mysql.jdbc.Connection</tt> | **Třída: <tt>com.mysql.jdbc.Connection</tt> | ||
− | + | Class.forName("com.mysql.jdbc.Connection"); | |
− | * | + | *Pokud ovladač není propojen, vyhodí: <tt>ClassNotFoundException</tt> |
− | + | String url = "jdbc:mysql://" + ''adresa-serveru'' + "/" + ''název-databáze''"; | |
− | + | Connection con = DriverManager.getConnection(url, ''userDB'', ''passDB''); | |
− | + | * Vyhodí <tt>java.sql.SQLException</tt> při chybě připojení | |
− | + | ; Příklad kódu: | |
− | + | ||
− | * | + | |
− | + | ||
<div class="Priklad"> | <div class="Priklad"> | ||
// Zkontrolujeme instalaci ovladače | // Zkontrolujeme instalaci ovladače | ||
Řádka 94: | Řádka 90: | ||
System.exit(1); | System.exit(1); | ||
} | } | ||
− | + | ||
// Připojíme se | // Připojíme se | ||
String host = "192.168.1.1"; // IP databázového stroje nebo doménové jméno | String host = "192.168.1.1"; // IP databázového stroje nebo doménové jméno | ||
Řádka 114: | Řádka 110: | ||
</div> | </div> | ||
− | + | <div class="Poznamka"> | |
− | + | 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. | |
− | + | </div> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
=== Vytvoření dotazu === | === Vytvoření dotazu === | ||
+ | * Dotazy realizuje třída <tt>Statement</tt> | ||
java.sql.Statement con.createStatement(); | java.sql.Statement con.createStatement(); | ||
− | * <tt>SQLException</tt> při chybě přístupu k databázi | + | * Vyhodí <tt>SQLException</tt> při chybě přístupu k databázi |
=== Select === | === Select === | ||
Řádka 147: | Řádka 127: | ||
*návratová hodnota | *návratová hodnota | ||
*každým dalším provedeným dotazem se předchozí smaže | *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 | + | *Přístup k datům výsledku: |
String rs.getString(''číslo sloupce nebo název sloupce jako String'') | String rs.getString(''číslo sloupce nebo název sloupce jako String'') | ||
int rs.getInt(...) | int rs.getInt(...) | ||
... | ... | ||
+ | * Sloupce dotazu jsou číslovány od 1. | ||
*Použití: | *Použití: | ||
while (rs.next()) { ... } | while (rs.next()) { ... } | ||
=== Update, Insert, Delete, DDL === | === 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 | |
− | * <tt>SQLException</tt> při chybě při provádění dotazu | + | * Vyhodí <tt>SQLException</tt> při chybě při provádění dotazu |
− | === Obecný === | + | === Obecný dotaz === |
statement.execute(String sql) | statement.execute(String sql) | ||
*vrací boolean | *vrací boolean | ||
*výsledky můžeme získat dodatečně | *výsledky můžeme získat dodatečně | ||
− | + | ; Příklad kódu | |
<div class="Priklad"> | <div class="Priklad"> | ||
Statement st = null; | Statement st = null; | ||
− | + | ||
try { | try { | ||
st = con.createStatement(); | st = con.createStatement(); | ||
Řádka 185: | Řádka 166: | ||
Logger.getLogger(DatabazePrvni.class.getName()).log(Level.SEVERE, null, ex); | Logger.getLogger(DatabazePrvni.class.getName()).log(Level.SEVERE, null, ex); | ||
} | } | ||
− | + | ||
if (con != null) { | if (con != null) { | ||
try { | try { | ||
Řádka 194: | Řádka 175: | ||
} | } | ||
</div> | </div> | ||
+ | |||
+ | === Uzavření spojení === | ||
+ | con.isClosed() | ||
+ | con.close() | ||
+ | * Vyhodí <tt>SQLException</tt> pokud se nepodaří. | ||
+ | |||
== Zdroje == | == Zdroje == | ||
+ | * [http://forums.mysql.com/read.php?39,61124,61129#msg-61129 Forums.MySQL.com] | ||
+ | * [http://www.stardeveloper.com/articles/display.html?article=2003090201&page=4 StartDeveloper.com] | ||
* [http://www.oracle.com/technetwork/java/javase/jdbc/index.html Oracle → Java: Database] | * [http://www.oracle.com/technetwork/java/javase/jdbc/index.html Oracle → Java: Database] | ||
* [http://www.oracle.com/technetwork/java/overview-141217.html Oracle → JDBC Overview] | * [http://www.oracle.com/technetwork/java/overview-141217.html Oracle → JDBC Overview] |
Verze z 16. 9. 2015, 12:03
Obsah |
Jaké databázové stroje podporuje Java?
-
JavaDB
— databázový stroj je součástí JDK. - Libovolná DB, podporující standard
JDBC
(například MySQL). - Libovolná DB podporující obecný standard
ODBC
(Open DataBase Connectivity).
JavaDB
- 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.
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
Services
se 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:
MySQL JDBC Driver
.
- Pokud ovladač v seznamu není, můžete ovladač přidat ručně
- 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
./lib
vaš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:
- Třída: com.mysql.jdbc.Connection
Class.forName("com.mysql.jdbc.Connection");
- Pokud ovladač není propojen, vyhodí: ClassNotFoundException
String url = "jdbc:mysql://" + adresa-serveru + "/" + název-databáze"; Connection con = DriverManager.getConnection(url, userDB, passDB);
- 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ří.