Problème de compréhension

a marqué ce sujet comme résolu.

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)?

+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

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.

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?

+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.

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à.

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…

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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