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.
Types de pilotes
Il y a quatre types de pilotes :
- 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
- Java et API de vendeur - Écrit dans différents langages (ex : C++), donc pas nécessairement multiplate-forme.
- Pilote d'agrégation qui permet de travailler avec plusieurs types de bases de données.
- Comme le type 2, sauf en Java pur (souvent en fichier
.jar
).- Le type le plus utilisé
Classes et packages
- java.sql.*
Interfaces
- java.sql.Driver
- java.sql.Connection
- java.sql.Statement
- java.sql.ResultSet
Étapes
- Charger le pilote
ClassForName(“com.macie.monpilote.MonPilote”)
- Par exemple pour MySQL →
Class.forName(“com.mysql.jdbc.Driver”)
- 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
- Faire les requêtes
- 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.
- Statement → Pour les requêtes simples
- PreparedStatement → Pour les requêtes paramétrées
- CallableStatement → Pour les procédures stockées.
Opérations à la base de données
Opérations de mise à jour
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
- Compilation au
prepareStatement()
:PreparedStatement sqlStatement = connection.prepareStatement ("SELECT noClient, nomClient "+ "FROM CLIENT " + "WHERE noClient > 40"); ResultSet resultatSelect = sqlStatement.executeQuery();
- Compilation avec paramètres :
PreparedStatement sqlStatement = connection.prepareStatement ("SELECT noClient, nomClient "+ "FROM CLIENT " + "WHERE noClient > ?"); sqlStatement.setInt(1,40); ResultSet resultatSelect = sqlStatement.executeQuery();
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");