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.
Il y a quatre types de pilotes :
sun.jdbc.odbc.JdbcOdbcDriver
.jar
).ClassForName(“com.macie.monpilote.MonPilote”)
Class.forName(“com.mysql.jdbc.Driver”)
Connection con = DriverManager.getConnection(“jdbc:quelquechose:quelquechose”, “user”,“motdepasse”)
Connection con = DriverManager.getConnection(“jdbc:mysql://localhost/ecole?user=root”)
jdbc:odbc:masource
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.
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.
Différents types de Statement
selon les besoins.
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(); } }
// 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); }
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(); }
prepareStatement()
: PreparedStatement sqlStatement = connection.prepareStatement ("SELECT noClient, nomClient "+ "FROM CLIENT " + "WHERE noClient > 40"); ResultSet resultatSelect = sqlStatement.executeQuery();
PreparedStatement sqlStatement = connection.prepareStatement ("SELECT noClient, nomClient "+ "FROM CLIENT " + "WHERE noClient > ?"); sqlStatement.setInt(1,40); ResultSet resultatSelect = sqlStatement.executeQuery();
// 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();
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");