APIs au dessus de JDBC

publicité
Problèmes avec JDBC
JDBC ne contrôle pas les ordres SQL passés au
SGBD
‰ Une faute de frappe dans le nom d’une table ou
une faute de syntaxe dans un ordre SQL ne
seront donc repérées qu’à l’exécution
‰
APIs au-dessus de JDBC
Université de Nice - Sophia Antipolis
Richard Grin
Version 0.3 – 3/9/06
R. Grin
page 2
Autres API
Problèmes avec JDBC
La correspondance entre les classes Java et les
tables relationnelles est un travail de bas niveau
‰ Le programmeur doit faire attention à des détails
et écrire de nombreuses lignes pour travailler
avec les données de la base
‰ Pourtant une grande partie de ce travail répétitif
peut être automatisé
‰
R. Grin
R. Grin
‰
JDBC
JDBC
page 3
D’autres API ont été construites au-dessus de
JDBC pour corriger les problèmes de JDBC :
n SQLJ
n JDO
n outils de mapping
n et bien d’autres…
JDBC
page 4
SQLJ
SQLJ est un standard promu par un consortium
d’éditeurs de SGBD (Oracle, IBM et Sun en
particulier) composé de 3 parties
‰ La partie 0 de SQLJ fait partie de SQL3
‰ Cette partie définit des extensions de SQL pour
permettre d’insérer directement des ordres SQL
au milieu d’un programme Java
‰ Par exemple, une variable Java peut recevoir une
valeur retournée par une requête SQL
‰
SQLJ
R. Grin
JDBC
page 5
R. Grin
JDBC
page 6
1
Exemple de code avec SQLJ
Précompilateur SQLJ
import sqlj.runtime.ref.*;
import java.sql.*;
. . .
String nom;
int matricule = 1500;
#sql { select NOME into :nom from EMP
where MATRICULE = :matricule};
System.out.println("Nom : " + nom);
R. Grin
Un précompilateur transforme les ordres SQL en
instructions Java contenant des appels de
méthodes JDBC
‰ Le résultat est un programme source Java que
l’on peut compiler avec un compilateur Java
ordinaire
‰ Ce précompilateur contrôle la validité des ordres
SQL ; il en faut donc un par SGBD cible
‰
JDBC
page 7
R. Grin
Principe de SQLJ
Fichier source Précompilateur
.sqlj
SQLJ
‰
Fichier de
ressources
Fichier source
.java
page 8
Avantages de SQLJ sur JDBC
Code SQL bien séparé du code Java
Moins de lignes de code
‰ Code plus lisible
‰ Plus de portabilité
‰ Code plus orienté objet
‰ Syntaxe des instructions SQL et cohérence avec la
structure de la base vérifiées pendant la
précompilation, et pas à l’exécution (par exemple,
existence et type des colonnes)
‰
Compilateur
Java
Fichier
.class
Ce procédé est déjà utilisé pour de nombreux
langages (C, Cobol, Ada,…) pour insérer des
instructions SQL
R. Grin
JDBC
JDBC
page 9
‰
R. Grin
JDBC
page 10
Avantages de JDBC sur SQLJ
JDBC permet de créer dynamiquement un ordre
SQL (en manipulant des chaînes de caractères)
‰ Avec SQLJ, on doit connaître l'ordre SQL au
moment où on écrit le code
‰ Compilation plus lourde en SQLJ (mais la tâche est
facilitée par des utilitaires de type make ou Ant)
‰
R. Grin
JDBC
page 11
JDO
R. Grin
JDBC
page 12
2
JDO
Transparence de la persistance
JDO est un projet plus ambitieux que SQLJ
puisqu’il souhaite rendre en grande partie
transparente la persistance des objets Java
‰ Le code Java écrit par les développeurs ne
s’occupe pas de la persistance
‰ JDO nécessite une infrastructure complexe, à la
compilation, et durant l’exécution, fournie par une
implémentation JDO
‰
Les classes qui pourront avoir des instances
persistantes sont dites « capables de
persistantes »
‰ Le principe de base de JDO est que le
programmeur n’écrit aucun code pour gérer la
persistance
‰ Le code source d’une classe est exactement le
même, que la classe soit capable de persistance
ou non
R. Grin
R. Grin
‰
JDBC
page 13
Pour rendre une instance persistante, il suffit
d’utiliser la méthode makePersistent (voir code
‰
En fait la plupart des instances sont rendues
persistantes automatiquement, « par référence »
(by reachability) :
si on rend persistant une instance de Employe,
dont la classe possède un champ capable de
persistance de type Adresse, son adresse
devient automatiquement persistante
plus loin)
R. Grin
JDBC
La persistance peut s’effectuer sur un support
logique quelconque : SGBD relationnel ou objet, ou
même fichiers ordinaires
‰ Il suffit d’avoir une implémentation JDO (qui joue le rôle
d’un driver JDBC) adaptée à ce support
‰ La persistance ne tient compte que de la description
logique des classes persistantes (méta-données),
fournie par un fichier XML écrit par le développeur
‰ Il est ainsi très facile de changer de support
‰
page 15
R. Grin
Enrichissement JDO
Les classes capables de persistance sont
indiquées dans un fichier XML de configuration
‰ Elles doivent être « enrichies » par un programme
spécial, fourni par l'implémentation de JDO et
adapté à un SGBD cible
‰ Cet enrichissement ajoute les méthodes qui
permettront à l’implémentation JDO de gérer la
persistance des instances pendant l’exécution
JDBC
JDBC
page 16
Exemple de code avec JDO
‰
R. Grin
page 14
Portabilité
Rendre une instance persistante
‰
JDBC
page 17
Ce code va ajouter une adresse dans une base de
donnée
‰ La classe Adresse n’est pas donnée car elle est
semblable à une classe Java normale
‰ Le schéma de la base doit comporter une table
dont la structure correspond aux champs
persistants de la classe Adresse
‰
R. Grin
JDBC
page 18
3
Fichier des méta-données
Outils JDO
‰
Les implémentations JDO fournissent des outils (pas
obligatoires) pour
n créer automatiquement des schémas de base de
données compatibles avec les classes
persistantes,
n ou inversement, pour créer des classes
compatibles avec des tables existantes
R. Grin
JDBC
page 19
Récupérer un
gestionnaire de persistance
JDBC
R. Grin
JDBC
page 20
Exemple (suite)
// Crée fabrique de gestionnaire de persistance
PersistenceManagerFactory pmf =
JDOHelper.getPersistenceManagerFactory(
jdoProperties);
pmf.setConnectionURL(DBURL);
pmf.setConnectionDriverName(DBDRIVER);
// Retrouve le gestionnaire de persistance
PersistenceManager pm =
pmf.getPersistenceManager();
R. Grin
<?xml version="1.0"?>
<!DOCTYPE jdo SYSTEM "jdo.dtd">
<jdo>
<package name="fr.truc.projet1">
<class name="Adresse">
<field name="rue"/>
<field name="ville"/>
<field name="codePostal"/>
</class>
</package>
</jdo>
page 21
// Démarrer une transaction
Transaction t = pm.currentTransaction();
t.begin();
// Crée une nouvelle Adresse
Adresse adresse = new Adresse("58 rue Victor Hugo",
"Nice", "06100");
//... et la rend persistante
pm.makePersistent(adresse);
// adresse automatiquement enregistrée dans la
// base au commit !
t.commit();
// Fermeture du gestionnaire de persistance
pm.close();
R. Grin
JDBC
page 22
Outils de mapping
Ils automatisent la correspondance entre les
données correspondant à l’état des objets et les
données enregistrées dans les bases de données
relationnelles
‰ Standardisé avec JPA
‰ Ils sont étudiés dans une autre partie du cours
(mapping objet-relationnel et JPA)
‰
R. Grin
JDBC
page 23
4
Téléchargement