Question

Pour implémenter le code d’accès aux données dans notre application, nous avons besoin d’un framework pour envelopper jdbc (ORM n’est pas notre choix, à cause de l’évolutivité).

Le framework le plus cool sur lequel j’ai travaillé auparavant est Spring-Jdbc . Toutefois, la politique de mon entreprise est d’éviter les dépendances externes, notamment Spring, J2EE, etc. Nous pensons donc à l’écriture de notre propre framework jdbc personnalisé, avec des fonctionnalités similaires à Spring-jdbc: mappage des lignes, traitement des erreurs, prise en charge des fonctionnalités de java5, mais sans prise en charge des transactions.

Quelqu'un at-il de l'expérience dans la rédaction d'un tel framework wrapper JDBC Si quelqu'un a déjà utilisé d'autres frameworks wrapper jdbc, veuillez partager votre expérience.

Merci d'avance.

Était-ce utile?

La solution

Nous avons écrit notre propre wrapper. Ce sujet est digne d'un article mais je doute que j'aie jamais le temps de l'écrire. Voici donc quelques points clés:

  • nous avons adopté SQL sans essayer de le cacher. le seul ajustement était d'ajouter un support pour les paramètres nommés. Les paramètres sont importants car nous n'encourageons pas l'utilisation de sql à la volée (pour des raisons de sécurité) et nous utilisons toujours PreparedStatements.

  • pour la gestion des connexions, nous avons utilisé Apache DBCP. C’était pratique à l’époque, mais on ignore combien cela est nécessaire avec les implémentations JDBC modernes (la documentation sur ce sujet manque). DBCP regroupe également les PreparedStatements.

  • nous n'avons pas pris la peine de mapper les lignes. à la place (pour les requêtes), nous avons utilisé quelque chose de similaire au ResultSetHandler d’Apache dbutil, qui vous permet de " alimenter " le résultat est défini dans une méthode qui peut ensuite transférer les informations là où vous le souhaitez. Ceci est plus flexible et en fait, il ne serait pas difficile d'implémenter un ResultSetHandler pour le mappage de lignes. pour les insertions / mises à jour, nous avons créé une classe d'enregistrement générique (essentiellement une table de hachage avec quelques cloches et sifflets supplémentaires). Le plus gros problème avec le mappage de lignes (pour nous) est que vous êtes bloqué dès que vous faites un "intéressant". requête parce que vous pouvez avoir des champs qui correspondent à différentes classes; parce que vous pouvez avoir une structure de classe hiérarchique mais un ensemble de résultats plat; ou parce que le mappage est complexe et dépendant des données.

  • nous avons intégré la journalisation des erreurs. pour la gestion des exceptions: sur une requête, nous interceptons et journalisons, mais pour une mise à jour, nous interceptons, journalisons et réexaminons une exception non contrôlée.

  • nous avons fourni un support de transaction en utilisant une approche wrapper. l'appelant fournit le code qui effectue la transaction, et nous nous assurons que la transaction est gérée correctement, sans risque d'oubli pour terminer la transaction et avec la restauration et la gestion des erreurs intégrées.

  • plus tard, nous avons ajouté un schéma de relation très simpliste qui permet d'appliquer une seule mise à jour / insertion à un enregistrement et à toutes ses dépendances. pour que les choses restent simples, nous n'avons pas utilisé cela dans les requêtes, et nous avons spécifiquement décidé de ne pas prendre en charge cela avec les suppressions, car il est plus fiable d'utiliser des suppressions en cascade.

Ce wrapper a été utilisé avec succès dans deux projets à ce jour. Bien sûr, il est léger, mais de nos jours tout le monde dit que son code est léger. Plus important encore, cela augmente la productivité des programmeurs, diminue le nombre de bogues (et facilite le suivi des problèmes), et est relativement facile à suivre si besoin est, car nous ne croyons pas à ajouter beaucoup de couches uniquement pour fournir une belle architecture.

Autres conseils

Spring-JDBC est fantastique. Considérez que pour un projet open source comme Spring, les inconvénients de la dépendance externe sont minimisés. Vous pouvez adopter la version la plus stable de Spring qui réponde à vos exigences en matière d'abstraction JDBC et vous savez que vous pourrez toujours modifier vous-même le code source si vous rencontrez un problème - sans dépendre d'un tiers. Vous pouvez également examiner l'implémentation pour tout problème de sécurité que votre organisation pourrait avoir avec du code écrit par une partie externe.

Celui que je préfère: Dalesbred . Il est sous licence MIT.

Un exemple simple d'obtention de toutes les lignes d'une classe personnalisée (département).

List<Department> departments = db.findAll(Department.class,
    "select id, name from department");

lorsque la classe personnalisée est définie comme:

public final class Department {
    private final int id;
    private final String name;

    public Department(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

Clause de non-responsabilité: elle concerne une entreprise pour laquelle je travaille.

Cela ressemble à une décision à très courte vue. Considérez le coût de développement / maintenance d'un tel framework, en particulier lorsque vous pouvez l'obtenir, et de son code source gratuitement. Non seulement vous n’avez pas à faire le développement vous-même, vous pouvez le modifier à volonté si besoin est.

Cela étant dit, vous devez vraiment dupliquer la notion de JdbcTemplate et ses rappels (PreparedStatementCreator, PreparedStatementCallback), ainsi que RowMapper / RowCallbackHandler. Il ne devrait pas être trop compliqué d'écrire quelque chose comme ça (surtout si vous n'avez pas à faire de gestion de transaction).

Cependant, comme je l'ai dit, pourquoi l'écrire quand vous pouvez l'obtenir gratuitement et modifier le code source à votre guise?

Essayez JdbcSession from jcabi-jdbc . C'est aussi simple que devrait l'être JDBC, par exemple:

String name = new JdbcSession(source)
  .sql("SELECT name FROM foo WHERE id = ?")
  .set(123)
  .select(new SingleOutcome<String>(String.class));

C'est tout.

mJDBC: https://mjdbc.github.io/

Je l'utilise depuis des années et je l'ai trouvé très utile.

Inspiré de la bibliothèque JDBI, il n’a pas de dépendances, ajoute le support des transactions, fournit des compteurs de performance et permet de passer facilement au niveau SQL le plus bas possible (ancienne API JDBC simple) au cas où vous en auriez vraiment besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top