Databáze v Javě
Z MiS
				
				
				(Rozdíly mezi verzemi)
				
																
				
				
								
				|  (→Zařazení ovladače JDBC do projektu (NetBeans 8)) |  (→Navázání spojení:  Přidáno SQLite.) | ||
| (Nejsou zobrazeny 3 mezilehlé verze od 1 uživatele.) | |||
| Řádka 3: | Řádka 3: | ||
| == Jaké databázové stroje podporuje Java? == | == Jaké databázové stroje podporuje Java? == | ||
| − | |||
| − | |||
| − | |||
| − | == JavaDB == | + | === JavaDB === | 
| + | * Databázový stroj je součástí JDK. | ||
| * 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 11: | ||
| * Rozhraní: jazyk SQL. | * Rozhraní: jazyk SQL. | ||
| * Vestavěný ovladač pro JDBC. | * Vestavěný ovladač pro JDBC. | ||
| + | |||
| + | === JDBC (Java DataBase Connectivity) === | ||
| + | * Libovolná DB, podporující standard <code>JDBC</code>. | ||
| + | * 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í == | == 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 28: | ||
| *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 37: | ||
| **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 53: | Řádka 56: | ||
| * Pravé tlačítko na projekt → Properties → Libraries → Add Library... | * Pravé tlačítko na projekt → Properties → Libraries → Add Library... | ||
| − | * V Global Libraries vyberte: <code>MySQL JDBC Driver</code>. | + | * V Global Libraries vyberte: | 
| + | ** Pro MySQL JDBC: <code>MySQL JDBC Driver</code>. | ||
| + | ** Pro SQLite JDBC: <code>SQLite Driver</code>. | ||
| − | ; Pokud ovladač v seznamu není, můžete ovladač přidat ručně: | + | ; 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: [http://www.mysql.com/downloads/connector/j/ MySQL.com → Connector/J] | * Stáhněte ovladač ručně z: [http://www.mysql.com/downloads/connector/j/ MySQL.com → Connector/J] | ||
| * Rozbalte archiv s ovladačem, stačí vám balíček JAR. | * Rozbalte archiv s ovladačem, stačí vám balíček JAR. | ||
| Řádka 63: | Řádka 68: | ||
| == 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 | |
| − | + |  Class.forName("com.mysql.jdbc.Connection"); | |
| − | * | + | * resp. pro SQLite ''(Pozor na velikost písmen!!!):'' | 
| − | * | + |  Class.forName("org.sqlite.JDBC"); | 
| − | + | *Pokud ovladač není propojen, vyhodí: <tt>ClassNotFoundException</tt>. | |
| − | + | ||
| − | * | + | ; A proveď připojení k databázi | 
| − | + | * MySQL: | |
| − | + |  String url = "jdbc:mysql://" + ''adresa-serveru'' + "/" + ''název-databáze''"; | |
| − | ** <tt>java.sql.SQLException</tt> při chybě připojení | + |  Connection con = DriverManager.getConnection(url, ''userDB'', ''passDB''); | 
| − | + | * SQLite: | |
| + |  String cestaKSouboru = "soubor.db"; | ||
| + |  Connection con = DriverManager.getConnection("jdbc:sqlite:"+cestaKSouboru); | ||
| + | * 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 104: | ||
|       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 124: | ||
| </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 141: | ||
| *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 180: | ||
|               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 189: | ||
|           } |           } | ||
| </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] | ||
Aktuální verze z 19. 11. 2018, 12:10
| 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ří.
