Vous êtes sur la page 1sur 5

La présentation des classes de l'API JDBC

Toutes les classes de JDBC sont dans le package java.sql. Il faut donc l'importer dans
tous les programmes devant utiliser JDBC.
Exemple :
import java.sql.*;

Il y a 4 classes importantes : DriverManager, Connection, Statement (et


PreparedStatement), et ResultSet, chacune correspondant à une étape de l'accès aux
données :

Classe Rôle

Charger et configurer le driver de la base de


DriverManager
données.

Réaliser la connexion et l'authentification à la base


Connection
de données.

Contenir la requête SQL et la transmettre à la base


Statement (et PreparedStatement)
de données.

Parcourir les informations retournées par la base de


ResultSet
données dans le cas d'une sélection de données

Chacune de ces classes dépend de l'instanciation d'un objet de la précédente classe.


La connexion à une base de données avec java
La connexion à une base de données requiert au préalable le chargement du pilote JDBC
qui sera utilisé pour communiquer avec la base de données.

Le chargement du pilote JDBC


On commence un programme JDBC en chargeant dans le programme, le pilote approprié pour
la BD. Comme le programme peut interroger divers types de BD il peut avoir plusieurs
pilotes. C'est au moment de la connexion que sera choisi le bon pilote par le DriverManager.
Pour se connecter à une base de données via ODBC, il faut tout d'abord charger le pilote
JDBC-ODBC qui fait le lien entre les deux .
Syntaxe :
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Exemple ( code Java 1.1 ) :
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Pour se connecter à une base en utilisant un driver spécifique, la documentation du driver
fournit le nom de la classe à utiliser. Par exemple, si le nom de la classe est
jdbc.DriverXXX, le chargement du driver se fera avec le code suivant :
Class.forName("jdbc.DriverXXX");
Exemple : Chargement du pilote pour un base PostgreSQL sous Linux

Class.forName("postgresql.Driver");
Il n'est pas nécessaire de créer une instance de cette classe et de l'enregistrer avec le
DriverManager car l'appel à Class.forName le fait automatiquement : ce traitement charge
le pilote et crée une instance de cette classe.
Pour oracle, l’instruction est la suivante :
Class.forName ("oracle.jdbc.driver.OracleDriver");
Quand une classe Driver est chargée, elle doit créer une instance d’elle même et s’enregistrer
auprès du DriverManager.

L'établissement de la connexion à la base de données


Pour se connecter à une base de données, il faut instancier un objet de la classe
Connection en lui précisant sous forme d'URL la base à accéder.
On ouvre une connexion avec une des méthodes DriverManager.getConnection(...) qui retourne un
objet d'une classe qui implémente l'interface Connection. Les arguments suivants de
Driver.getConnection(...) sont des informations nécessaires à l'ouverture de la connexion souvent un
nom de connexion à la base suivi d'un mot de passe.
Connection conX = DriverManager.getConnection(URLjdbc, "dbUser1", "pwuser1");
La classe DriverManager fournit des méthodes qui sont des utilitaires pour gérer l'accès aux bases de
données par Java et les différents drivers JDBC à l'intèrieur d'un programme Java.
Ces méthodes contiennent comme premier argument une "URL JDBC". Elles recherchent le pilote
adapté pour gérer la connexion avec la base repérée par cette URL.
Une URL JDBC doit commencer par jdbc. Le second argument est le protocole sous jacent dans lequel
le pilote traduit. Le troisième argument est un identificateur de base de données. La syntaxe d'une
URL JDBC est donc: jdbc:<sous-protocole>:<baseID>
la partie baseID est propre au sous-protocole.

Exemple ( code Java 1.1 ) : Etablir une connexion sur la base testDB via ODBC
String DBurl = "jdbc:odbc:testDB";

con = DriverManager.getConnection(DBurl);
NB : La syntaxe URL peut varier d'un type de base de données à l'autre mais elle est
toujours de la forme : protocole:sous_protocole:nom
"jbdc" désigne le protocole et vaut toujours "jdbc". "odbc" désigne le sous protocole qui
définit le mécanisme de connexion pour un type de base de données.
Le nom de la base de données doit être celui saisi dans le nom de la source sous ODBC.
La syntaxe URL peut varier d'un type de base de données à l'autre mais elle est toujours
de la forme : protocole:sous_protocole:nom
"jbdc" désigne le protocole et vaut toujours "jdbc". "odbc" désigne le sous protocole qui
définit le mécanisme de connexion pour un type de base de données.
Le nom de la base de données doit être celui saisi dans le nom de la source sous ODBC.

L'accès à la base de données


Une fois la connexion établie, il est possible d'exécuter des ordres SQL. Les objets qui
peuvent être utilisés pour obtenir des informations sur la base de données sont :

Classe Rôle
informations à propos de la base de données : nom des tables,
DatabaseMetaData
index, version ...

résultat d'une requête et information sur une table. L'accès se fait


ResultSet
enregistrement par enregistrement.

ResultSetMetaData informations sur les colonnes (nom et type) d'un ResultSet

Création des instructions SQL


Cette étape consiste à obtenir une déclaration (zone de description de requête ou «statement ») au
travers de laquelle les requêtes SQL seront exécutées.
Il existe 3 types de déclarations:
1. Statement, instruction simple : permet d’exécuter directement et une fois l’action sur la base
de données :
Statement declaration1= connexion.createStatement();
2. PreparedStatement: instruction paramétrée. (cas des requêtes avec paramètres)
• L’instruction est générique, des champs sont non remplis
• Permet une précompilation de l’instruction optimisant les performances
• Pour chaque exécution, on précise les champs manquants
3. CallableStatement:
Une déclaration de type « CallableStatement» permet l’accès complet aux fonctions contenues dans
la base de données.(cas des procédures stockées)

Requêtes au bases de données


Sans trop rentrer dans les détails (voir un cours de bases de données pour cela), il existe différentes
sortes de requêtes SQL dont :
- les requêtes SELECT qui opèrent sur une ou plusieurs tables et placent le résultat dans une "table"
résultante.
- les requêtes d'action qui modifient une ou des colonnes ou lignes de table. On a par exemple
comme requête d'action UPDATE, DELETE, APPEND.
- des SQL DDL (Data Definition Language) comme CREATE TABLE, DROP TABLE, ...
SQL est un langage non sensible à la casse (culture IBM- SQL et non pas culture Unix-C). En général les
mots clés du langage SQL sont mis en majuscules.
Syntaxiquement en Java on utilise executeQuery(...) si la requête est une requête SELECT et
executeUpdate(...) si a requête est une requête d'action ou une SQL DDL

Exécution de requêtes SQL : executeUpdate; executeQuery, execute


A. La méthode ExecuteUpdate est utilisée pour les requêtes DML (INSERT, DELETE, UPDATE).
Cette méthode retourne le nombre de lignes affectées par la requête sql.
objetStatement.executeUpdate(String Requête_SQL]); ou
objetPreparedStatement.executeUpdate(String Requête_SQL]);
Exemple:
package Exemple1;
import java.sql.*;
import oracle.jdbc.pool.*; public class Exemple1 {
public static void main(String[] args) { Connection conn = null;
String user = "user1";
String mapasse = "user1";
String url = "jdbc:oracle:thin:@205.237.244.251:1521:orcl"; String sqlIns = "insert into
employesclg(numemp,
nomemp,prenomemp) values(25,'Alpha','Omega')";
try {
OracleDataSource ods = new OracleDataSource(); ods.setURL(url);
ods.setUser(user);
ods.setPassword(mapasse);
conn = ods.getConnection(); System.out.println("vous êtes connectés ");
try
{
Statement stmins = conn.createStatement();
int n = stmins.executeUpdate(sqlIns); System.out.println("nb de lignes ajoutée" + n); }
catch (SQLException sqlinsertion)
{
System.out.println(sqlinsertion.getMessage()); }
finally
{ stmins.close(); }

Exécution d'instructions SQL


Toutes les instructions ANSI SQL-2 Entry Level sont acceptés puisque le driver jdbc:protocole SGBD
sous-jacent a été testé pour cela.
On utilise l'un des trois interfaces Statement, PreparedStatement, CallableStatement. Les instructions
PreparedStatement sont précompilées. On utilise CallableStatement pour lancer une procédure du
SGBD.
Avec un Statement on a :
Statement smt = conX.createStatement();
ResultSet rs = smt.executeQuery( "SELECT * FROM Livres" );

Récupération des résultats (suite)


Les résultats des requêtes SELECT ont été mis dans un ResultSet. Cet objet récupéré modélise le
résultat qui peut être vu comme une table. Par exemple
SELECT nom, prenom, adresse FROM Personnes retourne un ResultSet qui modélise :
Zidane
Zinedine
Turin
Blanc
Laurent
Milan
Deschamps
Didier
Londres
.
.
.
..
..
..
Un pointeur géré par Java jdbc permet de parcourir tout le ResultSet et est initialisé : il est
automatiquement positionné avant la première ligne de résultat.
On parcourt alors tout le ResultSet pour avoir l'ensemble des réponses à la requête. La boucle de
parcours est :
while(rs.next()) { // traitement
}
Les colonnes demandées par la requête sont numérotées à partir de 1 (culture IBM-SQL et non pas
culture Unix-C).
Remarque
La numérotation est relative à l'ordre des champs de la requête et non pas l'ordre des champs de la
table interrogée (évidemment).
De plus les colonnes sont typées en type SQL. Pour récupérer une valeur de colonne il faut donc
indiquer le numéro de la colonne ou son nom et faire la conversion de type approprié. Par exemple :
Statement stmt = ...;
ResultSet rs = stmt.executeQuery(SELECT nom, prenom, age, date FROM LaTable");
String leNom = rs.getString( 1 ) );
String lePrenom = rs.getString( 2 );
int lage = rs.getInt ( 3 );
Date laDate = rs.getDate( 4);
On peut aussi désigner les colonnes par leur nom dans la BD (c'est moins rapide mais plus lisible) et
réécrire :
ResultSet rs = stmt.executeQuery("SELECT nom, prenom, age, date FROM LaTable");
String leNom = rs.getString( "nom") );
String lePrenom = rs.getString( "prenom" );
int lage = rs.getInt ( "age" );
Date laDate = rs.getDate( "date ");

Vous aimerez peut-être aussi