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.

4,0

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();
}
4,0

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
}
4,0

För äldre Java / JDBC-versioner:

4,0
// 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");


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow