jdbc
Datenbankverbindung erstellen
Suche…
Syntax
DB_URL = "jdbc: DBMS: // DB_HOST: DB_PORT / DB_NAME"
DBMS: Data Base Driver Manager, dies kann ein beliebiges DBMS sein (mysql, oracle, postgresql, sqlite, ...), zum Beispiel mysql: "com.mysql.jdbc.Driver"
DB_HOST: Ihr Datenbank-Basishost, die IP-Adresse Ihres Datenbankbeispiels: 10.6.0.1, der Standardwert ist localhost oder 127.0.0.1
DB_PORT: Datenbankport, jedes DBMS hat einen defeaut-Port, zum Beispiel mysql = 3306, postegesql = 5432
DB_NAME: Der Name Ihrer Datenbank
Um eine Verbindung herzustellen, erhalten Sie einen Verweis auf das Klassenobjekt.
Class.forName (DRIVER);
Und um eine Verbindung zur Datenbank herzustellen, müssen Sie eine Verbindung herstellen
java.sql.Connection con = DriverManager.getConnection (DB_URL, DB_USER_NAME, DB_PASSWORD);
DB_USER_NAME: der Benutzername Ihrer Datenbank
DB_PASSWORD: das Passwort Ihrer Datenbank
Einführung (SQL)
Seit Java 6 ist der Zugriff auf eine SQL-basierte Datenbank in Java die Verwendung der JDBC-API (Java DataBase Connectivity).
Diese API ist in zwei Paketen erhältlich: java.sql
und javax.sql
.
JDBC definiert Datenbankinteraktionen in Bezug auf Connections
und Drivers
.
Ein Driver
interagiert mit der Datenbank und stellt eine vereinfachte Schnittstelle zum Öffnen und Verwalten von Verbindungen bereit. Die meisten Datenbankservervarianten (PostgreSQL, MySQl usw.) verfügen über eigene Drivers
, die das Setup, den Abbau und die Übersetzung für diesen Server durchführen. Drivers
wird normalerweise nicht direkt zugegriffen. DriverManager
wird stattdessen die vom DriverManager
Objekt bereitgestellte Schnittstelle verwendet.
Das DriverManager
Objekt ist im Wesentlichen der Kern von JDBC. Es bietet eine (meistens) datenbankunabhängige Schnittstelle zum Erstellen von Connections
. Bei älteren Versionen der JDBC-API mussten datenbankspezifische Drivers
geladen werden, bevor DeviceManager
eine Verbindung zu diesem Datenbanktyp herstellen konnte.
Eine Connection
ist, wie der Name schon sagt, eine Darstellung einer offenen Verbindung zur Datenbank. Connections
sind datenbankunabhängig und werden vom DriverManager
erstellt und bereitgestellt. Sie bieten eine Reihe von "Shortcut" -Methoden für gängige Abfragetypen sowie eine unformatierte SQL-Schnittstelle.
Verwendung der Verbindung (und Anweisungen)
Sobald wir die Connection
, verwenden wir sie hauptsächlich zum Erstellen von Statement
. Statements
repräsentieren eine einzelne SQL-Transaktion. Sie werden zum Ausführen einer Abfrage und zum Abrufen der Ergebnisse (falls vorhanden) verwendet. Schauen wir uns einige Beispiele an:
public void useConnection() throws SQLException{
Connection conn = getConnection();
//We can use our Connection to create Statements
Statement state = conn.getStatement();
//Statements are most useful for static, "one-off" queries
String query = "SELECT * FROM mainTable";
boolean sucess = state.execute(query);
//The execute method does exactly that; it executes the provided SQL statement, and returns true if the execution provided results (i.e. was a SELECT) and false otherwise.
ResultSet results = state.getResultSet();
//The ResultSet object represents the results, if any, of an SQL statement.
//In this case, the ResultSet contains the return value from our query statement.
//A later example will examine ResultSets in more detail.
ResultSet newResults = state.executeQuery(query)
//The executeQuery method is a 'shortcut' method. It combines the execute and getResultSet methods into a single step.
//Note that the provided SQL query must be able to return results; typically, it is a single static SELECT statement.
//There are a number of similar 'shortcut' methods provided by the Statement interface, including executeUpdate and executeBatch
//Statements, while useful, are not always the best choice.
String newQuery = "SELECT * FROM mainTable WHERE id=?";
PreparedStatement prepStatement = conn.prepareStatement(newQuery);
//PreparedStatements are the prefed alternative for variable statements, especially ones that are going to be executed multiple times
for(int id:this.ids){
prepStatement.setInt(1,id);
//PreparedStatements allow you to set bind variables with a wide variety of set methods.
//The first argument to any of the various set methods is the index of the bind variable you want to set. Note that this starts from 1, not 0.
ResultSet tempResults = prepStatement.executeQuery()
//Just like Statements, PreparedStatements have a couple of shortcut methods.
//Unlike Statements, PreparedStatements do not not take a query string as an argument to any of their execute methods.
//The statement that is executed is always the one passed to the Connector.prepareStatement call that created the PreparedStatement
}
}
Erstellen einer Verbindung mit java.sql.DriverManager
Für die Verbindung mit java.sql.DriverManager
benötigen Sie eine JDBC-URL, um eine Verbindung zu Ihrer Datenbank java.sql.DriverManager
. JDBC-URLs sind datenbankspezifisch, haben jedoch alle die Form
jdbc:<subprotocol>:<subname>
Dabei bezeichnet <subprotocol>
den Treiber oder die Datenbank (z. B. postgresql
, mysql
, firebirdsql
usw.) und <subname>
ist subprotokollspezifisch.
Sie müssen die Dokumentation Ihrer Datenbank und Ihres JDBC-Treibers auf das spezifische URL-Subprotokoll und das Format für Ihren Treiber überprüfen.
Ein einfaches Beispiel zum Erstellen einer Verbindung zu einer Datenbank mit der URL jdbc:somedb://localhost/foobar
:
try (Connection connection = DriverManager.getConnection(
"jdbc:somedb://localhost/foobar", "anna", "supersecretpassword")) {
// do something with connection
}
Wir verwenden hier eine Try-With-Ressource , so dass die Verbindung automatisch geschlossen wird, sobald wir damit fertig sind, selbst wenn Ausnahmen auftreten.
Auf Java 6 (JDBC 4.0) und früheren Versionen sind Try-With-Ressourcen nicht verfügbar. In diesen Versionen müssen Sie einen finally
Block verwenden, um eine Verbindung explizit zu schließen:
Connection connection = DriverManager.getConnection(
"jdbc:somedb://localhost/foobar", "anna", "supersecretpassword");
try {
// do something with connection
} finally {
// explicitly close connection
connection.close();
}
Mit JDBC 4.0 (Java 6) wurde das Konzept des automatischen Treiberladens eingeführt. Wenn Sie Java 5 oder eine frühere Version oder einen älteren JDBC-Treiber verwenden, der keine JDBC 4-Unterstützung implementiert, müssen Sie die Treiber explizit laden:
Class.forName("org.example.somedb.jdbc.Driver");
Diese Zeile muss (mindestens) einmal in Ihrem Programm vorhanden sein, bevor eine Verbindung hergestellt wird.
Selbst in Java 6 und höher mit JDBC 4.0 kann es erforderlich sein, einen Treiber explizit zu laden: beispielsweise in Webanwendungen, wenn der Treiber nicht in den Container, sondern als Teil der Webanwendung geladen wird.
Alternativ können Sie auch ein Properties
für die Verbindung angeben:
Properties props = new Properties();
props.setProperty("user", "anna");
props.setProperty("password", "supersecretpassword");
// other, database specific, properties
try (Connection connection = DriverManager.getConnection(
"jdbc:somedb://localhost/foobar", props)) {
// do something with connection
}
Oder auch ohne Eigenschaften, zum Beispiel, wenn die Datenbank keinen Benutzernamen und kein Passwort benötigt:
try (Connection connection = DriverManager.getConnection(
"jdbc:somedb://localhost/foobar")) {
// do something with connection
}
Verbindung zu MySQL herstellen
Um sich mit MySQL zu verbinden, müssen Sie den MySQL Connector / J-Treiber verwenden. Sie können es von http://dev.mysql.com/downloads/connector/j/ herunterladen oder Sie können Maven verwenden:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
Die grundlegende JDBC-URL für MySQL lautet:
jdbc:mysql://<hostname>[:<port>]/<database>[?<propertyName>=<propertyValue>[&<propertyName>=<propertyValue>]...]
Woher:
Schlüssel | Beschreibung | Beispiel |
---|---|---|
<hostname> | Hostname des MySQL-Servers | localhost |
<port> | Port des MySQL-Servers (optional, Standard: 3306) | 3306 |
<database> | Name der Datenbank | foobar |
<propertyName> | Name einer Verbindungseigenschaft | useCompression |
<propertyValue> | Wert einer Verbindungseigenschaft | true |
Die unterstützte URL ist komplexer als oben angegeben, dies reicht jedoch für die meisten "normalen" Anforderungen aus.
Verbinden Sie sich mit:
try (Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost/foobardb", "peter", "nicepassword")) {
// do something with connection
}
Für ältere Java / JDBC-Versionen:
// Load the MySQL Connector/J driver
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost/foobardb", "peter", "nicepassword");
try {
// do something with connection
} finally {
// explicitly close connection
connection.close();
}
Verbindung zu einer Microsoft Access-Datenbank mit UCanAccess
UCanAccess ist ein reiner Java- JDBC
Treiber, mit dem Access-Datenbanken ohne ODBC
gelesen und darin geschrieben werden können. Es verwendet zwei andere Pakete, Jackcess
und HSQLDB
, um diese Aufgaben auszuführen.
Nach dem Einrichten * können wir mit Daten in .accdb- und .mdb-Dateien mit folgendem Code arbeiten:
import java.sql.*;
Connection conn=DriverManager.getConnection("jdbc:ucanaccess://C:/__tmp/test/zzz.accdb");
Statement s = conn.createStatement();
ResultSet rs = s.executeQuery("SELECT [LastName] FROM [Clients]");
while (rs.next()) {
System.out.println(rs.getString(1));
}
* Weitere Einzelheiten finden Sie in der folgenden Frage:
Bearbeiten einer Access-Datenbank von Java ohne ODBC
Oracle JDBC-Verbindung
Treiber:
( Hinweis: Der Treiber ist nicht in Maven Central enthalten!)
Initialisierung der Treiberklasse:
Class.forName("oracle.jdbc.driver.OracleDriver");
Verbindungs-URL
Älteres Format mit SID
"jdbc:oracle:thin:@<hostname>:<port>:<SID>"
Neueres Format mit Dienstname
"jdbc:oracle:thin:@//<hostname>:<port>/<servicename>"
TNS-Namen wie Eintrag
"jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=<hostname>)(PORT=<port>))"
+"(CONNECT_DATA=(SERVICE_NAME=<servicename>)))"
RAC-Cluster-Verbindungszeichenfolge für Failover
"jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=OFF)(FAILOVER=ON)"
+"(ADDRESS=(PROTOCOL=TCP)(HOST=<hostname1>)(PORT=<port1>))"
+"(ADDRESS=(PROTOCOL=TCP)(HOST=<hostname2>)(PORT=<port2>)))"
+"(CONNECT_DATA=SERVICE_NAME=<servicename>)(SERVER=DEDICATED)))"
Beispiel
connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "HR", "HRPASS");