Développer en Java/Introduction à JDBC

Un livre de Wikilivres.

Pré-requis[modifier | modifier le wikicode]

JDBC permet de se connecter à une base de données relationnelle pour y exécuter des requêtes SQL.

Dans la suite de ce chapitre, nous considérons une relation r dont les attributs a et b sont respectivement de type chaîne et entier.

create table r (a varchar2(42), b number)

Selon le système de bases de donnée (SGBD) que vous utilisez, vous devrez fournir un pilote adapté. Chaque pilote est spécifique à un SGBD.

Il existe des pilotes pour les SGBD suivants :

Vous pourrez trouver le driver qui convient dans cette base de données : http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html.

Se connecter au serveur[modifier | modifier le wikicode]

Utiliser la classe DriverManager[1].

Lancer une requête[modifier | modifier le wikicode]

Les requêtes (Statement)[modifier | modifier le wikicode]

// Une requête simple
String ma_requete = "select a, b from r";

// Requête en utilisant un Statement
Statement ma_requete = ma_connexion.createStatement();

// On récupère le résultat dans un ResultSet
ResultSet mon_resultat = ma_requete.executeQuery(ma_requete);

Les « Prepared Statement »[modifier | modifier le wikicode]

On utilise les Prepared Statement quand il y a des inconnues dans la requête à exécuter. Dans le requête (la chaîne), chaque inconnue est remplacée par « ? ». Les méthodes setInt, setString etc. permettent de modifier les paramètres.

// Une requête simple
String ma_requete = "insert into r values(?, ?)";

// Requête en utilisant un Statement
PreparedStatement mon_prepared_statement = ma_connexion.prepareStatement();

// Le premier paramètre est une chaîne de caractères
mon_prepared_statement.setString(1,"VALEUR 1");
// Le second paramètre est un entier
mon_prepared_statement.setInt(2,1337);

Les « Callable Statement »[modifier | modifier le wikicode]

Les « Callable Statement » permettent de faire appel à des fonctions ou à des procédures stockées (PL/SQL ou PL/pgSQL) dans la base de données.

Lequel utiliser ?[modifier | modifier le wikicode]

Bien qu'il soit possible d'exécuter des requêtes paramétrées avec un Statement simple (par un jeu de rechercher-remplacer ou de concaténations multiples pour former la chaîne de caractère), cela est déconseillé pour des raisons de sécurité et de fiabilité. En effet, l'utilisation d'un Prepared Statement génèrera un code SQL bien plus propre que ce qu'on peut faire à la main par concaténation.

Traiter le résultat[modifier | modifier le wikicode]

À faire...link={{{link}}}

ResultSet

Exemples[modifier | modifier le wikicode]

Microsoft Access[modifier | modifier le wikicode]

Cet exemple ne fonctionne que sur Windows à cause du pilote Microsoft Access :

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String path = "C:/example.mdb";
String dsn = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + path + ";UID=admin";
accessConn = DriverManager.getConnection(dsn, "", "");

Remarque : les identifiants sont donnés dans le DSN plutôt que par getConnection.

MySQL[modifier | modifier le wikicode]

import java.sql.*;

public class ExempleJDBC {

    public static void main (String args[]) {

        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            throw new Exception("impossible de charger le pilote MySQL, "
                                + "est-il bien dans le CLASSPATH ?", e);
        }

        try {
            // Création d'une connexion à la base
            Connection ma_connection = DriverManager.getConnection(
                     "jdbc:mysql://mon_serveur:3306/ma_base",
                     "mon_login",
                     "mon_mot_de_passe"
                    );

            // Une requête simple
            String ma_requete = "select a, b from r";

            // On prépare la requête avec un Statement
            Statement mon_statement = ma_connection.createStatement();

            // On exécute la requête
            ResultSet mon_resultset = mon_statement.executeQuery(ma_requete);
            
            // récupération et traitement du résultat
            System.out.println ("Dans ma relation :") ;
            while (mon_resultset.next()) {
                System.out.println(" | " + mon_resultset.getString("a")
                                 + " | " + mon_resultset.getInt("b"));
            }
            
            ma_connection.close();

        } catch (java.sql.SQLException e) {
            throw new Exception("erreur SQL", e);
        }
    }
}

Oracle Database[modifier | modifier le wikicode]

Ce script affiche la taille de la base :

import java.sql.*; 
import java.io.*; 
import oracle.jdbc.*; 
import oracle.sql.*; 

public class OracleDatabase {
  public static void main(String[] args) {
    try {
      DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
      Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:MyDatabase", "MyAccount", "MyPassword"); 	
      conn.setAutoCommit(true);
      String sql = "SELECT sum(bytes) from dba_segments;";
      Statement stmt = conn.createStatement();
      stmt.execute(sql); 
      stmt.close();
      conn.close();   
    } catch(SQLException e) { e.printStackTrace(); }
  }
}

PostgreSQL[modifier | modifier le wikicode]

try {
   Class.forName("org.postgresql.Driver");
   Connection conn = DriverManager.getConnection("jdbc:postgresql:MyDatabase", "MyAccount", "MyPassword");
   conn.close();
} catch(SQLException e) { e.printStackTrace(); }

Erreurs connues[modifier | modifier le wikicode]

package oracle.jdbc does not exist[modifier | modifier le wikicode]

Si vous avez Oracle Database sur votre PC, ajouter au classpath les fichiers suivants[2] :

  • C:\oracle12\app\oracle\product\12.1.0\dbhome_1\jdbc\lib\ojdbc7.jar
  • C:\oracle12\app\oracle\product\12.1.0\dbhome_1\sqlj\lib\runtime12.jar

Sinon, ojdbc7.jar peut être téléchargé depuis http://www.oracle.com/technetwork/database/features/jdbc/jdbc-drivers-12c-download-1958347.html, et ajouté à la compilation. Ex :

javac MyClass.java -classpath ojdbc7.jar

L'URL Oracle indiquée n'est pas valide[modifier | modifier le wikicode]

Reconstruire la ligne du getConnection() avec le code ci-dessus.

ORA-28009: connection as SYS should be as SYSDBA or SYSOPER[modifier | modifier le wikicode]

Ajouter " as sysdba" après le nom du compte Oracle, ex :

Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:MyDatabase", "MyAccount as sysdba",

ORA-00933: la commande SQL ne se termine pas correctement[modifier | modifier le wikicode]

Références[modifier | modifier le wikicode]

  1. http://docs.oracle.com/javase/7/docs/api/java/sql/DriverManager.html
  2. http://docs.oracle.com/database/121/IMURG/ch_appdev.htm#IMURG11551