java.sql.Driver
. Comme nous l’avons déjà vu, il est possible de charger une classe Java explicitement dans le code, par appel de la méthode
Class.forName()
.
Chaque éditeur de base de données fournit une telle classe, généralement dans un JAR qui constitue le pilote complet. Le nom complet de cette classe varie donc d'un éditeur à l'autre. Pour chaque base, il faut donc trouver ce nom. Dans le cas de MySQL, il s'agit de
com.mysql.jdbc.Driver
. L'ouverture d'une connexion sur une base MySQL aura donc la forme suivant :
Class
:
Class.forName("com.mysql.jdbc.Driver") ;
newInstance()
sur cet objet, qui nous retourne une instance de ce driver, de type
java.sql.Driver
;
DriverManager.registerDriver(pilote)
.
Connection con = DriverManager.getConnection(chaineDeConnexion, user, password) ;
L’objet
chaîneDeConnexion
est de la classe
String
. C’est une concaténation des éléments suivants :
jdbc:mysql
: indique le protocole utilisé pour accéder à la base de donnée. Ce protocole est propre à chaque base.
localhost:3306
: indique le nom d'hôte qui héberge la base de données, ainsi que le port d'accès.
nom_de_la_base
: le nom de la base de données à laquelle on souhaite se connecter.
jdbc:mysql::3306/db_test
Ces deux méthodes jettent bien sûr leurs propres exceptions, notamment si la classe du pilote n’est pas trouvée, si une erreur s’est glissée dans l’URL de connexion, si l’hôte est inaccessible, ou s’il se trouve une erreur dans les identifiants de connexion.
Statement
. Cet objet s’obtient en faisant appel à la méthode
createStatement()
de notre objet de type
Connection
.
Statement smt = con.createStatement() ;On peut envoyer ensuite trois types de requêtes :
smt.executeQuery(chaîneSQL)
;
smt.executeUpdate(chaîneSQL)
;
smt.execute(chaîneSQL)
.
ResultSet
. Dans le cas d’une mise à jour de la base, ce qui correspond aux commandes SQL
insert
,
update
,
create
,
drop
,
delete
, on utilise la commande :
int i = smt.executeUpdate("insert into … values …") ;L’entier de retour représente le nombre de lignes affectées dans le cas d’un
insert
, d’un
update
ou d’un
delete
.
Dans le cas d’une requête de sélection, un objet de type
ResultSet
est renvoyé.
ResultSet resultSet = smt.executeQuery("select nom, age from Marins") ;L’objet
resultSet
contient les lignes renvoyées par la requête.
Enfin, pour parcourir ces lignes, il faut utiliser les méthodes de l’interface
ResultSet
. Voici un exemple.
while (rs.next()) { String nom = rs.getString("nom") ; int age = rs.getInt("age") ; }Les champs des lignes sélectionnées sont maintenant disponibles sous forme d’objets Java, ce qui était bien notre objectif. Nous reverrons toutes ces méthodes et cette procédure en détails dans les paragraphes suivants.
Exemple 1. Un premier exemple de connexion
import java.sql.* ; import java.io.* ; import com.mysql.jdbc.driver.* ; public class TestDB { public static void main (String[] args) { try { // chargement de la classe par son nom Class c = Class.forName("com.mysql.jdbc.Driver") ; Driver pilote = (Driver)c.newInstance() ; // enregistrement du pilote auprès du DriverManager DriverManager.registerDriver(pilote); // Protocole de connexion String protocole = "jdbc:mysql:" ; // Adresse IP de l’hôte de la base et port String ip = "localhost" ; // dépend du contexte String port = "3306" ; // port MySQL par défaut // Nom de la base ; String nomBase = "test_db" ; // dépend du contexte // Chaîne de connexion String conString = protocole + "//" + ip + ":" + port + "/" + nomBase ; // Identifiants de connexion et mot de passe String nomConnexion = "user" ; // dépend du contexte String motDePasse = "passwd" ; // dépend du contexte // Connexion Connection con = DriverManager.getConnection( conString, nomConnexion, motDePasse) ; // Envoi d’un requête générique String sql = "select * from Marins" ; Statement smt = con.createStatement() ; ResultSet rs = smt.executeQuery(sql) ; while (rs.next()) { System.out.println(rs.getString("nom")) ; } } catch (Exception e) { // gestion des exceptions } } }