Cours "Modèles pour la persistance des objets"

DAO

Home (Contact

Objectif du TP :

En utilisant le modèle de conception DAO, implémenter en Java une des stratégies de mapping étudiée dans le TP précédent.

Support de cours


Description du problème et création des tables

Il est intéressant d'utiliser des DAO pour séparer la gestion de la persistance du reste d'une application. Il sera ainsi plus facile de changer de SGBD. Les DAO permettent aussi de factoriser le code lié à la persistance en le plaçant à un seul endroit de l'application.

Le code contenu dans ce fichier zip contient une partie de l'implémentation en Java du diagramme de classes fourni dans le TP sur le mapping. Pour simplifier ce TP, les lots et les factures ne seront pas pris en compte, ni pour la création des tables de la base de données, ni pour le code Java.

Dans ce TP vous utiliserez la stratégie de mapping "une seule table par arborescence d'héritage " pour traduire l'héritage du modèle objet.

Utilisez les tables suffixées par "1" créées dans le TP précédent.

Correction

Création des tables du TP précédent


DAO simplifié pour les stylos

  1. Ajoutez la classe DaoStylo pour implémenter la persistance des stylos vendus dans le magasin. Voici la méthode main qui utilisera ce DAO. Vous mettrez les DAO dans la paquetage fr.unice.article.dao. Ce DAO sera utilisé en local et il ne sera donc pas utile d'utiliser des DTO pour transférer les données entre les différentes couches de l'application.
    Comme il est préconisé dans le cours, vous envelopperez les exceptions spécifiques au support de persistance avec des exceptions non spécifiques DaoException. N'oubliez pas de chaîner l'exception d'origine (l'exception SQL) à la DaoException pour faciliter l'écriture et la mise au point des programmes qui utilisent le DAO. Les codes d'erreur ne seront utilisés que dans le dernier exercice.
    Pour commencer, faites simple. Vous pouvez utiliser une nouvelle connexion et transaction pour chaque méthode du DAO ; dans les cas réels il vaut mieux ne pas gérer les connexions (ni les transactions d'ailleurs) dans les DAOs (voir dernier exercice avec fabrique abstraite). N'implémentez que les méthodes utiles pour faire exécuter la méthode main.
    Voici un squelette de classe que vous pouvez utiliser pour gagner du temps. Pour faciliter l'utilisation des DAOs dans les TPs suivants sur JPA et les SGBDOOs, choisissez la variante des DAOs qui utilisent des objets en paramètres (comme dans le squelette de classe).
  2. Faites exécuter la méthode main une première fois. Modifiez ensuite les articles créés dans la méthode main et testez si vous pouvez retrouver les articles créés la première fois avec les méthodes du DAO.
  3. Avez-vous géré les cas où le code essaie d'ajouter un stylo qui existe déjà dans la base ? La méthode main doit afficher un message d'erreur et continuer son exécution. Testez.

Correction

DAO pour les stylos


DAO pour les ramettes

Ajoutez un DAO pour les ramettes. Le plus simple est de copier le DAO pour les stylos et de modifier juste ce qu'il faut pour l'adapter aux ramettes. Vous remarquerez à quel point l'écriture du code JDBC est fastidieuse, avec beaucoup de code répétitif.

Correction

DAO pour les ramettes


Tout n'est pas si simple...

  1. Comment allez-vous faire pour récupérer tous les articles de la base de données ? Implémentez une solution.
  2. Comment pourriez-vous faire pour ne pas avoir à créer une nouvelle connexion pour chaque méthode des DAO ?
  3. Testez ce code. Qu'en pensez-vous ? S'il s'affiche "Les 2 stylos sont les mêmes ? false", comment pourriez-vous modifier votre code pour ne pas risquer d'avoir en mémoire plusieurs objets qui représentent les mêmes données dans la base (ce qui peut provoquer des pertes de données) ?
  4. Pour simplifier, toutes les propriétés des articles ont des accesseurs publics. Que faudrait-il faire si certaines des propriétés des objets persistants n'avaient pas d'accesseur public ?

Correction

Réponses aux questions


Modèle "fabrique abstraite" pour les DAO

Utilisez le modèle de conception "fabrique abstraite" pour permettre de changer facilement de type et de support de persistance.

Écrivez le code en supposant que vous avez 3 types de persistance : JDBC, JPA et Db4o (des types de persistance que vous étudierez dans ce cours), mais n'implémentez que ce qui concerne JDBC, en adaptant les DAOs que vous avez déjà écrit dans ce TP. Dans un premier temps n'écrivez que la classe DAO pour les stylos. Testez avec cette méthode main qui utilise une fabrique abstraite pour obtenir les DAOs. Les informations de connexion sont lues dans un fichier de propriétés (dont le nom et l'emplacement sont indépendants du type de persistance).

Pour permettre aux applications de gérer les connexions et les transactions tout en cachant totalement le type de persistance, un interface Connexion vous est fournie. Cette interface jouera le rôle d'une connexion à la base de données pour tous les types de persistance. Une connexion correspond à une connexion à une base de données, indépendante du type de persistance utilisé. Pour être opérationnelle, une connexion doit être ouverte (et fermée quand on a fini de l'utiliser). L'implémentation pour JDBC vous est fournie ; cette implémentation lit les données nécessaire à la connexion dans un fichier de propriétés persistance.properties placé dans le classpath.

Il devra être possible de passer une connexion aux DAOs pour que le code qui utilise les DAOs puissent gérer lui-même les connexions et les transactions (une transaction pourra ainsi englober plusieurs opérations de DAOs). Lisez le code de la méthode main donnée ci-dessus pour plus de précisions.

Dans un deuxième temps vous ajouterez la fonctionnalité suivante : si le DAO n'a pas reçu de connexion, il utilise sa propre connexion ; il ouvre une connexion au début de la méthode CRUD, l'utilise, puis la ferme à la fin de la méthode.

Correction

Les classes et interfaces


Retour