Blue Flower

Chercher

I. Introduction

1. Généralités

L'API JDBC (Java Database Connectivity) permet une connectivité standard et indépendante entre des applications java qui l'utilise  et les serveurs de bases de données relationnelles. L' API JDBC met à la disposition des développeurs  un cadre pour que des  applications  Java  puisse se connecte à des bases de données relationnelles et exécuter des requêtes.
Cet API est une spécification de ce que doit implémenter un constructeur de Base de Données; pour travailler avec une  base de données via JDBC on utilise des références à des interfaces comme "Connection", "Statement", "ResultSet" de l' API  implémentées par le constructeur de la base de données choisies.

L'ensemble des classes qui implémentent les interfaces de l'API JDBC s'appelle  pour une base de données, un  "pilote" JDBC ou un "Driver". Comme  les protocoles d'accès aux Bases de Données appartiennent aux fournisseurs de JDBC, chaque fournisseur développe ses propres drivers.
Parmi les interfaces de l'API JDBC, l'interface "Driver" est celle qui décrit ce que doit faire tout objet  qui implémente la tentative de connexion à une base de données. Un tel objet doit obligatoirement s'enregistrer auprès du DriverManager; si l'enregistrement est réussi, en retour on a  un objet de type "Connection".

L'utilisation de cet  API nous oblige à suivre un certain nombre d'étapes à savoir:
1. Établir une connexion à la base de données ( MySQL ou ORACLE, ...)
2. Envoyer des requêtes SQL aux bases de données connectées pour qu'elles soient exécutées sur la BD concernée.
3. Traiter les résultats retournés par les requêtes exécutées sur la BD.

 2. les Drivers JDBC

2.1. Différents types de drivers

On a deux aspects de l'API JDBC; la fourniture d'interfaces et de classes qui permettent de réaliser des applications Java communicant avec des SGDBs, puis la  configuration et la connexion aux bases de données. Pour travailler avec des interfaces et des classes permettant la programmation d'applications java utilisant JDBC, on doit importer le package "java.sql". En ce qui concerne la configuration et la connexion on doit choisir le type de Driver JDBC car il en existe Quatre:

  1. JDBC-ODBC Bridge plus ODBC Driver:  ce driver utilise le driver OBDC (standard Microsoft) pour se connecter aux serveurs de base de données. Ces type de pilotes sont rapides mais doivent être présents sur le poste client car ils ne peuvent pas être téléchargés par le ClassLoader de Java (ce ne sont pas des classes Java mais plutôt des librairies dynamiques; c'est pourquoi on doit avoir le driver ODBC installé chez le client). Le driver accède à un SGBDR en passant par les drivers ODBC  via un pont JDBC-ODBC.
  2. Native API partly Java technology-enabled driver: ce type de driver fait appel à des fonctions natives non Java (le plus souvent en langage C) de l'API du SGBD que l'on veut utiliser; on a à peu de chose prêt les mêmes problèmes que précédemment.
  3. Pure Java Driver for Database Middleware: Ces types de pilote écrits en Java  s'adressent à un middleware (application intermédiaire) qui fait l'interface avec la Base de Données; ils permettent donc l'utilisation d'un serveur middleware et facilitent ainsi l'accès à plusieurs types de sources de données.
  4. Direct-to-Database Pure Java Driver: c'est ce type de Driver qu'on utilise de préférence car il convertit directement l'appel du JDBC au protocole réseau directement compréhensible par les serveur de base de données.  Cette solution ne demande pas qu'on utilise des APIs spécifiques côté client. Pour la BD Oracle on a le Driver OJDBC et pour MySQL le driver Connector/J. En un mot c'est un pilote écrit en Java "jdbc:protocole" de la BD et qui permet l’accès  direct à l'interface réseau de la BD.

Le type d'API le plus utilisé et le plus implémenté par les constructeurs est le type 4 (Direct-to-Database Pure Java Driver) et actuellement on la version JDBC 4.1.


II.  Les Composants des API JDBC

2.1. Les Composants communs des API JDBC

Chaque API JDBC doit disposer des classes et des interfaces suivantes:

  • Driver: C'est une interface qui permet de communiquer avec la BD.
  • DriverManager: La liste des pilotes de base de données est gérée par cette classe.
  • Connection: C'est une interface qui définit toutes les méthodes pour contacter la BD
  • Statement (PreparedStatement): cette classe contient la requête et la transmet à la base de données
  • ResultSet:Les objets ResultSet contiennent les données extraites de la base de données après l'exécution de requêtes SQL.
  • SQLException: C'est la classe qui lève toutes les exceptions résultant des applications java utilisant JDBC.

2.2. L'interface Driver

La méthode connect() de l' interface Driver nécessite un URL pour accéder à la base de données;  ensuite elle renvoie   une instance de l'interface Connection (null si le driver ne convient pas). Cette instance de l'interface Connection obtenue permet de lancer des requêtes.

2.3. La classe DriverManager

Elle gère les différents drivers (instances de Driver). Pour qu'un driver soit disponible, il faut charger sa classe en mémoire; la méthode forName de la classe Class avec en paramètre le nom complet de la classe du driver (Class.forName("driverName") ) crée une instance d'elle même et enregistre cette instance auprès de la classe DriverManager comme suit:

Class.forName ("oracle.jdbc.driver.OracleDriver"); // pilote Oracle
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); // pilote ODBC
Class.forName ("com.mysql.jdbc.Driver"); // pilote MySQL

La classe DriverManager essaie tous les drivers enregistrés (chargés en mémoire avec Class.forName()) jusqu'à ce qu'elle trouve un driver qui lui fournisse une connexion; la connexion est réalisée par la méthode "DriverManager.getconnection(String url, String user, String password)" qui retourne une instance de la classe Connection :

 Connection connexion = DriverManager.getConnection(url, user, password);

2.4. L'interface Connection

A connection (session) with a specific database. SQL statements are executed and results are returned within the context of a connection.
A Connection object's database is able to provide information describing its tables, its supported SQL grammar, its stored procedures, the capabilities of this connection, and so on. This information is obtained with the getMetaData method....

2.5. La classe Statement

represents the base statements interface. In terms of efficiency, it is suitable to use Statement only when we know that we will not need to execute the SQL query multiple times. In contrast to PreparedStatement the Statement doesn’t offer support for the parameterized SQL queries, which is an important protection from SQL injection attacks.
With that said, Statement would be suitable for the execution of the DDL (Data Definition Language) statements, such as CREATE, ALTER, DROP.

2.5.1. La classe preparedStatement

It extends the Statement interface. In most cases it is more efficient (in the context of multiple executions) to use the PreparedStatement because the SQL statement that is sent gets pre-compiled (i.e. a query plan is prepared) in the DBMS. Furthermore, we can use PreparedStatement to safely provide values to the SQL parameters, through a range of setter methods (i.e. setInt(int,int), setString(int,String), etc.)

2.5.2. CallableStatement

It extends the PreparedStatement interface. This interface is used for executing the SQL stored procedures. One particular advantage of using CallableStatement is that it adds a level of abstraction, so the execution of stored procedures does not have to be DBMS-specific.

However, it should be noted that the output parameters need to be explicitly defined through the corresponding registerOutParameter() methods; whereas the input parameters are provided in the same manner as with the PreparedStatement.

With that said, here’s the example of how the CallableStatement interacts with a MySQL Stored Procedure that does basic multiplication of integers

CREATE PROCEDURE MULTIPLY(OUT RESULT INT, IN a INT, IN b INT) SET RESULT = a * b;
 
CallableStatement cstmt = con.prepareCall("{call MULTIPLY(?, ?, ?)}");
cstmt.registerOutParameter(1, Types.INTEGER);
cstmt.setInt(2, 4);
cstmt.setInt(3, 8);
cstmt.execute();
int result = cstmt.getInt(1);
...

...


III. Utilisation de l' API JDBC

3.1.  Généralités

Comme on l'a dit  ci-dessus l' API JDBC est à sa version 4.1.

  1. Importer le package java.sql
  2. Enregistrer le driver JDBC
  3. Établir la connexion au SGBD
  4. Créer une requête (ou instruction SQL)
  5. Exécuter la requête
  6. Traiter les données retournées
  7. Fermer la connexion

3.2.  Les packages JDBC 4.1

Le package JDBC 4.1 est le premier package de l' API JDBC qui contient les packages "java.sql" et "javax.sql". Elle prend en compte de façon implicite le chargement de de la classe du Driver à utiliser et dans ce cas on n' aplus besoin del' instruction Class.forName("...").
Les nouvelles fonctionnalités contenues dans JDBC 4.1 sont:

  • La possibilité de fermer automatiquement les ressources de type Connection, ResultSet et Statement avec l'instruction " try-with-resources Statement" (voir définition "try-with-ressources Statement").
  • RowSet 1.1: l'introduction de l'interface RowSetFactory et de la classe RowSetProvider, on a la possibilité de créer tous les types de jeux de lignes qui seront  pris en charge par le pilote JDBC.

...

précédent suivant