Databáze v Javě

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Zařazení ovladače JDBC do projektu (NetBeans 8))
(Přepracována struktura.)
Řádka 5: Řádka 5:
 
* <code>JavaDB</code> &mdash; databázový stroj je součástí JDK.
 
* <code>JavaDB</code> &mdash; 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 &mdash; The Java Database Connectivity]] ===
+
 
 +
; [[#JDBC|JDBC &mdash; 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) ===
+
 
 +
; 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.
 
 
== Standard ODBC ==
 
*Open DataBase Connectivity
 
*Obecný protokol pro připojení k databázi
 
  
  
Řádka 61: Řádka 59:
 
* <code>Project Properties &rarr; Libraries &rarr; Add JAR File</code>
 
* <code>Project Properties &rarr; Libraries &rarr; 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 ==
=== Třídy ===
+
=== Import tříd ===
*import java.sql.Connection;
+
import java.sql.Connection;
**Reprezentuje připojení k databázi.
+
import java.sql.DriverManager;
*import java.sql.DriverManager;
+
import java.sql.ResultSet;
*import java.sql.ResultSet;
+
import java.sql.SQLException;
*import java.sql.SQLException;
+
import java.sql.Statement;
*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");
+
Class.forName("com.mysql.jdbc.Connection");
***throws <tt>ClassNotFoundException</tt>
+
*Pokud ovladač není propojen, vyhodí: <tt>ClassNotFoundException</tt>
**Ovladač musí být přidán do projektu!
+
String url = "jdbc:mysql://" + ''adresa-serveru'' + "/" + ''název-databáze''";
*Varianta TCP/IP
+
Connection con = DriverManager.getConnection(url, ''userDB'', ''passDB'');
** Obecné, lze se připojit ke vzdálenému serveru.
+
* Vyhodí <tt>java.sql.SQLException</tt> při chybě připojení
**String url = "jdbc:mysql://" + host + "/" + database;
+
; Příklad kódu:
**Connection con = DriverManager.getConnection(url, userDB, passDB);
+
** <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>
  
* Varianta s využitím pojmenované roury (named pipe)
+
<div class="Poznamka">
** Pouze pro připojení v rámci jednoho serveru.
+
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.
** Efektivnější varianta, ne vždy použitelná.
+
</div>
con = DriverManager.getConnection("jdbc:mysql:///test" + "?socketFactory=com.mysql.jdbc.NamedPipeSocketFactory", "''uzivatel''", "''heslo''");
+
 
+
=== Dotazy ===
+
* &rarr; viz [[#Dotazy v JDBC|třída Statement]]
+
 
+
=== Uzavření spojení ===
+
*con.isClosed()
+
*con.close()
+
* <tt>SQLException</tt> pokud se nepodaří
+
 
+
=== 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]
+
 
+
 
+
== Dotazy v JDBC ==
+
*Realizuje třída <tt>Statement</tt>
+
  
 
=== 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()
+
boolean rs.next()
**na začátku před první položkou
+
*na začátku čeká před první položkou výsledku
**každé volání posune na další položku
+
*každé volání funkce posune ukazatel na další položku
**vrací true, pokud další položka existuje
+
*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)
+
statement.executeUpdate(String insert_etc)
**vrací int:
+
*vrací int:  
***0 pro DDL
+
** počet změněných/vložených/smazaných řádků pro DML  
***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 ===
+
; 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 &rarr; Java: Database]
 
* [http://www.oracle.com/technetwork/java/javase/jdbc/index.html Oracle &rarr; Java: Database]
 
* [http://www.oracle.com/technetwork/java/overview-141217.html Oracle &rarr; JDBC Overview]
 
* [http://www.oracle.com/technetwork/java/overview-141217.html Oracle &rarr; JDBC Overview]

Verze z 16. 9. 2015, 12:03


Obsah

Jaké databázové stroje podporuje Java?

JavaDB


API pro práci s databází

JDBC — The Java Database Connectivity
Java Data Objects (JDO)


Ověření/ruční připojení k serveru

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)

Pokud ovladač v seznamu není, můžete ovladač přidat ručně


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í

Class.forName("com.mysql.jdbc.Connection");
String url = "jdbc:mysql://" + adresa-serveru + "/" + název-databáze";
Connection con = DriverManager.getConnection(url, userDB, passDB);
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

java.sql.Statement con.createStatement();

Select

statement.executeQuery(String select);
ResultSet statement.getResultSet();

ResultSet

boolean rs.next()
String rs.getString(číslo sloupce nebo název sloupce jako String)
int rs.getInt(...)
...
while (rs.next()) { ... }

Update, Insert, Delete, DDL

statement.executeUpdate(String insert_etc)

Obecný dotaz

statement.execute(String sql)
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()


Zdroje

Osobní nástroje
Jmenné prostory
Varianty
Akce
Výuka
Navigace
Nástroje