Problème de compréhension

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour. Je viens tout juste découvrir le pattern DAO que je me pose quelque question. Par exemple sur OCR Herby propose

Image utilisateur

Pour la méthode find , il se peut qu'on veuille faire la recherche en fonction d'un autre critère que l'id. Dans ce cas faudrait-il utiliser 4 interfaces(pour chaque xxxDAO)?

Édité par kulturm@n

+0 -0

Bonjour.

L'interface proposée ici est relativement sommaire.

Si tu veux commencer à faire de la recherche sur des critères spécifiques aux instances que tu souhaites récupérer, tu devras effectivement écrire d'autres méthodes dans les classes *DAO filles.

Je pense que pour ce cas d'utilisation, tu as mieux fait de te tourner vers des ORM : https://fr.wikipedia.org/wiki/Mapping_objet-relationnel

+0 -0
Auteur du sujet

Mais je ne perds pas justement l'intérêt de DAO en faisant cela? Il existe des solution d'ORM pour JAVA SE? J'ai déjà un peu utilisé celui de django

Édité par kulturm@n

+0 -0

Tout dépend d'où tu tires tes données, en fait.

L'intérêt de la DAO, c'est de t'abstraire de la manière dont sont stockées les informations (en base de données ? Dans un fichier XML ? Dans un fichier JSON ? …).

Et dans ton exemple trivial, il y a juste besoin de récupérer un objet suivant son identifiant, ce qui ne relève sûrement pas de ton cas où tu vas piocher des informations en base de données suivant des critères précis.

J'ignore s'il existe réellement des ORM en Java.

+0 -0
Auteur du sujet

Merci pour vos réponses. J'ai essayé de faire une méthode trouver un peu générique

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public OperateurPhysique[] trouver(String filtre, Object... objs) 
{
        ResultSet res;
        OperateurPhysique[] ops = null;
        String sql = "SELECT * FROM matable WHERE ";
        StringTokenizer tokens = new StringTokenizer(filtre, ";");
        int t = objs.length;
        for(int i = 0 ; i < t ; i++)
        {
            if(i == 0)
                sql += tokens.nextToken() + " =  " + objs[i];
            else
                sql += "AND " + tokens.nextToken() + " =  " + objs[i];

        }

       //reste du code
}

Ainsi

1
trouver("nom;prenom" , "Lupin" , "Arsene")

exécutera la requête

1
SELECT * FROM matable WHERE nom = 'Lupin' AND prenom = 'Arsène'

Bien sur je compte utiliser des requêtes préparées plus tard. Qu'en pensez vous?

Édité par kulturm@n

+0 -0

J'en pense que fonctionnellement, c'est bien. Utilise les requêtes préparées le plus rapidement possible pour éviter les injections SQL.

D'un point de vue conceptuel, tu peux améliorer ça.

Je te ferais bien un exemple détaillé mais c'est chronophage, et j'ai du mal avec les noms de symboles à la française. :P

Essaie de faire une classe abstraite qui se contente de "trouver" les opérateurs en fonction de critères, puis des classes concrètes qui se contenteront de trouver ces opérateurs dans des sources de données différentes (base de données, fichiers xml, …). Comme ça, le jour où tu voudras utiliser une source de données différentes, tu n'auras qu'à écrire une nouvelle implémentation.

+0 -0
Auteur du sujet

OK, je vois vaguement ce que tu veux dire mais supposons que je sois sûr de ne jamais changer de système de persistance(donc rester sur une BDR).

Édité par kulturm@n

+0 -0

On n'est jamais sûr de rien, pour commencer. :)

Et quand bien même tu ne changerais jamais de "système de persistance", cela me semble logique de faire en sorte qu'une classe se charge d'une et une seule chose à la fois.

Après, si les maîtres mots de ton projet sont "faut que ça marche", ben… Va dans ce sens-là.

+0 -0

Pour l'interfaçcage, il semblerait plus judicieux en Java de te conformer à JPA (Java Peristence API) qui définit plus ou moins une convention pour s'interfacer ensuite avec un ORM respectant cette convention. JPA définit aussi bien une norme pour décrire tes objets que pour y faire des recherches…

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte