Programmation Java - Où les instructions SQL doivent-elles être stockées? [fermé]

107

Où une application compatible JDBC doit-elle stocker ses instructions SQL et pourquoi?

Jusqu'à présent, j'ai réussi à identifier ces options:

  • Codé en dur dans les objets métier
  • Intégré dans les clauses SQLJ
  • Encapsuler dans des classes séparées, par exemple les objets d'accès aux données
  • Basé sur les métadonnées (découpler le schéma d'objet du schéma de données - décrire les mappages entre eux dans les métadonnées)
  • Fichiers externes (par exemple, fichiers de propriétés ou de ressources)
  • Procédures stockées

Quels sont les «avantages» et les «inconvénients» pour chacun?

Le code SQL doit-il être considéré comme «code» ou «métadonnées»?

Les procédures stockées doivent-elles être utilisées uniquement pour l'optimisation des performances ou sont-elles une abstraction légitime de la structure de la base de données?

La performance est-elle un facteur clé dans la décision? Qu'en est-il du verrouillage des fournisseurs ?

Qu'est-ce qui est mieux - couplage desserré ou couplage serré et pourquoi?

EDITED: Merci à tous pour les réponses - voici un résumé:

Mappages relationnels d'objets (ORM) basés sur les métadonnées

Avantages:

  • Très abstrait - le serveur de base de données peut être commuté sans qu'il soit nécessaire de changer de modèle
  • Large diffusion - pratiquement une norme
  • Réduit la quantité de SQL nécessaire
  • Peut stocker SQL dans des fichiers de ressources
  • La performance est (généralement) acceptable
  • Approche axée sur les métadonnées
  • (Base de données) Indépendance des fournisseurs

Les inconvénients:

  • Cache les intentions de SQL et des véritables développeurs
  • SQL difficile à réviser / modifier par DBA
  • SQL peut encore être nécessaire pour les cas impairs
  • Peut forcer l'utilisation d'un langage de requête propriétaire, par exemple HQL
  • Ne se prête pas à l'optimisation (abstraction)
  • Peut manquer d'intégrité référentielle
  • Remplace le manque de connaissances SQL ou le manque de soin du code dans la base de données
  • Ne correspond jamais aux performances de la base de données native (même si elles s'en rapprochent)
  • Le code du modèle est très étroitement associé au modèle de base de données

Codé en dur / encapsulé dans la couche DAO

Avantages:

  • SQL est conservé dans les objets qui accèdent aux données (encapsulation)
  • SQL est facile à écrire (vitesse de développement)
  • SQL est facile à localiser lorsque des modifications sont nécessaires
  • Solution simple (pas d'architecture désordonnée)

Les inconvénients:

  • SQL ne peut pas être révisé / modifié par DBA
  • SQL est susceptible de devenir spécifique à la base de données
  • SQL peut devenir difficile à maintenir

Procédures stockées

Avantages:

  • SQL conservé dans la base de données (proche des données)
  • SQL est analysé, compilé et optimisé par le SGBD
  • SQL est facile à réviser / modifier pour DBA
  • Réduit le trafic réseau
  • Une sécurité accrue

Les inconvénients:

  • SQL est lié à la base de données (verrouillage du fournisseur)
  • Le code SQL est plus difficile à maintenir

Fichiers externes (par exemple, fichiers de propriétés ou de ressources)

Avantages

  • SQL peut être modifié sans avoir besoin de reconstruire l'application
  • Découple la logique SQL de la logique métier de l'application
  • Référentiel central de toutes les instructions SQL - plus facile à maintenir
  • Plus facile à comprendre

Les inconvénients:

  • Le code SQL peut devenir non maintenable
  • Plus difficile de vérifier le code SQL pour les erreurs (de syntaxe)

Intégré dans les clauses SQLJ

Avantages:

  • Meilleure vérification de la syntaxe

Les inconvénients:

  • Est trop lié à Java
  • Performances inférieures à JDBC
  • Manque de requêtes dynamiques
  • Pas si populaire
Adrian
la source
Bonnes questions mais peut-être un peu trop de réponses à la fois. Il faudrait quelques pages pour répondre à toutes ces questions à mon humble avis: p
NickDK
+1 Bonne question! Vous devez ajouter "ORM" par @ocdecio. Ajoutez également "saupoudré partout dans votre code Java" (ce que j'ai vu et doit être le pire).
Jim Ferrans
2
Je suis tout à fait en désaccord avec «le code SQL est plus difficile à maintenir» sous les procédures stockées. Dans mon XP, SQL était plus facile à maintenir une fois qu'il était entré dans la base de données. En partie pour une raison utilisée dans les fichiers externes (référentiel central de toutes les instructions SQL - plus facile à maintenir), et les paramètres sont plus faciles à gérer.
Michael Lloyd Lee mlk
1
À mon avis, vous avez manqué une option: l'utilisation des vues. Vous pouvez exprimer du SQL complexe dans des vues, puis simplement exprimer des sélections simples sur ces vues (en utilisant n'importe quel type d'abstraction: DAO, SQLJ, ORM, etc.). Vous aurez des avantages similaires à ceux des procédures stockées, mais je ne pense pas que vous aurez aucun de leurs inconvénients ...
Lukas Eder

Réponses:

31

Habituellement, plus l'application se développe en termes de taille et / ou de réutilisabilité, plus il est nécessaire d'externaliser / abstraire les instructions SQL.

Le codage en dur (sous forme de constantes finales statiques) est la première étape. L'étape suivante est stockée dans un fichier (propriétés / fichier xml). Les métadonnées (comme cela est fait par un ORM comme Hibernate / JPA) est la dernière étape.

Le codage en dur présente l'inconvénient que votre code est susceptible de devenir spécifique à la base de données et que vous devez réécrire / reconstruire / redistribuer à chaque modification. L'avantage est que vous l'avez en un seul endroit.

Le stockage dans un fichier présente l'inconvénient qu'il peut devenir impossible à maintenir lorsque l'application se développe. L'avantage est que vous n'avez pas besoin de réécrire / reconstruire l'application, sauf si vous devez ajouter une méthode DAO supplémentaire.

Les métadonnées ont l'inconvénient que le code de votre modèle est très étroitement associé au modèle de base de données. Pour chaque changement dans le modèle de base de données, vous devrez réécrire / reconstruire / redistribuer le code. L'avantage est qu'il est très abstrait et que vous pouvez facilement passer du serveur DB sans avoir à changer de modèle (mais demandez-vous maintenant: à quelle fréquence une entreprise passerait-elle du serveur DB? Probablement au moins une fois tous les 3 ans, n'est-ce pas? t-il?).

Je n'appellerai pas les procédures stockées une «bonne» solution pour cela. Ils ont un but entièrement différent. Même si, votre code dépendrait de la base de données / configuration utilisée.

BalusC
la source
21

Je ne sais pas si c'est optimal, mais d'après mon expérience, ils finissent par être codés en dur (c'est-à-dire les littéraux de chaîne) dans la couche DAO.

flybywire
la source
5
Ce n'est probablement pas optimal mais c'est ce que je fais aussi. Facile à écrire, facile à localiser et aucune architecture désordonnée à craindre.
James Cronen
21
Et tout le temps passé à traquer le SQL codé en dur est la sécurité de l'emploi. Si vous êtes la seule personne à savoir où se trouve le SQL, vous ne pouvez pas être renvoyé.
S.Lott
11
Je suis toujours étonné que de nombreuses personnes qui prennent soin de créer du code Java OO bien conçu et propre soient les mêmes personnes qui tolèrent d'écrire du SQL désordonné et non performant et de le coller sous forme de chaînes à des endroits aléatoires. Si votre SQL n'est que des chaînes dans votre couche DAO, je peux à peu près garantir que vous n'avez pas DBA dans votre équipe. Du moins pas un bon DBA.
Daniel Pryden
3
-1. Il est acceptable d'avoir des DAO, mais au moins déplacez les requêtes vers un fichier de propriétés quelque part afin qu'un DBA puisse les examiner et les modifier si nécessaire!
cethegeek
3
Mon expérience a été que, si vous faites du JDBC simple, placer la chaîne de requête dans une couche d'objet d'accès aux données est probablement la meilleure approche si vous ne pouvez pas utiliser une solution ORM. Une fois la mise en garde, assurez-vous que tout le monde est sur la même longueur d'onde avec les normes de codage pour les classes DAO si vous allez dans cette direction. J'ai parcouru à la fois le paquet de ressources et les routes de procédure stockée et les deux ont été des cauchemars de maintenance absolus car il répartit la logique d'accès aux données sur plusieurs couches, donc l'ajout d'une colonne à une requête vous oblige à changer les choses à différents endroits.
Jason Gritman
12

Je ne pense pas que quiconque vous donnera la ventilation pour / contre que vous voulez, car c'est une question assez vaste. Alors, voici ce que j'ai utilisé dans le passé et ce que j'utiliserai à l'avenir.

J'utilise pour utiliser SQL codé en dur dans la DAL. Je pensais que c'était bien jusqu'à ce que les DBA aient envie de jouer avec le SQL. Ensuite, vous devez le déterrer, le formater et le transmettre aux DBA. Qui en rira et remplacera tout. Mais sans les jolis points d'interrogation, ou les points d'interrogation dans le mauvais ordre et laissez-vous le coller dans le code Java.

Nous avons également utilisé un ORM, et bien que cela soit idéal pour les développeurs, nos administrateurs de base de données l'ont détesté car il n'y a pas de SQL dont ils puissent rire. Nous avons également utilisé un ORM étrange (un ORM personnalisé d'un fournisseur tiers) qui avait l'habitude de tuer la base de données. J'ai utilisé JPA depuis et c'était génial, mais obtenir quelque chose de compliqué en l'utilisant au-delà des DBA est une bataille ascendante.

Nous utilisons maintenant des procédures stockées (avec l'instruction call codée en dur). Maintenant, la première chose dont tout le monde se plaindra est que vous êtes lié à la base de données. Vous êtes. Cependant, à quelle fréquence avez-vous changé de base de données? Je sais pertinemment que nous ne pouvions tout simplement même pas essayer, la quantité d'autres codes en dépendant, ainsi que le recyclage de nos DBA et la migration des données. Ce serait une opération très coûteuse. Cependant, si dans votre monde, changer les DB en un clin d'œil est nécessaire, les SP sont probablement hors service.

À l'avenir, j'aimerais utiliser des procédures stockées avec des outils de génération de code pour créer des classes Java à partir de packages Oracle.

Edit 2013-01-31 : Quelques années et DBA plus tard et nous utilisons maintenant Hibernate, en passant à SQL (procs stockés dans la base de données) uniquement lorsque cela est absolument nécessaire. Je pense que c'est la meilleure solution. 99% des fois, les bases de données n'ont pas à se soucier du SQL, et les 1% qu'elles le font se trouvent dans un endroit avec lequel elles sont déjà à l'aise.

Michael Lloyd Lee mlk
la source
1
+1 pour l'idée d'écrire des procédures stockées puis de générer du code Java à partir de celles-ci, et non l'inverse.
Daniel Pryden
Mon point de vue est que la couche Java ne doit PAS imiter ou mapper en aucune façon la couche DB. Je pense que si vous essayez d'abstraire le package Oracle, créez un autre package ou plusieurs procédures d'emballage. J'essaie de séparer logiquement complètement les deux par la pratique.
Jé Queue
2
@Xepoch: Je suis en fait d'accord - j'aurais peut-être dû formuler mon commentaire différemment. Votre base de données doit refléter votre modèle de données (modèle de relation d'entité), et votre modèle d'objet doit également refléter votre modèle de données (bien que pas nécessairement identique). Donc, ils devraient au moins être liés. En termes de génération de code Java à partir de procédures stockées, le fait est que l'API permettant d'accéder à votre base de données doit être dérivée de la structure de votre modèle de données, et non de votre modèle de données dérivé de la structure de vos objets.
Daniel Pryden
Vous pourriez être intéressé à utiliser jooq.org . Il fait exactement ce que vous avez dit: "génération de code pour créer des classes Java à partir de packages Oracle". En dehors de cela, il est livré avec un DSL de type SQL, similaire à LINQ en C #, si vous avez besoin d'exprimer SQL en Java, que vous ne pouvez pas placer dans une procédure stockée.
Lukas Eder
10

En utilisant un ORM (tel que la mise en veille prolongée), vous n'aurez, espérons-le, aucune instruction SQL à craindre. Les performances sont généralement acceptables et vous bénéficiez également de l'indépendance du fournisseur.

Otávio Décio
la source
13
-1 vous aurez des instructions HQL et la plupart des problèmes persistent concernant HQL. Seront-ils à l'intérieur du code (littéraux de chaîne), requêtes nommées dans les annotations, requêtes nommées dans des fichiers xml, stockées dans des fichiers de propriétés?
flybywire
1
@flybywire - avec Hibernate, il est rare de recourir à HQL. Pour 98% des cas, la requête par exemple et par critères (c'est-à-dire à l'aide d'objets) suffit.
SingleShot
2
@SingleShot, je ne suis pas d'accord. S'il est quelque chose de plus complexe que par id select, je pense qu'il est fait avec HQL. Je dirais que les critères et l'exemple sont utilisés lors de la recherche par interface utilisateur comme dans un écran de recherche dans un catalogue de bibliothèque. Mais voyons ce que les autres pensent.
flybywire
3
@SingleShot - Je ne suis pas du tout d'accord. Nous utilisons beaucoup de HQL, en particulier pour signaler des requêtes. Certaines fonctionnalités HQL n'ont pas du tout été prises en charge par des critères (en utilisant des fonctions SQL personnalisées, des constructeurs dans la clause select). QBE peut parfois conduire à plus de problèmes qu'il en résout.
javashlook
4
«Avec Hibernate, il est rare de recourir à HQL» est de loin la chose la plus drôle que j'ai entendue aujourd'hui. QBE est ridicule; et alors que vous devrez peut-être recourir à des critères pour les requêtes d'interface utilisateur, les requêtes bien définies (rapports / interaction de service / etc ...) devraient toutes être en HQL.
ChssPly76
10

Le code SQL doit-il être considéré comme «code» ou «métadonnées»?

Code.

Les procédures stockées doivent-elles être utilisées uniquement pour l'optimisation des performances ou sont-elles une abstraction légitime de la structure de la base de données?

Les procédures stockées permettent la réutilisation, y compris à l'intérieur d'autres procédures stockées. Cela signifie que vous pouvez effectuer un voyage vers la base de données et lui faire exécuter les instructions de support - le moins de trafic est idéal. ORM ou sproc, le temps passé sur le fil allant au db & back est quelque chose que vous ne pouvez pas récupérer.

ORM ne se prête pas à l'optimisation en raison de son abstraction. IME, ORM signifie également un manque d'intégrité référentielle - rendre une base de données difficile à rapporter. Ce qui a été économisé en complexité a maintenant augmenté pour pouvoir extraire les données de manière viable.

La performance est-elle un facteur clé dans la décision? Qu'en est-il du verrouillage des fournisseurs?

Non, la simplicité l'est. Le verrouillage du fournisseur se produit également avec la base de données - SQL est relativement standardisé, mais il existe encore des moyens spécifiques au fournisseur de faire les choses.

Poneys OMG
la source
4
+1 pour appeler le code SQL. Trop d'outils ORM essaient de cacher SQL, alors qu'en fait c'est souvent le meilleur langage pour exprimer ce que vous essayez de faire. Et je suis d'accord avec votre opinion que les procédures stockées sont meilleures que ORM, bien que je doute que ce soit une opinion populaire ici.
Daniel Pryden
9

La peur du verrouillage des fournisseurs dans le monde Java est intéressante.

J'espère que vous n'avez pas payé 50000 $ par processeur pour Oracle Enterprise, et que vous n'avez ensuite utilisé que le plus petit dénominateur commun pour passer à Mysql d'une minute à l'autre. Comme tout bon DBA vous le dira, il existe des différences subtiles entre les différentes bases de données de grands noms, en particulier en ce qui concerne les modèles de verrouillage et la façon dont ils parviennent à la cohérence.

Donc, ne prenez pas de décision sur la façon d'implémenter vos appels SQL uniquement sur la base du principe SQL indépendant du fournisseur - ayez une vraie raison (commerciale) de le faire.

Hennings
la source
1
Oh, rien de tout ça! La principale préoccupation est de permettre à l'équipe de support de modifier les instructions SQL (par exemple pour le réglage, les tâches liées à DBA) et d'améliorer la visibilité sur ce que fait l'application (en relation avec la base de données. L'équipe de support n'a pas de savoir-faire Java et elle ne le fera pas) soyez heureux de regarder en détail dans le code. L'application sera un nouvel ajout à un grand nombre d'applications existantes utilisant toutes une base de données Ingres.
Adrian
6

SQL inside Stored Procedures est optimisé par le système de base de données et compilé pour la vitesse - c'est sa maison naturelle. SQL est compris par le système de base de données, analysé par le système de base de données. Gardez votre SQL dans la base de données si vous le pouvez; enveloppez-le dans des procédures ou des fonctions stockées ou dans toutes les unités de logique fournies par le système de base de données, et faites-y des appels simples en utilisant l'un des outils que vous ou quelqu'un d'autre avez mentionnés.

Pourquoi stocker le code SQL du système de base de données en dehors de la base de données? Souvent pour la vitesse de développement. Pourquoi utiliser le mappage ORM? - Certains disent que le mappage ORM offre une compatibilité entre différents systèmes de base de données; Cependant, il est rare dans le monde réel qu'une application s'éloigne de la plate-forme de base de données lorsqu'elle a été construite, en particulier lorsqu'elle commence à utiliser des fonctionnalités avancées telles que la réplication, et pour les rares occasions où le système de base de données est remplacé, un certain travail est justifié . Je crois que l'un des inconvénients d'ORM est souvent le substitut au manque de connaissances SQL ou au manque de soin pour coder dans la base de données. De plus, ORM ne correspondra jamais aux performances de la base de données native, même s'il s'en rapproche.

Je suis d'accord pour conserver le code SQL dans la base de données et lui faire des appels simples via n'importe quelle API ou interface que vous souhaitez utiliser. Abstenez-vous également du point auquel vos appels de base de données sont effectués en plaçant ces appels derrière une classe abstraite ou une interface OO (exprimée par des méthodes), donc si jamais vous échangez dans un nouveau type de source de données, il sera transparent pour la couche métier. .

John K
la source
+1 Beau point de vue. Vous serez intéressé par ce billet de blog, je pense: database-programmer.blogspot.com/2010/12/… .
Lukas Eder
5

La seule question que vous posez et qui a une réponse définitive est "Est-ce du code SQL ou des métadonnées?" C'est très certainement du code et en tant que tel, il doit être conservé dans une sorte de contrôle du code source et disposer d'un système permettant de facilement mettre à jour la dernière version et de revenir en arrière si les choses tournent mal.

J'ai vu trois façons de faire du SQL dans une application et chacune a ses avantages et ses inconvénients. Il n'y a pas de meilleur moyen, mais la meilleure chose à faire est de choisir celui qui fonctionne bien avec votre application et de s'y tenir.

  • ORM - cela réduit la quantité de SQL que vous devez écrire et gère beaucoup de détails pour vous. Vous aurez besoin de faire du SQL personnalisé. Assurez-vous que vous disposez d'un ORM qui gère cela avec élégance.
  • Objets d'accès aux données - conservez le SQL dans les objets qui accèdent aux données. Cela encapsule votre base de données et fait en sorte que le reste de votre application n'ait pas besoin de connaître la structure de base de données sous-jacente, juste l'interface avec ces objets.
  • Procédures stockées - cela conserve tout votre SQL dans votre base de données et permet à vos DBA de savoir facilement ce qui se passe. Tout ce que vous avez à faire est que votre code appelle les procs stockés
Kenny Drobnack
la source
4

Il se trouve que nous utilisons le mappeur SQL iBatis, qui est plus proche du métal que les ORM comme Hibernate. Dans iBatis, vous mettez les instructions SQL dans des fichiers de ressources (XML), qui doivent se trouver dans le chemin de classe.

Votre liste d'approches semble assez complète si vous ajoutez l'option ORM de @ ocdecio. Je dirais que l'utilisation d'un ORM et l'utilisation d'un mappeur SQL et de fichiers de ressources sont les deux meilleures approches. Je m'éloignerais de SQLJ, qui n'a pas été largement adopté et vous lie trop étroitement à Java. Éloignez-vous également des procédures stockées, car elles vous lient à un fournisseur de base de données spécifique (les normes sont presque inexistantes pour les procédures stockées).

Jim Ferrans
la source
4

Comme la plupart d'entre nous, j'ai vu tout le gammut mais nous devons considérer SQL comme un langage de première classe. J'ai même vu SQL stocké dans la base de données qui est extrait puis exécuté de nouveau.

Les systèmes les plus performants que j'ai vus utilisent des procédures, des fonctions et des vues stockées.

Les processus stockés conservent le texte SQL dans la base de données et permettent un changement relativement immédiat par ceux qui DÉPLOYENT et PERSONNALISENT (ce qui nécessite beaucoup de conception appropriée pour le prendre en charge).

Toutes les projections doivent se faire via des vues et des sélections simples pour les mêmes raisons, toute la logique de projection doit être contenue dans la vue.

File d'attente Jé
la source
+1 pour mentionner les vues. Cela n'est pas encore reflété dans le résumé de la question
Lukas Eder
2

Je suggère d'utiliser des DAO avec une disposition d'usine. Ainsi, les exemples d'objets dont vous avez besoin seraient:

public class CoolBusinessObject
public class DAOFactory.java
public implementation CoolBusinessOjectDAO
public class CoolBusinessOjectDAOOracleImpl implements CoolBusinessOjectDAO

Ce style superpose l'interaction des données, vous ne devriez donc avoir à changer qu'une couche de code si vous changez de base de données ou passez aux technologies ORM.

Geai
la source
2

Il n'y a pas vraiment de différence substantielle entre ces trois:

  1. Codé en dur dans les objets métier
  2. Intégré dans les clauses SQLJ
  3. Encapsuler dans des classes séparées, par exemple les objets d'accès aux données

Je suppose que vous allez intégrer du code SQL sous forme de chaîne directement dans votre code Java. Alors que 1 et 3 utiliseront probablement JDBC directement (ou un outil comme Apache DbUtils ), 2 ajoute une technologie de préprocesseur à la pile, générant le code JDBC approprié avant la compilation.

Donc, essentiellement, si ces solutions impliquent l'intégration de SQL, vous pouvez également utiliser l'une de ces technologies:

  • API JPA Criteria , modélisant JPQL en tant que langage interne spécifique à un domaine en Java
  • jOOQ , modéliser SQL en tant que langage interne spécifique au domaine en Java

Il peut également y avoir d'autres outils pour vous aider à intégrer SQL dans Java d'une manière plus sécurisée que via SQLJ ou via une concaténation de chaînes réelle.

Lukas Eder
la source
1

D'après mon expérience, le codage en dur des instructions SQL dans les objets DAO est ce qui est largement utilisé, cependant, je pense que cela devrait être la méthode la moins préférée. La meilleure pratique devrait être de stocker les instructions SQL dans un fichier de propriétés. Et obtenez les instructions de l'objet DAO via une interface vers les fichiers de propriétés, par exemple java.util.Properties . Les instructions sql peuvent être entrecoupées de '?' Pour passer des paramètres, via une approche de déclaration préparée .

Une telle approche permet de découpler la logique SQL de la logique métier de l'application. Cela rend disponible un référentiel central de toutes les instructions SQL, ce qui facilite la modification, éliminant le besoin de rechercher des instructions de base de données dans la logique de l'application.

La machine
la source
Certaines personnes pourraient objecter que cela introduira le risque d'injection SQL. Quelle est votre opinion à ce sujet?
Adrian
2
Si vous stockez de toute façon le code SQL en dehors de l'application, quel est l'avantage de le stocker sous forme de chaînes quelque part plutôt que de le stocker dans la couche de base de données (en tant que procédures stockées)? Les procédures stockées peuvent faire une utilisation plus efficace de l'optimiseur de votre base de données, de sorte qu'elles surpassent presque toujours les instructions préparées.
Daniel Pryden
1
Salut Daniel, je ne voulais pas dire, vous n'écrivez pas les procs sql, je voulais juste dire, vous appelez les procs stockés, de la manière dont j'ai mentionné. Cela vous aide également à avoir un meilleur contrôle sur la transmission des paramètres au processus stocké.
The Machine
1

Les miens se retrouvent dans des ensembles de ressources. Je sais que ce n'est pas normal, mais c'est le plus facile pour moi et quiconque «autre que moi» à maintenir. C'est simple et logique.

Je suis en fait curieux de voir si quelqu'un utilise également mon approche.

Brett Ryan
la source
Curieux de savoir pourquoi ne gardez-vous pas le SQL dans la base de données?
Jé Queue
@Xepoch - Que voulez-vous dire? Les instructions sont dans des ensembles de ressources (fichiers de propriétés) qui se trouvent dans le même package que les entités, donc customer.properties se rapporte à Customer.class. Les données sont stockées dans la base de données.
Brett Ryan
1

En tant que rexem écrit, les instructions SQL sont du code - elles doivent être traitées comme du code, non externalisées (sauf si vous avez une bonne raison) mais placées avec du code qui traite les données SQL de / vers ces instructions. Les ORM / iBatis du framework d'aujourd'hui offrent de nombreuses simplifications pour le développement JDBC au jour le jour.

Vous trouverez quelques réponses à votre question dans cette question :) Le problème de stockage de vos instructions SQL dépend du roi de votre application. Quels sont vos besoins? Haute sécurité, facilité d'écriture de code ou de maintenance, multiplateforme ou verrouillage fournisseur? La prochaine question avez-vous besoin d'un framework SQL ou ORM pur sera bonne?

* Hardcoded in business objects
* Encapsulate in separate classes e.g. Data Access Objects

Solution la plus simple (P), difficile à maintenir (C)

* Embedded in SQLJ clauses

Meilleure vérification de la syntaxe (P), manque de requêtes dynamiques (C), performances inférieures à JDBC (C), pas si populaire (C)

* Metadata driven (decouple the object schema from the data schema - describe the mappings between them in metadata)

Ce doit être un cas particulier, vous devez faire cela (C) ou si vous voulez dire ORM (P);)

* External files (e.g. Properties or Resource files)

Facile à maintenir (P) mais plus difficile à vérifier pour les erreurs (C)

* Stored Procedures

Haute sécurité (P), code difficile à gérer un problème de verrouillage du fournisseur (C)

cetnar
la source