JDBC

JDBC Links

JDBC Anwendungen

Verbindung aufbauen:

Class.forName("org.apache.derby.jdbc.EmbeddedDriver");

String myURL="jdbc:MyDB:MYTable"
Connection conn=DriverManager.getConnection(myURL);
Connection conn=DriverManager.getConnection(myURL, "MyUserName", "MyPassword");

Andere Variante um Verbindung aufzubauen:

InitialContext ic=new InitialContext();
DataSource ds=ic.lookup("java:comp/env/jdbc/myDB");
DataSource ds=(DataSource) org.apache.derby.jdbc.ClientDataSource();
ds.setPort(1234);
ds.setHost("localhost");
ds.setUser("MyUserName");
ds.setPassoword("MyPassword");

Noch eine Variante um eine Verbindung aufzubauen (getestet mit Oracle). Die passende jar-Datei mit dem Thin-Client für den Zugriff auf Oracle Datenbanken gibt es hier: JDBC Client Oracle. Diese jar-Datei muss in das Projekt eingebunden werden.

OracleDataSource ods= new OracleDataSource();
ods.setUser("mrfoo");
ods.setPassword("supersecret");
ods.setServerName("myoracleserver.example.com");
ods.setDatabaseName("XE");
ods.setPortNumber(1521);
ods.setDriverType("thin");
OracleConnection conn = (OracleConnection)ods.getConnection();

Fehler:

Exception in thread "main" java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

Der übergebene Datenbankname (hier XE) ist nicht auf dem Server bekannt. Wenn man nicht weiß wie die Datenbank heißt auf dem Server das Kommandozeilentool lsnrctl benutzen und nach Zeilen mit Instance suchen (in folgendem Beispiel heißt die Datenbank tatsächlich XE):

# lsnrctl services
...
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
...
Instance "XE", status READY, has 1 handler(s) for this service...
...
Instance "XE", status READY, has 1 handler(s) for this service...
...
Instance "XE", status READY, has 1 handler(s) for this service...
...
The command completed successfully

Daten auslesen und schreiben

Connection con=DriverManager.getConnection("jdbc:mySubprotocol:mySubName");
Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet srs=stmt.executeQuery("Select price FROM products WHERE price=11.24");
SQLWarning warn=srs.getWarnings();
if (warn!=null) { warn.getMessage(); warn.getSQLState(); warn.getErrorCode(); ... }

while (srs.next())
{
 srs.updateFloat("price", srs.getFloat("Price")+2);
 srs.updateRow();  // commit
}

ResultSet folgendes:

beforeFirst(); // default am Anfang
afterLast();
next();
previous();
relative(int r);
absoulute(int r); // *
  • r=-2 wäre die zweit letzte Zeilen am Ende der Tabelle

Prepared Statements

PreparedStatement ps=con.prepareStatement("UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?");

Jetzt an zu benennender Stelle den zu nennenden Wert einsetzten:

ps.setInt(1, 75);
ps.setString(2,'FOO');
ps.executeUpdate();

Das geht auch auch direkt mit einer normalen Query:

Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSETIVE);
Stmt.executeUpdate("Select * FROM ...");

int ExecuteUpdate() liefert die Anzahl der Zeilen zurück die verändert wurden, ResultSet executeQuery() liefert das Ergebnis der Anfrage aus der DB.

Transaktionen

Class.forName("myDriver.ClassName");
Connection con=null;
 try
 {
  con=DriverManager.getConnection("jdbc:mySubprotocol:myDataSource");
  con.setAutoCommit(false); // *
  for (int i=...)
  {
   Statement stmt=con.createStatement();
   stmt.executeUpdate("INSERT ...");
   con.commit(); // *
  }
  stmt.close();
  con.close();
 }
 catch (SQLException ex)
 {
  if (con!=null) con.rollback(); // *
 }

Alternativ mit Savepoint

Savepoint s1=conn.setSavepoint("tg1");
conn.rollback(s1);

Savepoints löschen:

conn.release(s1);

Oder durch normalen commit Informationen speichern (geht savepoint auch verloren)

conn.commit();

Stored Procedures Je nach DB etwas anderer Syntax, im pseudocode etwa so:

String myProcedure="create procedure FOO as
 select name, age from FRIENDS where age > 50 and age < 75"
;

Jetzt in DB laden:

Statement stmt=con.createStatement();
stmt.executeUpdate(myProcedure);

Und bei Bedarf aufrufen:

CallableStatement cs=con.prepareCall("{CALL FOO}");
ResultSet rs=cs.executeQuery();

SQLite JDBC Java

Zurück zur .

Mit einem SQLite JDBC jar kann man via JDBC auf eine SQLite Datenbank Datei auf dem Computer zugreifen.

SQLite Java JDBC Beispiel

package de.tgunkel.JAVA.Demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SQLiteDemo
{
    /**
     * Init JDBC and return a connection for the SQLite DB your provide
     * @param pSQLiteDB Your SQLite DB (complete path to file). Example: C:/temp/mySQLiteDatabase.db
     * @return JDBC Connection
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    private Connection intAndConnection(String pSQLiteDB) throws ClassNotFoundException, SQLException
    {
        // load the sqlite-JDBC driver using the current class loader
        Class.forName("org.sqlite.JDBC");

        Connection connection = null;
        try
        {
            // create a database connection
            connection = DriverManager.getConnection("jdbc:sqlite:"+pSQLiteDB);            
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            throw e;
        }
        return connection;
    }

    /**
     * Example usage of SQLite JDBC usage
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    private void readData() throws ClassNotFoundException, SQLException
    {
        Connection connection_File=intAndConnection("C:/temp/SQLiteTest.db");
        Connection connection_InMemory=intAndConnection("memory");

        Statement statement = connection_File.createStatement();
        statement.setQueryTimeout(10);
        ResultSet rs = statement.executeQuery("select * from people");
        while(rs.next())
        {
            System.out.println("name = " + rs.getString("name"));
        }
    }
}