I wrote about how I use a J'ai écrit sur la façon dont je utiliser un simple Java framework instead of ORM simple cadre de Java au lieu de ORMULAIRE like Hibernate or Spring for effectively solving my data handling requirements. comme Hibernate ou Spring pour résoudre efficacement mes données de manutention. It has made me tremendously productive. Il m'a rendu extrêmement productif. It sparked a major debate in Il a suscité un grand débat dans ServerSide . So I decided to provide more details about my ORM-replacement framework. J'ai donc décidé de fournir plus de détails au sujet de mon remplacement ORM-cadre. My needs are simple and are likely to match with any SQL happy Java developers. Mes besoins sont simples et sont susceptibles de correspondre avec toute SQL heureux développeurs Java.

To recapitulate my requirements are: Pour récapituler mes exigences sont les suivantes:

1. I needed a way to put all the SQL queries and DDL’s in a separate file. J'avais besoin d'un moyen de mettre toutes les requêtes SQL DDL et dans un fichier séparé. This allows me or a DBA to later analyze the query with a fine tooth comb and optimize if necessary. Cela me permet un DBA ou plus tard à analyser la requête d'une amende peigne et d'optimiser le cas échéant. It also allows me to easily change them without changing the code. Il me permet également de les modifier facilement sans modifier le code. Most of all cleanliness of the solution is appealing. La plupart de tous propreté de la solution est séduisante. At this point I am sure you are thinking of iBatis. À ce stade, je suis sûr que vous pensez de iBatis. I tried iBatis. J'ai essayé iBatis. Initially I liked it and thought I had my solution. Au début, je l'ai beaucoup aimée et de la pensée j'ai eu ma solution. However as I went down the lane I realized it too gave me features that I didn’t need. Toutefois, je suis allé à la voie je me suis rendu compte il m'a donné trop caractéristiques que je n'ai pas besoin. Even this was more complicated than I needed. Même cela a été plus compliqué que j'avais besoin. All I needed was a HashMap saved to a file in XML format. Tout ce que je faut, c'est une HashMap enregistrées dans un fichier au format XML. And my database class should support query execution by name (think key-value). Et ma base de données de classe devraient appuyer l'exécution de la requête par son nom (pensez clé-valeur).

2. Secondly I needed connection pooling to prevent opening and closing too many connections and also running out of connections. Deuxièmement, je le pool de connexion nécessaires pour empêcher l'ouverture et de fermeture trop grand nombre de connexions et également à court de connexions. I found a nice solution in Proxool. J'ai trouvé une solution élégante dans Proxool. Additionally it supports having multiple connection profiles in a simple text file and optionally logging queries. De plus, il supporte d'avoir plusieurs profils de connexion dans un simple fichier texte et, éventuellement, l'exploitation forestière requêtes.

3. I needed to integrate these two capabilities in a simple database class along with utility methods like cleanly closing connection and optionally logging the query data. J'avais besoin d'intégrer ces deux fonctions en une simple base de données de classe ainsi que des méthodes comme l'utilité proprement Fermeture de la connexion et, éventuellement, l'exploitation forestière à la requête de données.

- -- read details here lire les détails ici .

I solved it in 80 lines of code. J'ai résolu en 80 lignes de code. You may need to add few more methods to address your requirements. Vous mai besoin d'ajouter quelques autres méthodes pour répondre à vos exigences. I followed the YAGNI principle here, I will add the extra methods only when I need it and not before. J'ai suivi le principe YAGNI ici, je vais ajouter des méthodes supplémentaires que lorsque j'en ai besoin et pas avant.

This is the API: C'est l'API:

 public class com.taragana.util.Db {     // Returns a Connection from Connection Pool     public static java.sql.Connection getConnection() throws java.sql.SQLException;     // Returns a SQL Query String for a given name (queries are stored in a xml file as name-value pairs)     public static java.lang.String getQuery(java.lang.String);     // Executes a SQL query for a given name on a given Statement     public static java.sql.ResultSet executeQuery(java.lang.String, java.sql.Statement) throws java.sql.SQLException;     // Executes a SQL update (DDL, INSERT, UPDATE, DELETE) for a given name on a given Statement     public static int executeUpdate(java.lang.String, java.sql.Statement) throws java.sql.SQLException;     // Makes best effort to close a Connection     public static void close(java.sql.Connection); } public class com.taragana.util.Db (/ / Retourne une connexion à partir de pool de connexion public static java.sql.Connection getConnection () throws java.sql.SQLException / / Retourne une chaîne de requête SQL pour un nom donné (requêtes sont stockés dans un fichier xml comme paires nom-valeur) public static java.lang.String getQuery (java.lang.String) / / Exécute une requête SQL pour un nom sur une telle déclaration public static java.sql.ResultSet executeQuery (java . lang.String, java.sql.Statement) throws java.sql.SQLException / / Exécute une mise à jour SQL (DDL, INSERT, UPDATE, DELETE) pour un nom sur une telle déclaration public static int executeUpdate (java.lang. String, java.sql.Statement) throws java.sql.SQLException / / Rend possible pour fermer une connexion public static void close (java.sql.Connection);) 

This framework is obviously not for the weak-hearted. Ce cadre est évidemment pas pour les faibles de cœur. You have to be comfortable with SQL and JDBC. Vous devez être à l'aise avec SQL et JDBC. It simply takes away some pain associated with JDBC without encumbering you with the load of a heavy ORM framework. Il enlève tout simplement la douleur associée à JDBC sans vous encombrer avec la charge d'un lourd ORMULAIRE cadre. At the end of the day, if you fall in the above category, it will make you much more productive and without any learning curve. À la fin de la journée, si vous tombez dans la catégorie ci-dessus, il vous fera beaucoup plus productif et sans courbe d'apprentissage.

I heard some lame benefits of using ORM framework like database independence. J'ai entendu certains avantages de la lame en utilisant comme cadre ORMULAIRE base de données de l'indépendance.
Firstly if you know SQL well and stay away from using database specific features then your SQL code is pretty much database independent most of the time. Tout d'abord, si vous le savez bien SQL et évitez d'utiliser des fonctionnalités de base de données puis votre code SQL est à peu près indépendante base de données la plupart du temps. My advice is (that you should) follow SQL-92. Mon conseil est (que vous devez) suivre SQL-92. Even if you have to make changes while porting to a different database, they will be very minor in nature. Même si vous devez effectuer des changements alors que le portage sur une autre base de données, ils seront très mineur dans la nature. This observation is based on my experience of developing and maintaining two enterprise products simultaneously in MS SQL Server, Oracle and Sysbase. Cette observation est basée sur mon expérience de développement et le maintien de deux entreprises de produits simultanément dans MS SQL Server, Oracle et Sysbase.
Secondly how many times a developer on average changes database of his products midway? Deuxièmement combien de fois un développeur, en moyenne, modifications de données de ses produits à mi-chemin? If you are thinking of a high number then you need a good architect in your team. Si vous songez à un nombre élevé, il vous faut un bon architecte dans votre équipe. Your core problem is lack of architectural abilities. Votre problème principal est le manque de capacités d'architecture.

So what does a simple SQL INSERT call looks like? Mais qu'est-ce que un simple appel SQL INSERT ressemble?

 Connection conn = Db.getConnection(); Statement stmt = conn.createStatement(); Db.executeUpdate(args[0], stmt); Db.close(conn); Connection conn = Db.getConnection (); Déclaration stmt = conn.createStatement (); Db.executeUpdate (args [0], stmt); Db.close (conn); 

That’s it! That's it! No Class loading, no driver loading, no tricks. Pas de classe de chargement, aucun pilote de chargement, pas de "trucs". You have connection pooling (proxool), optional query logging, query by name, ability to connect to different databases by name using a simple configuration file. Vous avez le pool de connexion (proxool), facultatif requête exploitation forestière, de recherche par nom, la capacité de se connecter à différentes bases de données par nom en utilisant un simple fichier de configuration.

Note: First argument to executeUpdate is a String (passed by commandline in this example) which contains the name of the SQL query, not the query itself. Note: Premier argument pour executeUpdate est une chaîne de caractères (adoptée par de commande dans cet exemple) qui contient le nom de la requête SQL, pas la requête elle-même.

If you are interested in the source code / classes of this micro-framework let me know in comments or by emailing me - angsuman[at]taragana[dot]com. Si vous êtes intéressé dans le code source / classes de ce micro-cadre-le moi savoir dans les commentaires ou par courriel à moi - angsuman [at] taragana [dot] com.

Looking forward to your criticisms and comments. Dans l'attente de vos critiques et commentaires.