# Java > Gnral Java > Persistance des donnes >  Mapper sa base de donnes avec le pattern DAO [Tutoriel]

## cysboy

Bonjour  toutes et tous !

Je viens de terminer un tuto sur l'utilisation du pattern DAO.

Vu que ce pattern permet d'encapsuler la faon dont un programme rcupre les donnes d'un systmes de stockage (fichier, BDD...), un exemple avec une base de donnes tait de mise.  ::): 
Nous allons aussi voir comment associer ce pattern avec le pattern Factory afin de pouvoir utiliser plusieurs systmes de stockage.

Quelques pr-requis sont toutefois ncessaire : savoir utiliser JDBC !

D'avance merci pour vos commentaires.

----------


## *alexandre*

Hello,

Pour une utilisation simple sans ORM c'est tout  fait concevable et mme trs bien dfinit pour.

Mais pour de l'Hibernate, TopLink ou autre JDO c'est pas possible. 

Et pour la reprsentation en en tant que String tu peux utilis ceci 



```

```

----------


## toomsounet

Merci pour ce tutoriel, c'est toujours bon de commencer par l avant de se pencher vers un ORM.

----------


## korrigan

Bonjour

Une question  propos de ce tutoriel :
Le pattern singleton est utilis afin d'instancier la connexion  la base de donnes. Est ce que dans le cas d'une appli web il est judicieux d'utiliser ce pattern ?

----------


## PanicKernel

> Bonjour
> 
> Une question  propos de ce tutoriel :
> Le pattern singleton est utilis afin d'instancier la connexion  la base de donnes. Est ce que dans le cas d'une appli web il est judicieux d'utiliser ce pattern ?


Non, il faudrait utiliser un pool de connexion

----------


## khaledUSTHB

Merci pour ce tuto , Mais Concernant le code source , Est ce qu'il n'y a pas de mthode pour le gnrer automatiquement (un plugin eclipse par exemple) ?
Parce que pour une BD contenant plus de 100 Tables on doit ecrire au moin 
(100 x 2) Classes ? Merci . ::):

----------


## *alexandre*

> Merci pour ce tuto , Mais Concernant le code source , Est ce qu'il n'y a pas de mthode pour le gnrer automatiquement (un plugin eclipse par exemple) ?
> Parce que pour une BD contenant plus de 100 Tables on doit ecrire au moin 
> (100 x 2) Classes ? Merci .


 ma connaissance aucun plugin ne gnre de dao uniquement bas sur une bd mise  part dans l'utilisation de hibernate si tu veux hibernate utilise myeclipse c'est pas chre ...

----------


## boulekwas

Merci pour ce tutoriel, l'exemple est simple et claire, il m'a beaucoup servi  :;):

----------


## alatox

Bon tutorial dans l'ensemble mais sur les codes d'exemples les objets "Factory" sont utiliss avant mme que la notion de "Factory" soit introduite donc on ne peut pas compiler pour faire les premiers tests. Il faut lire le tutorial en entier pour arriver  faire quelques choses.

Pour ce qui est d'Hibernate il faut quand mme dcrire la base de donnes au format XML et c'est assez fastidieux lorsque l'on a beaucoup de tables, notamment des tables de jointure.

----------


## Syphys

Bonjour!!! merci pour ce tuto mais comme le message ci-dessus le dit : la mthode d'apprentissage progressive ne peut pas s'appliquer quelqu'un peu m'expliquer comment faire sans "Factory" ou si c'est pas possible m'expliquer ce qu'il y a  comprendre...?
J'ai du mal  faire la part des choses quand les testes ne marchent pas et surtout ne peuvent pas marcher  ::oops:: 

s'il suffit de mettre les lignes en commentaires ou je sais pas quoi d'autre dites le moi c'est tout nouveau pour moi les concepts comme a j'aimerai bien comprendre. Merci

----------


## _skip

Alors au risque de passer le gros vilain mchant :

Quand je vois a :



```

```

Je me dis que c'est  corriger quand mme, c'est un truc qui se ne se fait pas de bricoler des requtes par concatnation de bouts de morceau de trucs  ::mrgreen:: . On utilise des requtes paramtres.


En plus a



```

```

C'est de trs loin pas suffisant comme gestion d'erreur, toutes tes requtes font un chec silencieux et retourne des valeurs  la noix ce qui est le pire antipattern imaginable en terme de gestion d'exception.

Et aussi, le pattern session-per-application qui est utilis pour la connexion au SGBD est lui aussi une mthode trs peu recommendable.

Puis pourquoi utiliser des resultSet updatable alors que forward_only suffit largement? Es-tu sr du bien-fond de ce choix?

----------


## hibour

C'est une bonne initiative, mais je trouve que ton exemple n'est pas vraiment pratique, ce n'est pas gnrique, la classe DAO<T> n'apporte aucune factorisation et je ne vois pas sa rutilisation!! Il faut autant de classes DAO que de classes mtier, et on est oblig d'implmenter des mthodes que parfois on en a pas vraiment besoin (si un objet n'est pas updatable par exemple).
Gestion des exceptions quasi nulle comme l'a dit _skip.

----------


## lolo104

> Alors au risque de passer le gros vilain mchant :
> 
> Quand je vois a :
> 
> 
> 
> ```
> 
> ```
> ...




je sais pas comment on peut grer les sessions avec Pattern DAO ???

j utlise JSP et Struts pour les couche Vue et controller.


Merrrrrci bien

----------


## leBonSens

C'est bien comme introduction  DAO, sinon pour la gestion d'exception ou autres, je pense que c'est pas obligatoire lorsque le code ne serait qu'un exemple d'une introduction.

Pour la mise  jour de socit, vous mettez  jour les attributs de l'object et aussi les objects de Developpeur en relation, a c'est exact. Mais vous faites  chaque maj insert dans la table de relation entre Societe et Developpeur ce qui me semble illogique et faux.

----------


## ROUGE87

Bonjour,

j'utilise le pattern DAO et trois cas se prsentent dans mon cas:
1) une table qui n'a pas de foreign key. ceci fonctionne parfaitement. voici les codes pour l'objet mtier et l'objet DAO.

---- Objet mtier :



```

```

Voici l'objet DAO :



```

```

2) une table qui contient un foriegn key vers une autre table. je suis arriv  rsoudre ce probme et voici les codes.

Objet mtier:



```

```

et l'objet DAO :



```

```

3) une table qui contient un foriegn key vers la cl primaire de la meme table. je ne suis toujours pas arriv  rsoudre ce probme!!

voici un site gnrateur automatique de classes objet et classes DAO :
http://titaniclinux.net/daogen .

Merci.

----------


## Logan Mauzaize

Il faut que les diffrents DAO puissent partager la mme transaction et donc la mme connexion.Il faut contrairement  ton cas que les mthodes public des DAO ne grent pas de connexion.Il faut que les DAO puissent dprendre des uns et des autres. Par exemple ton Board_refDao ne vrifie pas la persistance des Port_type rfrencs.Il faut utiliser des requtes paramtres plutt que construire une chane  la vole (attention au hack ou erreurs)

Pour ton problme pur, je vois rien de compliquer :


```

```

----------


## aurelien1606

Bonjour, 

j'exprimente ce tuto pour mon apprentissage et je me pose la question suivante:
Comment faire une requte qui utilise plusieurs tables en utilisant les principes du tuto prsent?

Faut-il y un super objet qui autorise  faire une requte sur 2 tables?

De ce que j'ai compris c'est que chaque DAO reprsente une table en base et que une table DAO manipule uniquement les donnes de sa table.
D'o ma question, comment faire une jointure si un objet DAO ne peut faire de requte que sur sa propre table en base?

En vous remerciant,

----------


## PhilippeGibault

Bonjour,

Je suis en dsaccord avec un point dans ce tutoriel.

Dans ce tutoriel, la DAO est une classe abstraite. Or, a devrait tre une interface. Les personnes (ou plus exactement les classes dans lesquelles on va injecter la bonne DAO) ne doivent voir que les mthodes, et ne pas avoir vent de l'implmentation.

Je rappelle, pour la mme raison, que Joshua Bloch explique qu'il faut prfrer les interfaces aux classes abstraites.

Par ailleurs, la connexion  la BDD est publique, soit visible par l'extrieur (comme un contrleur qui ne doit pas connaitre la BDD).

Pire, on spcifie directement la BDD. Si on veut changer...

La connexion devrait tre inject. 

Cordialement

----------


## OButterlin

C'est une ancienne discussion, les ORM n'taient pas omniprsents  l'poque.

Ceci dit, par rapport au dernier commentaire, classe abstraite ou interface, dans bien des cas, surtout avec les ORM, la classe abstraite est bien plus adapte puisqu'elle contient un code gnrique, la seule chose qui doit tre spcifie dans la classe c'est le type cible. Ce qui n'exclue pas d'avoir une interface en plus pour la raison qui suit.
Une interface aurait t plus adapte si on avait eu plusieurs classes abstraites en fonction de spcificits, d'ailleurs tel qu'est cod la classe abstraite de l'exemple, comme elle inclue la connexion, a aurait t utile... surtout que l'exemple parle de DAO XML... tendant DAO... laquelle contient une Connection... Bof bof bof...

Pour la connexion, je suis d'accord, elle n'a pas  tre cre dans la classe abstraite.

Par contre,si vraiment on veut critiquer quelque chose, il y a un truc qui m'corche les yeux c'est la mthode update  :8O: 
Utiliser un Statement au lieu d'un PreparedStatement est juste une grossire erreur. Essayez de mettre un nom comme "*O'Reilly*" dans la base... plantage assur  ::aie::  

Sinon, a montre quand mme bien les principes de la DAO, donc ne soyons pas trop pointilleux  ::D:

----------


## PhilippeGibault

Bonnjour,

Une classe abstraite, c'est pour faire du Template Method ( https://en.wikipedia.org/wiki/Template_method_pattern )

L'interface, c'est le contrat. C'est ce que voit le client et ce qui est inject dans divers classe (via Spring, ou les EJB ou constructeur) ou donn par factory au pire.

Celui qui utilise la DAO, il a juste besoin d'une interface DAO, et d'utiliser les mthodes de cette interface. Il n'a pas besoin de savoir comment a fonctionne.

C'est d'ailleurs un principe pour faire du bon code ( https://fr.wikipedia.org/wiki/Masqua...%27information ).

Cordialement.

----------


## OButterlin

Comme je l'ai dj dit, la classe abstraite est intressante du point de vue de la classe d'instance pour ce qui est du code gnrique.
Si on a diffrents scnarios qui impliquent des factorisations de code diffrentes, alors l'interface se justifie pleinement puisqu'on n'aura plus une classe abstraite mais plusieurs.
Par contre, s'il n'existe qu'un scnario, alors on n'en a pas besoin (mme si dans un souci d'volutivit future on pourrait quand mme passer par une interface), c'est aussi simple que a.

----------

