Java Database Framework (ORM Replacement) in 80 Lines of Code Cadre de base de données Java (ORM remplacement) dans 80 lignes de code
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.
Filed under Classé sous Database Base de données , Headline News Headline News , How To Comment , Java Software Logiciel de Java , RDBMS SGBDR , Tech Note Note technique , Web | |
| |
RSS 2.0 RSS 2,0 | |
Trackback this Article | cet article |
Email this Article Envoyer cet article
You may also like to read Vous mai également à lire |




August 21st, 2006 at 12:59 pm Août 21, 2006 at 12:59 pm
Maybe you need to look at commons-dbutils? Peut-être que vous devez regarder commons-dbutils?
August 21st, 2006 at 1:36 pm Août 21, 2006 at 1:36 pm
The problem with some of the methods of commons dbutils is that they don’t scale well with large datasets. Le problème avec certaines des méthodes de dbutils commun est qu'ils ne sont pas échelle et avec de grandes bases de données. For example take a look at this: Par exemple, jetez un coup d'oeil à ceci:
Object[] result = (Object[]) run.query( Object [] result = (Object []) run.query (
“SELECT * FROM raw WHERE query=?”, “java”, h); "SELECT * FROM brut query = OÙ?", "Java", h);
It will try to create few hundred thousand objects! Il essaie de créer quelques centaines de milliers d'objets!
In short I don’t need it to anything fancy like creating dummy objects for me. En bref je n'en ai pas besoin de rien de fantaisie comme la création de mannequin objets pour moi. I can read ResultSet, thank you very much. Je peux lire ResultSet, je vous remercie beaucoup.
I have looked at dbutils. J'ai cherché à dbutils. It is still too complicated for my needs. Il est encore trop compliqué pour mes besoins. In fact iBatis is simpler and better in comparison. En fait iBatis est plus simple et mieux en comparaison.
August 29th, 2006 at 3:42 pm Août 29th, 2006 at 3:42 pm
Im curious, how do you map the result set rows into objects and vice versa. Je suis curieux, comment peut-on la carte le jeu de résultats en objets lignes et vice versa. With just 80 lines of code this can’t be done. Avec seulement 80 lignes de code cela ne peut se faire. Or are you only using a HashMap for each row? Ou êtes-vous en utilisant seulement une HashMap pour chaque ligne? In that case you are miles away of the intention of the ORM tools. Dans ce cas, vous êtes kilomètres de l'intention de l'ORM outils. But you’re right for simple problems your approach is fully sufficient. Mais vous avez raison de problèmes simples de votre approche est pleinement suffisante.
September 5th, 2006 at 11:34 am 5 septembre 2006 à 11:34 am
Spring an ORM? Printemps un ORM? That’s not true, it’s an Inversion of Control container that can integrate with ORM tools. Ce n'est pas vrai, c'est une inversion de contrôle de conteneurs qui peuvent intégrer avec les outils ORM. Sounds like you want to take a look at Spring-JDBC functionality. Sonne comme vous voulez jeter un coup d'oeil au Printemps-JDBC fonctionnalité. it provides a JDBC wrapper that allows you to pass in SQL (parameterized if you’d like) and get back either a collection or Map. il prévoit une enveloppe de JDBC qui vous permet de passer en SQL (paramétrée si vous le souhaitez) et d'obtenir soit un retour de collecte ou de la carte. Spring manages the connection and the JDBC code. Printemps gère la connexion JDBC et le code. It’s miles from an ORM, but great for read-only or small applications that don’t need ORM functionality. Il s'agit d'un km de ORM, mais grand pour la lecture seule ou de petites applications qui n'ont pas besoin de fonctionnalités ORM.
September 13th, 2006 at 10:13 am Septembre 13, 2006 at 10:13 am
[...] PHP, Web, WordPress, WebLog, ORM, Web Services, Database, RDBMS, Headline News | | RSS 2.0 | Trackback this Article | Email thisArticle [...] [...] PHP, Web, WordPress, WebLog, ORM, les services Web, la base de données, RDBMS, des nouvelles de titre | | RSS 2,0 | Trackback cet article | email présent article [...]
February 6th, 2007 at 9:44 am Février 6th, 2007 at 9:44 am
This is a pretty humorous take on ORM frameworks: C'est un humour assez prendre sur ORMULAIRE cadres:
http://arsenalist.com/2007/02/02/please-stop-making-orm-frameworks/