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