Databáze v Javě

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
m (Navázání spojení: Oprava vzhledu)
(Navázání spojení: Přidáno SQLite.)
 
(Není zobrazeno 9 mezilehlých verzí od 1 uživatele.)
Řádka 2: Řádka 2:
  
  
== Podporované databáze ==
+
== Jaké databázové stroje podporuje Java? ==
*JavaDB — je součástí JDK.
+
* Libovolná DB, podporující JDBC (například MySQL)
+
* Libovolná DB podporující ODBC
+
  
 +
=== 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.
  
== JavaDB ==
+
=== JDBC (Java DataBase Connectivity) ===
*Oraclem podporovaná distribuce databáze Apache Derby (opensource).
+
* Libovolná DB, podporující standard <code>JDBC</code>.
*Lze používat v režimu client-server
+
* Existují ovladače JDBC pro komunikaci s: MySQL, SQLite,...
*Transakční databáze.
+
 
*Rozhraní
+
=== ODBC (Open DataBaseConnectivity) ===
**jazyk SQL,
+
* Obecný standard pro komunikaci mezi aplikacemi a&nbsp;databázemi.
**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 24: Řá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) ===
+
 
 +
; 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 34: Řádka 39:
  
  
== Standard ODBC ==
+
== Ověření/ruční připojení k serveru ==
*Open DataBase Connectivity
+
* Záložka <code>Services</code> (vedle stromu projektu) <code>&rarr; Databases &rarr; Drivers </code>
*Obecný protokol pro připojení k databázi
+
* Vybrat <code>MySQL (Connector/J Driver)</code>
 +
* <code>Pravé tlačítko &rarr; Connect Using...</code>
 +
* Zadejte přihlašovací údaje a název databáze pro připojení k serveru.
 +
* V <code>Services</code> se vytvoří připojení, pomocí něj mohu editovat tabulky atd.
  
 +
<div class="Varovani">
 +
Většina databázových serverů nepodporuje připojení z dálky!
  
== Instalace ovladače JDBC ==
+
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]].
* Povolení přístupu k serveru z dálky viz [[Vzdálený přístup k databázi]].
+
</div>
  
=== Stažení ovladačů ===
 
* Pro MySQL [http://www.mysql.com/downloads/connector/j/ Connector/J].
 
**zazipováno včetně dokumentace
 
**nám stačí balíček JAR
 
  
=== Zařazení ovladače do projektu ===
+
== Zařazení ovladače JDBC do projektu (NetBeans 8) ==
; Pro JDK
+
* [http://download.oracle.com/javase/tutorial/jdbc/basics/gettingstarted.html Tutoriál Oracle]
+
; Pro NetBeans:
+
* Stáhnout: <http://www.linglom.com/2007/12/05/accessing-mysql-on-netbeans-using-jdbc-part-i-create-a-connection/>
+
**Rozbalit
+
**Soubor .JAR zkopírovat do složky <tt>lib</tt> v rámci projektu
+
*Zařazení ovladače:
+
**pravé tlačítko na projekt &rarr; Properties &rarr; Libraries &rarr; Add JAR File
+
**Najít <tt>mysql-connector-java....jar</tt> v <tt>lib</tt>.
+
*Ověření/ruční připojení
+
**Záložka Services (vedle stromu projektu)-> Databases-> Drivers
+
**Vybrat nebo přidat Connector/J
+
**Pravé tlačítko -> Connect Usign...
+
**V Services se vytvoří připojení, pomocí něj mohu editovat tabulky atd.
+
  
 +
* Pravé tlačítko na projekt &rarr; Properties &rarr; Libraries &rarr; Add Library...
 +
* 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ě (uvádíme variantu pro MySQL):
 +
* Stáhněte ovladač ručně z: [http://www.mysql.com/downloads/connector/j/ MySQL.com &rarr; Connector/J]
 +
* Rozbalte archiv s ovladačem, stačí vám balíček JAR.
 +
* Zkopírujte balíček do složky <code>./lib</code> vašeho projektu.
 +
* <code>Project Properties &rarr; Libraries &rarr; Add JAR File</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>
+
Class.forName("com.mysql.jdbc.Connection");
**Class.forName("com.mysql.jdbc.Connection");
+
* resp. pro SQLite ''(Pozor na velikost písmen!!!):''
***throws <tt>ClassNotFoundException</tt>
+
Class.forName("org.sqlite.JDBC");
**Ovladač musí být přidán do projektu!
+
*Pokud ovladač není propojen, vyhodí: <tt>ClassNotFoundException</tt>.
*Varianta TCP/IP
+
 
** Obecné, lze se připojit ke vzdálenému serveru.
+
; A proveď připojení k databázi
**String url = "jdbc:mysql://" + host + "/" + database;
+
* MySQL:
**Connection con = DriverManager.getConnection(url, userDB, passDB);
+
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'');
=== Příklad kódu:===
+
* 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 96: Řá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 116: Řádka 124:
 
</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 149: Řá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()
+
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 187: Řá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 196: Řá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 &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]

Aktuální verze z 19. 11. 2018, 12:10


Obsah

Jaké databázové stroje podporuje Java?

JavaDB

JDBC (Java DataBase Connectivity)

ODBC (Open DataBaseConnectivity)


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ě (uvádíme variantu pro MySQL)

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í

Ověř přítomnost ovladače
Class.forName("com.mysql.jdbc.Connection");
Class.forName("org.sqlite.JDBC");
A proveď připojení k databázi
String url = "jdbc:mysql://" + adresa-serveru + "/" + název-databáze";
Connection con = DriverManager.getConnection(url, userDB, passDB);
String cestaKSouboru = "soubor.db";
Connection con = DriverManager.getConnection("jdbc:sqlite:"+cestaKSouboru);
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