jdbc
Skapa en databasanslutning
Sök…
Syntax
DB_URL = "jdbc: DBMS: // DB_HOST: DB_PORT / DB_NAME"
DBMS: Data Base Driver Manager, detta kan vara vilken som helst DBMS (mysql, oracle, postgresql, sqlite, ...), exemple av mysql: "com.mysql.jdbc.Driver"
DB_HOST: din databasvärd, IP-adressen till din databaseksempel: 10.6.0.1, standard är localhost eller 127.0.0.1
DB_PORT: Databasport, varje DBMS har en defeaut port exemple mysql = 3306, postegesql = 5432
DB_NAME: namnet på din databas
För att ansluta bör du få en referens till klassobjektet,
Class.forName (DRIVER);
Och för att ansluta till databasen måste du skapa en anslutning
java.sql.Connection con = DriverManager.getConnection (DB_URL, DB_USER_NAME, DB_PASSWORD);
DB_USER_NAME: användarnamnet för din databse
DB_PASSWORD: ditt databas lösenord
Introduktion (SQL)
Sedan Java 6 är det rekommenderade sättet att komma åt en SQL-baserad databas i Java via JDBC (Java DataBase Connectivity) API.
Detta API finns i två paket: java.sql
och javax.sql
.
JDBC definierar databasinteraktioner när det gäller Connections
och Drivers
.
En Driver
interagerar med databasen och tillhandahåller ett förenklat gränssnitt för att öppna och hantera anslutningar. De flesta databaseserversorter (PostgreSQL, MySQl, etc.) har sina egna Drivers
, som hanterar installation, nedbrytning och översättning som är specifik för den servern. Drivers
brukar inte nås direkt; snarare används gränssnittet från DriverManager
objektet istället.
DriverManager
objektet är i huvudsak JDBC: s kärna. Det ger ett (mestadels) databas-agnostiskt gränssnitt för att skapa Connections
. För äldre versioner av JDBC API måste databasspecifika Drivers
laddas innan DeviceManager
kunde skapa en anslutning till den databastypen.
En Connection
är, som namnet antyder, en representation av en öppen anslutning till databasen. Connections
är databasagnostiska och skapas och tillhandahålls av DriverManager
. De tillhandahåller ett antal 'genvägsmetoder' för vanliga frågestyper, liksom ett rått SQL-gränssnitt.
Använda anslutningen (och uttalanden)
När vi har fått Connection
kommer vi mest att använda den för att skapa Statement
objekt. Statements
representerar en enda SQL-transaktion; de används för att köra en fråga och hämta resultaten (om några). Låt oss titta på några exempel:
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
}
}
Skapa en anslutning med java.sql.DriverManager
För att ansluta med java.sql.DriverManager
behöver du en JDBC url för att ansluta till din databas. JDBC-webbadresser är databasspecifika, men de är alla i formen
jdbc:<subprotocol>:<subname>
Där <subprotocol>
identifierar drivrutinen eller databasen (till exempel postgresql
, mysql
, firebirdsql
, etc) och <subname>
är subprotokollspecifikt.
Du måste kontrollera dokumentationen för din databas och JDBC-drivrutin för det specifika url-subprotokollet och formatet för din drivrutin.
Ett enkelt exempel för att skapa en anslutning till en databas med url jdbc:somedb://localhost/foobar
:
try (Connection connection = DriverManager.getConnection(
"jdbc:somedb://localhost/foobar", "anna", "supersecretpassword")) {
// do something with connection
}
Vi använder ett försök med resurser här så att anslutningen stängs automatiskt när vi är klara med det, även om undantag inträffar.
På Java 6 (JDBC 4.0) och tidigare är try-with-resources inte tillgängliga. I dessa versioner måste du använda en finally
-block för att uttryckligen stänga en anslutning:
Connection connection = DriverManager.getConnection(
"jdbc:somedb://localhost/foobar", "anna", "supersecretpassword");
try {
// do something with connection
} finally {
// explicitly close connection
connection.close();
}
JDBC 4.0 (Java 6) introducerade konceptet automatisk laddning av drivrutiner. Om du använder Java 5 eller tidigare, eller en äldre JDBC-drivrutin som inte implementerar JDBC 4-stöd, måste du ladda drivrutinen / drivrutinerna uttryckligen:
Class.forName("org.example.somedb.jdbc.Driver");
Den här raden måste inträffa (minst) en gång i ditt program innan någon anslutning upprättas.
Även i Java 6 och högre med en JDBC 4.0 kan det vara nödvändigt att ladda en drivrutin uttryckligen: till exempel i webbapplikationer när drivrutinen inte laddas i behållaren utan som en del av webbapplikationen.
Alternativt kan du också ge en Properties
objekt att ansluta:
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
}
Eller till och med utan egenskaper, till exempel om databasen inte behöver användarnamn och lösenord:
try (Connection connection = DriverManager.getConnection(
"jdbc:somedb://localhost/foobar")) {
// do something with connection
}
Skapa en anslutning till MySQL
För att ansluta till MySQL måste du använda MySQL Connector / J-drivrutinen. Du kan ladda ner den från http://dev.mysql.com/downloads/connector/j/ eller så kan du använda Maven:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
Den grundläggande JDBC-URL för MySQL är:
jdbc:mysql://<hostname>[:<port>]/<database>[?<propertyName>=<propertyValue>[&<propertyName>=<propertyValue>]...]
Var:
Nyckel | Beskrivning | Exempel |
---|---|---|
<hostname> | Värdnamn på MySQL-servern | localhost |
<port> | Port på MySQL-servern (valfritt, standard: 3306) | 3306 |
<database> | Databasens namn | foobar |
<propertyName> | Namn på en anslutningsegenskap | useCompression |
<propertyValue> | Värdet på en anslutningsegenskap | true |
Den stödda URL: n är mer komplex än ovan, men det räcker för de flesta "normala" behov.
För att ansluta användning:
try (Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost/foobardb", "peter", "nicepassword")) {
// do something with connection
}
För äldre Java / JDBC-versioner:
// 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();
}
Anslutning till en Microsoft Access-databas med UCanAccess
UCanAccess är en ren Java JDBC
drivrutin som gör att vi kan läsa från och skriva till Access-databaser utan att använda ODBC
. Den använder två andra paket, Jackcess
och HSQLDB
, för att utföra dessa uppgifter.
När det har konfigurerats * kan vi arbeta med data i .accdb- och .mdb-filer med hjälp av kod som denna:
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));
}
* För mer information se följande fråga:
Hantera en Access-databas från Java utan ODBC
Oracle JDBC-anslutning
Förare:
( Obs: föraren ingår inte i Maven Central!)
Initiering av förarklass:
Class.forName("oracle.jdbc.driver.OracleDriver");
Anslutnings-URL
Äldre format, med SID
"jdbc:oracle:thin:@<hostname>:<port>:<SID>"
Nyare format med servicenamn
"jdbc:oracle:thin:@//<hostname>:<port>/<servicename>"
Tnsnames som post
"jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=<hostname>)(PORT=<port>))"
+"(CONNECT_DATA=(SERVICE_NAME=<servicename>)))"
RAC-klusteranslutningssträng 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)))"
Exempel
connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "HR", "HRPASS");