Table des matières

Applications bases des données avec JDBC

Java est un langage de programmation multiplate-forme, le programmeur n'a pas réellement à se soucier du code selon l'environnement sur lequel il développera. Le problème était surtout au niveau des bases de données qui elles, ont chacune leur particularités. La solution a été de demander aux vendeurs de bases de données de développer un pilote qui contient certaines méthodes requises par Java pour communiquer. Ce sont des pilotes JDBC. Java Database Connectivity est un pilote à la manière de l'ODBC (Open Database Connectivity).

Presque toutes les bases de données ont leur pilote JDBC, par exemple MySQL (MySQL Connector/J), Oracle, SQLite et beaucoup d'autres.

import java.sql.*;
String urlDB = "jdbc:mysql://localhost/ecole?user=root&password=motdepasse";
Class.forName("com.mysql.jdbc.Driver");
Connection cnx = DriverManager.getConnection(urlBD);
String requete = "SELECT * FROM cours";
Statement stm = cnx.getStatement();  // peut être : createStatement();
ResultSet res = stm.executeQuery(requete);

Connection, Statement et ResultSet sont des interfaces qui doivent être implémentés par les différents pilotes de SGBD.

Implémentation des interfaces par les pilotes JDBC

Types de pilotes

Il y a quatre types de pilotes :

  1. Passerelle JDBC ↔ ODBC (Expérimental)
    • Si un pilote ODBC n'a pas certaines fonctionnalités, le JDBC ne pourra pas les utiliser non plus.
    • Classe principale du pilote est sun.jdbc.odbc.JdbcOdbcDriver
  2. Java et API de vendeur - Écrit dans différents langages (ex : C++), donc pas nécessairement multiplate-forme.
  3. Pilote d'agrégation qui permet de travailler avec plusieurs types de bases de données.
  4. Comme le type 2, sauf en Java pur (souvent en fichier .jar).
    • Le type le plus utilisé

http://developers.sun.com/product/jdbc/drivers

Classes et packages

  1. java.sql.*

Interfaces

  1. java.sql.Driver
  2. java.sql.Connection
  3. java.sql.Statement
  4. java.sql.ResultSet

Étapes

  1. Charger le pilote
    • ClassForName(“com.macie.monpilote.MonPilote”)
    • Par exemple pour MySQL → Class.forName(“com.mysql.jdbc.Driver”)
  2. Se connecter à la base de données
    • Connection con = DriverManager.getConnection(“jdbc:quelquechose:quelquechose”, “user”,“motdepasse”)
    • L'URL de la connexion dépend du SGBD et du pilote.
    • Par exemple pour MySQL → Connection con = DriverManager.getConnection(“jdbc:mysql://localhost/ecole?user=root”)
    • Passerelle JDBC-ODBC → jdbc:odbc:masource
  3. Faire les requêtes
  4. Fermer la connexion

Parcourir un ResultSet

Une fois qu'on a récupéré un ResultSet à l'aide Statement.executeQuery() on peut le parcourir. Le curseur se trouve avant le premier enregistrement, ce qui signifie qu'il faire un premier appel à la méthode next() pour lire le premier enregistrement.

d'un resultset
while (rs.next()) {
  System.out.println(rs.getString("nom_colonne"));
}

Il y a deux types de ResultSet : Insensibles et sensibles. Le ResultSet insensible appliquera immédiatement les changements créés par l'application à la base de données.

Interfaces d'accès

Différents types de Statement selon les besoins.

Opérations à la base de données

Opérations de mise à jour

L'exemple suivant ne montre pas de bonnes pratiques en programmation. Il est préférable d'utiliser des PreparedStatement.
import java.sql.*;
class ClientInsertJDBC
{
    public static void main (String args []) throws SQLException, ClassNotFoundException, java.io.IOException
    {
        // Charger le pilote JDBC d'Oracle
        Class.forName ("oracle.jdbc.driver.OracleDriver");
 
        // Connexion à une BD
        Connection connection = DriverManager.getConnection ("jdbc:oracle:thin:@", "user", "pass");
 
        // Crétion d'un énoncé associé à la connection
        Statement sqlStatement = connection.createStatement();
 
        // Insertion d'une ligne dans la table Client
        int n = sqlStatement.executeUpdate("INSERT INTO CLIENT " + "VALUES (100, 'G. Lemoyne-Allaire', '911')");
 
        System.out.println ("Nombre de lignes inserees:" + n);
 
        // Fermeture de la connexion
        sqlStatement.close();
        connection.close();
    }
}

Opération de sélection (SELECT)

// Création d'un énoncé associé à la connexion
Statement sqlStatement = uneConnection.createStatement();
 
// Exécution d'un SELECT
ResultSet resultatSelect = sqlStatement.executeQuery
    ("SELECT noClient, nomClient "+
    "FROM CLIENT " +
    "WHERE noClient > 40");
 
// Itérer sur les lignes du résultat du SELECT et extraire les valeurs
// des colonnes dans des variables Java
while (resultatSelect.next()) {
    int noClient = résultatSelect.getInt("noClient");
    String nomClient = résultatSelect.getString("nomClient");
    System.out.println ("Numéro du client:" + noClient);
    System.out.println ("Nom du client:" + nomClient);
}

Support des types SQL:1999 sous JDBC 2

CREATE TABLE tableBlob (
  idBlob INTEGER PRIMARY KEY,
  imageBLOB
)
// Chercher le BLOB locator
ResultSet unResultSet = sqlStatement.executeQuery ("SELECT * FROM tableBlob WHERE idBlob = 1");
 
if (unResultSet.next()) {
    int idBlob = unResultSet.getInt(1);
    Blob unBlob = unResultSet.getBlob(2);
 
    // Chercher la taille du BLOB et l'afficher
    int taille = (int)unBlob.length();
    System.out.println("Taille du BLOB" + taille);
 
    // Lire le BLOB dans un tableau d'octets
    byte octets[] = unBlob.getBytes(1, taille);
 
    // Créer un fichier contenant les octets lus
    FileOutputStream unFichier = new FileOutputStream("fichier.gif");
    unFichier.write(octets);
    unFichier.close();
}

Compilation et exécutions multiples avec PreparedStatement

Exécution en lot

// Création d'un PreparedStatement associé à la Connection
PreparedStatement sqlStatement = uneConnection.prepareStatement("INSERT INTO Client VALUES(?,?,?)");
 
// Ajout d'un INSERT dans le lot
sqlStatement.setInt(1,90);
sqlStatement.setString(2,"Edgar Degas");
sqlStatement.setString(3,"(222)222-2222");
sqlStatement.addBatch();
 
// Ajout d'un autre INSERT dans le lot
sqlStatement.setInt(1,100);
sqlStatement.setString(2,"Claude Monet");
sqlStatement.setString(3,"(111)111-1111");
sqlStatement.addBatch();
 
// Exécution du lot en un appel
int [] résultats = sqlStatement.executeBatch();

Oracle

Connexion

En utilisant le pilote JDBC d'Oracle 11g (Source) :

Syntaxe de la chaîne de connexion : jdbc:oracle:thin:@[HOST][:PORT]:SID.

Class.forName ("oracle.jdbc.driver.OracleDriver");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@domain.tld:1521:sid", "schemas_username", "password");