Programmation Java/Bases de données
Un livre de Wikibooks.
Sections |
[modifier] JDBC
Le texte qui suit n'a pas été rédigé par une personne formellement compétente en la matière. Son contenu est donc sujet à caution.
JDBC permet de se connecter à une base de données relationnelle pour y exécuter des requêtes SQL.
Dans la suite de ce chapitre, nous considérons une relation r dont les attributs a et b sont respectivement de type chaîne et entier.
CREATE TABLE r (a varchar2(42), b number)
[modifier] Pré-requis
Selon le système de bases de donnée (SGBD) que vous utilisez, vous devrez fournir un pilote adapté. Chaque pilote est spécifique à un SGBD.
Il existe des pilotes pour les SGBD suivants :
- MySQL
- Oracle
- Apache Derby
Vous pourrez trouver le driver qui convient dans cette base de données : http://developers.sun.com/product/jdbc/drivers
[modifier] Se connecter au serveur
[modifier] Lancer une requête
[modifier] Les « Statement »
// Une requête simple String ma_requete = "select a, b from r"; // Requête en utilisant un Statement Statement mon_statement = ma_connection.createStatement(); // On récupère le résultat dans un ResultSet ResultSet mon_resultset = mon_statement.executeQuery(ma_requete);
[modifier] Les « Prepared Statement »
On utilise les Prepared Statement quand il y a des inconnues dans la requête à exécuter. Dans le requête (la chaîne), chaque inconnue est remplacée par « ? ». Les méthodes setInt, setString etc. permettent de modifier les paramètres.
// Une requête simple String ma_requete = "insert into r values(?, ?)"; // Requête en utilisant un Statement PreparedStatement mon_prepared_statement = ma_connection.prepareStatement(); // Le premier paramètre est une chaîne de caractères mon_prepared_statement.setString(1,"VALEUR 1"); // Le second paramètre est un entier mon_prepared_statement.setInt(2,1337);
[modifier] Les « Callable Statement »
Les « Callable Statement » permettent de faire appel à des fonctions ou à des procédures stockées (PL/SQL ou PL/pgSQL) dans la base de données.
[modifier] Lequel utiliser ?
Bien qu'il soit possible d'exécuter des requêtes paramétrées avec un Statement simple (par un jeu de rechercher-remplacer ou de concaténations multiples pour former la chaîne de caractère), cela est déconseillé pour des raisons de sécurité et de fiabilité. En effet, l'utilisation d'un Prepared Statement génèrera un code SQL bien plus propre que ce qu'on peut faire à la main par concaténation.
[modifier] Traiter le résultat
[modifier] Exemple avec MySQL
-
import java.sql.*;
-
-
class ExempleJDBC {
-
public static void main (String argv[]) {
-
-
try {
-
Class.forName("com.mysql.jdbc.Driver");
-
} catch (ClassNotFoundException e) {
-
System.err.println(e) ;
-
System.exit (-1) ;
-
} -
-
try {
-
// Création d'une connexion à la base -
Connection ma_connection = DriverManager.getConnection(
-
"jdbc:mysql://mon_serveur:3306/ma_base", -
"mon_login", -
"mon_mot_de_passe" -
);
-
-
// Une requête simple -
String ma_requete = "select a, b from r" ;
-
-
// Requête en utilisant un Statement -
Statement mon_statement = ma_connection.createStatement();
-
-
// On récu -
ResultSet mon_resultset = mon_statement.executeQuery(ma_requete);
-
-
// récupération et traitement du résultat -
-
System.out.println ("Dans ma relation :") ;
-
while (mon_resultset.next ()) {
-
System.out.println( "| " +
-
mon_resultset.getString("a")
-
+" | "+
-
mon_resultset.getInt("b"));
-
} -
-
ma_connection.close();
-
-
} catch (java.sql.SQLException e) {
-
System.err.println(e);
-
System.exit(-1);
-
} -
} -
}