Hélas, je n'ai rien écrit depuis longtemps récemment. Pour des raisons de travail, je suis entré en contact avec le cadre ORM sous-jacent développé par l'entreprise. J'ai découvert accidentellement que lors de l'appel des opérations JDBC, le cadre fait référence à SimpleJDBCTemplate en hibernate. Ici, j'ai pensé à une simple encapsulation JDBC que j'ai utilisée quand j'étais à l'université. Maintenant, je publierai le code et le partagerai avec vous:
Classe de configuration: Lisez le fichier de configuration de la connexion de la base de données sous le même package, afin qu'il soit mieux pour les considérations de généralisation.
package com.tly.dbutil; import java.io.ioexception; import java.util.properties; public class config {private static properties prop = new Properties (); statique {try {// Chargez dbconfig.properties file de configuration prop.load (config.class.getResourceSstream ("dbconfig.properties")); } catch (ioException e) {// TODO Bloc de capture généré automatiquement e.printStackTrace (); }} // Définit la chaîne finale statique statique constante class_name = prop.getProperty ("class_name"); public static final String database_url = prop.getProperty ("database_url"); public static final String Server_ip = prop.getProperty ("server_ip"); public static final String Server_port = prop.getProperty ("server_port"); public static final String database_sid = prop.getProperty ("database_sid"); public static final string username = prop.getProperty ("nom d'utilisateur"); public static final String mot de passe = prop.getProperty ("mot de passe"); }dbconfig.properties: fichier de configuration de la base de données, vous pouvez également utiliser le format XML, etc., faites attention à l'emplacement de l'appel du fichier dans la classe de configuration
Class_name = com.mysql.jdbc.DriverDatabase_Url = jdbc: mysqlserver_ip = localhostServer_port = 3306Database_sid = EmployésUnSame = rootPassword = 1
Ensuite, la classe Auxiliary Class DbConn de connexion de la base de données
Package com.employees.dbutil; import java.sql.connection; import java.sql.drivermanager; import java.sql.preparedstatement; import java.sql.resulttset; import java.sql.sqlexception; classe publique conn = // trois properties et quatre méthodes // trois connexions d'interfaces CONCRIPÉS; Private préparé Pstmt = null; ResultSet privé rs = null; // quatre méthodes // Méthode1: Créez une connexion à la connexion publique de la base de données getConntion () {try {// 1: Chargez le pilote de connexion, Java Reflection Principle Class.Forname (config.class_name); // 2: Créez un objet d'interface de connexion pour obtenir l'objet de connexion de la base de données MySQL. Trois paramètres: Url Connection String Compte Motword String Url = config.database_url + ": //" + config.server_ip + ":" + config.server_port + "/" + config.database_sid; Conn = driverManager.getConnection (URL, config.userName, config.password); } catch (classNotFoundException e) {e.printStackTrace (); } catch (sqlexception e) {e.printStackTrace (); } return conn; } // Method2: Méthode pour fermer la base de données publique void closeConn () {if (rs! = null) {try {Rs.close (); } catch (sqlexception e) {e.printStackTrace (); }} if (pstmt! = null) {try {pstmt.close (); } catch (sqlexception e) {e.printStackTrace (); }} if (conn! = null) {try {conn.close (); } catch (sqlexception e) {e.printStackTrace (); }}} // Method3: Méthode spécifiquement utilisée pour envoyer des instructions Add, supprimer et modifier public int'execother (préparéStatement PSTMT) {try {// 1. Utilisez l'objet Instruction pour envoyer une instruction SQL int affecteRows = pstmt.ExECuteUpdate (); // 2. Renvoie le résultat renvoyé concerné; } catch (sqlexception e) {e.printStackTrace (); retour -1; }} // Method4: spécifiquement utilisé pour envoyer des instructions de requête publique ResultimeSet ExecQuey (préparé Pstmt) {try {// 1. Utilisez l'objet Instruction pour envoyer l'instruction SQL RS = PSTMT.ExecuteQuery (); // 2. Retour le résultat Retour Rs; } catch (sqlexception e) {e.printStackTrace (); retourner null; }}}Habituellement, l'utilisation du code ci-dessus peut résoudre des applications CRUD simples, mais il existe de nombreuses restrictions. Par exemple, chaque fois que le programme prend une connexion, il augmentera le fardeau du système, il n'y a pas de transactions, pas de survure, etc. Aujourd'hui, j'ai vu un ami dans le parc écrire un article dans le jardin en utilisant la réflexion pour résoudre Crud directement dans les paramètres de l'objet. J'ai déjà écrit ceci, mais je ne l'ai pas terminé. Je veux surtout écrire un dbutil général. Enfin, je l'ai étudié et j'ai découvert qu'il se rapproche du SimpleJDBCTemplate en hibernate, alors je suis allé voir le code source d'Hibernate. De plus, il y avait certaines choses pendant cette période, et je n'ai pas eu le temps, alors j'ai laissé cette question inactive. Maintenant, je compense cette chose et je le passe par moi-même.
Classe basée
Package com.employees.dao; import java.io.inputstream; import java.lang.reflect.method; import java.lang.reflect.parameteristetype; import java.sql.connection; import java.sql.date; import java.sql.prepatedstamation; import java.sql.Reursset; java.util.arraylist; import java.util.iterator; import java.util.list; import com.employees.dbutil.dbconn; classe publique basasedao <t> {dbConn conn = new dbConn (); connexion de connexion privée = null; @SuppressWarnings ("inutilisé") Classe privée <T> PersistantClass; @SuppressWarnings ("Unchecked") public-basesdao () {initConnection (); // Get Paramétrisé Type ParametezedType Type = (ParametezedType) getClass (). GetGenerricSuperclass (); persistantClass = (class <t>) type.getactualTypearguments () [0]; } / ** * Obtenez la connexion de la base de données * / public void initConnection () {connection = Conn.getConntion (); } / ** * Enregistrer * / public void Save (t Entity) lève une exception {// instruction sql, insérer dans le nom de la table (String sql = "insérer dans" + entity.getClass (). GetIMPleName (). TolowerCase () + "("; // Obtenez l'objet de toutes les méthodes avec String Get List <Methoding = This.matchPoJome iter = list.iterator (); SQL.SubString (0, Sql.LastIndexof (",")) + ") VALEURS ("; // Stand Up précompilé Insertion SQL dans le nom de la table (id, nom, e-mail) (? Nom (id, nom, e-mail) Valeurs (? ,?); // Obtenez la référence à l'instruction PréparetStatement de l'objet précompilé = Connection.Preparestatement (SQL); int i = 0; // Déplacez le pointeur vers la dernière ligne de l'itérateur vers la première ligne. iter = list.iterator (); while (iter.hasnext ()) {méthode méthode = iter.next (); // Cela détermine initialement le type de valeur de retour, car certains formats de valeur de champ doivent être modifiés lorsqu'ils sont stockés dans la base de données. Par exemple, String, l'instruction SQL est '"+ ABC +"' if (method.getReturnType (). GetIMPLename (). Indexof ("String")! = -1) {Statement.SetString (++ I, this.getString (méthode, entité)); } else if (method.getReturnType (). getIMPLename (). indexof ("date")! = -1) {instruction.setDate (++ i, this.getDate (méthode, entité)); } else if (method.getReturnType (). getImpLename (). indexof ("inputStream")! = -1) {instruction.setascIistream (++ i, this.getBlob (méthode, entité), 1440); } else {Statement.SetInt (++ i, this.getInt (méthode, entité)); }} // Exécuter Conn.execother (instruction); // CLOSECONN (); } / ** * Modify * / public void Update (t Entity) lève une exception {String sql = "update" + entity.getClass (). GetImPlename (). TolowerCase () + "set"; // Obtenez tous les collections d'objets de méthode Get Method de cette classe List <méthode> list = this.matchPoJomeThods (entité, "get"); // Objet de méthode temporaire, responsable de l'itération de l'objet de méthode de mode. Méthode tempmethod = null; // Parce que l'ID n'est pas nécessaire pour être modifié lors de la modification, l'ajout de paramètres dans l'ordre doit déplacer l'ID à la fin. Méthode idMethod = null; Iterator <méthode> iter = list.iterator (); while (iter.hasnext ()) {tempMethod = iter.next (); // Si le nom de la méthode contient une chaîne d'ID et que la longueur est 2, elle est considérée comme un ID. if (tempmethod.getName (). LastIndexof ("id")! = -1 && tempMethod.getName (). substring (3) .length () == 2) {// Enregistrez l'objet du champ ID dans une variable et le supprime dans la collection. idMethod = tempmethod; iter.remove (); // Si le nom de la méthode est supprimé et que la chaîne set / get est incompatible avec pojo + "id" (case insensible), il est considéré comme un id} else if ((entity.getClass (). GetIMPLename () + "id"). iter.remove (); }} // déplacez le pointeur itératif vers la première position iter = list.iterator (); while (iter.hasnext ()) {tempMethod = iter.next (); sql + = tempmethod.getName (). substring (3) .tolowercase () + "=?,"; } // Supprime le dernier, symbole sql = sql.substring (0, sql.lastIndexof (",")); // Ajouter la condition sql + = "où" + idMethod.getName (). Substring (3) .tolowercase () + "=?"; // L'épissage SQL est terminé, imprimer SQL Instruction System.out.println (SQL); Instruction PREPAYSATSATION = this.connection.preparestatement (SQL); int i = 0; iter = list.iterator (); while (iter.hasnext ()) {méthode méthode = iter.next (); // Ceci détermine initialement le type de valeur de retour, car certains formats de valeur de champ doivent être modifiés lorsqu'ils sont stockés dans la base de données, par exemple, String, SQL L'instruction est '"+ abc +"' if (méthode.getReturnType (). GetIMPLename (). Indexof ("string")! = -1) {State.SetString (++ i, this.getString (méthode, entity); } else if (method.getReturnType (). getImpLename (). indexof ("date")! = -1) {instruction.setstring (++ i, this.getString (méthode, entité)); } else if (method.getReturnType (). getIMPLename (). indexof ("date")! = -1) {instruction.setDate (++ i, this.getDate (méthode, entité)); } else if (method.getReturnType (). getImpLename (). indexof ("inputStream")! = -1) {instruction.setascIistream (++ i, this.getBlob (méthode, entité), 1440); } else {Statement.SetInt (++ i, this.getInt (méthode, entité)); }} // Ajouter de la valeur au champ ID if (idMethod.getReturnType (). GetImPlenName (). Indexof ("String")! = -1) {Statement.SetString (++ i, this.getString (idMethod, Entity))); } else {Statement.setInt (++ i, this.getInt (idMethod, entité)); } // Exécuter SQL Instruction Statement.ExECuteUpDate (); // Fermez l'instruction d'objet précompilé.close (); // Fermez la connexion.close (); } / ** * delete * / public void delete (t entité) lève une exception {String sql = "delete from" + entity.getClass (). GetImPlename (). Tolowercase () + "where"; // Stockage objet de champ avec String "id" méthode idMethod = null; // Objet d'objet de champ avec String "id" list <méthode> list = this.matchPoJomeThods (entité, "get"); Iterator <méthode> iter = list.iterator (); while (iter.hasnext ()) {méthode tempmethod = iter.next (); // Si le nom de la méthode contient la chaîne d'ID et que la longueur est 2, elle est considérée comme un ID. if (tempmethod.getName (). LastIndexof ("id")! = -1 && tempMethod.getName (). substring (3) .length () == 2) {// Enregistrez l'objet du champ ID dans une variable et le supprime dans l'ensemble. idMethod = tempmethod; iter.remove (); // Si le nom de la méthode est supprimé et que la chaîne set / get est incompatible avec pojo + "id" (cas insensible), il est considéré comme un id} else if ((entity.getClass (). GetIMPlename () + "id"). iter.remove (); }} sql + = idMethod.getName (). substring (3) .tolowercase () + "=?"; Instruction PREPAYSATSATION = this.connection.preparestatement (SQL); // Ajouter une valeur au champ ID int i = 0; if (idMethod.getReturnType (). getIMPLename (). indexof ("string")! = -1) {instruction.setstring (++ i, this.getString (idMethod, entité)); } else {Statement.setInt (++ i, this.getInt (idMethod, entité)); } // Exécuter Conn.execother (instruction); // CLOSECONN (); } / ** * Query by id * / public t findbyid (objet objet) lève une exception {String sql = "select * from" + persistantClass.getSimplename (). Tolowercase () + "where"; // Utilisez le constructeur de la sous-classe pour obtenir le type spécifique du type paramétré. Par exemple, Basedao <T>, c'est-à-dire obtenir le type spécifique de t entité = persistantClass.newinstance (); // Stockage L'objet de méthode qui stocke la clé principale de la méthode POJO (ou le tableau en cours) idMethod = null; List <méthode> list = this.matchPoJomeThods (entité, "set"); Iterator <méthode> iter = list.iterator (); // filtre pour obtenir l'objet méthode while (iter.hasnext ()) {méthode tempmethod = iter.next (); if (tempmethod.getName (). indexof ("id")! = -1 && tempMethod.getName (). substring (3) .length () == 2) {idMethod = tempMethod; } else if ((entity.getClass (). getIMPLename () + "id"). equalSignoreCase (tempMethod.getName (). substring (3))) {idMethod = tempMethod; }} // La première lettre est convertie en minuscules sql + = idMethod.getName (). Substring (3,4) .tolowercase () + idMethod.getName (). Substring (4) + "=?"; // Après l'instruction d'encapsulation, imprimez le SQL Statement System.out.println (SQL); // obtient l'instruction Connexion PréparedStatement = this.connection.preparestatement (SQL); // juge le type d'ID if (objet instance Of Integer) {instruction.setInt (1, (entier) objet); } else if (objet instanceof string) {instruction.setstring (1, (string) objet); } // Exécuter SQL pour obtenir l'ensemble de résultats de requête. ResultSet rs = Conn.execQuery (instruction); // Enregistrer, enregistrer les boucles au nombre de champs int i = 0; // pointer le pointeur vers la première ligne de l'Iterator iter = list.iterator (); // encapsule while (Rs.Next ()) {while (iter.hasnext ()) {méthode méthode = iter.next (); if (méthode.getParameterTypes () [0] .getSImPlenName (). Indexof ("String")! = -1) {// Parce que dans l'ensemble de liste, l'ordre de l'objet de méthode à récupérer est incompatible avec l'ordre de la base de données de la base de données. nom. this.SetString (méthode, entité, rs.getString (méthode.getName (). substring (3) .tolowerCase ())); } else if (method.getParAmEterTypes () [0] .getSimplename (). indexof ("date")! = -1) {this.setDate (méthode, entité, Rs.GetDate (méthode.getName (). substring (3) .tolowercase ())); } else if (method.getParameterTypes () [0] .getSimplename (). indexof ("inputStream")! = -1) {this.setblob (méthode, entité, rs.getBlob (méthode.getName (). substring (3) .tolowerCase ()). GetBinaryStream ()); } else {this.sentInt (méthode, entité, rs.getInt (méthode.getName (). substring (3) .tolowerCase ())); }}} // Fermez le jeu de résultats Rs.close (); // Fermez l'instruction d'objet précompilé.close (); entité de retour; } / ** * Filtrez tous les objets de la méthode avec des chaînes entrantes dans la classe POJO actuelle et renvoyez la collection de liste. * / Liste privée <méthode> MatchPoJomeThods (T Entity, String MethodName) {// Obtenez tous les objets de méthode POJO Méthode actuels [] Methods = Entity.getClass (). GetDeclaredMethods (); // List Container stocke tous les objets de la méthode avec Get String list <méthode> list = new ArrayList <Thethod> (); // Filtrez tous les objets de la méthode avec Get Strings dans la classe POJO actuelle et les stocker dans le conteneur de liste pour (int index = 0; index <méthodes.length; index ++) {if (méthodes [index] .getName (). Indexof (méthodyname)! = -1) {list.add (méthodes [index]); }} Retour List; } / ** * La méthode renvoie la valeur de l'instruction SQL lorsque le type est int ou entier. Correspondant à Get * / public Integer getInt (méthode méthode, t entité) lève l'exception {return (entier) méthode.invoke (entité, nouvel objet [] {}); } / ** * La méthode renvoie la valeur d'assemblage de l'instruction SQL lorsque le type est une chaîne. Par exemple, «ABC», correspondant à Get * / public String getString (méthode Method, Tetity) lance l'exception {return (string) metheth.invoke (entité, nouvel objet [] {}); } / ** * La méthode renvoie la valeur assemblée de l'instruction SQL lorsque le type de blob. Correspondant à Get * / public inputStream getBlob (méthode méthode, t entity) lève l'exception {return (inputStream) method.invoke (entité, nouvel objet [] {}); } / ** * La méthode renvoie la valeur assemblée de l'instruction SQL lorsque le type de date, correspondant à Get * / public date getDate (méthode méthode, t entity) lève l'exception {return (date) method.invoke (entité, nouvel objet [] {}); } / ** * Lorsque le type de paramètre est entier ou int, paramètres de définition pour le champ d'entité, correspondant à Set * / public Integer setInt (méthode méthode, t entité, entier arg) lance l'exception {return (entier) méthode.invoke (entité, nouvel objet [] {arg}); } / ** * Lorsque le type de paramètre est une chaîne, définissez des paramètres pour le champ d'entité, correspondant à set * / public string setString (méthode méthode, t entity, string arg) lève exception {return (string) metheth.invoke (entité, nouveau objet [] {arg}); } / ** * Lorsque le type de paramètre est InputStream, paramètres de définition pour le champ d'entité, correspondant à Set * / public inputStream setBlob (méthode Method, Tetity, inputStream arg) lève l'exception {return (inputStream) method.invoke (entité, nouvel objet [] {arg}); } / ** * Lorsque le type de paramètre est date, paramètres définis pour le champ d'entité, correspondant à Set * / public Date SetDate (méthode Method Method, T Entity, Date Arg) lève l'exception {return (date) method.invoke (entité, nouvel objet [] {arg}); }}Employésdao hérite de base et peut utiliser directement la méthode de la classe parent, ajoutant du code de réutilisation
Package com.employees.dao; Importer java.util.arraylist; import java.util.list; import com.employees.po.employees; public class employésdao étend les employés basés basés sur les employés (employés finaux) lance l'exception {SAVE (employés); Retour Vrai; } // Ajouter des informations sur les employés à la table publique Liste <lack employés> AddEmployees (int id) lève une exception {list <employés> lstemployees = new ArrayList <employés> (); Employés employés = findbyid (id); // Chargez les données actuellement ci-jointes dans l'objet lstemployees.add (employés); retourner les employés lystoques; } public void DeleteEMP (final Employey Entity) lève une exception {this.delete (entité); } public void updateEMP (final Employey Entity) lève une exception {this.update (entité); }}Je ne publierai pas le code de la couche PO, utilise maintenant JUnit4 pour faire un test
package com.employees.dao; import org.junit.test; import com.employees.po.employees; public class ey ey eylemysDaOtest {@test public void testAdd () lève une exception {employés emp = new employey (); emp.setpname ("tly"); Emp.setpsex ("mâle"); Emp.setPBeliefs ("xxxxx"); Emp.setPaddr ("Tianhe"); emp.setphobby ("jouer au basket"); Emp.setPSubject ("Computer"); Emp.setptel ("123456"); Employésdao dao = new EmployeyDao (); dao.addemployes (EMP); } @Test public void TestupDate () lève une exception {employésdao dao = new EmployeyDao (); Employés EMP = dao.findByid (14); Emp.setptel ("999999"); dao.updateEmp (EMP); } @Test public void testdelete () lève une exception {employésdao dao = new EmployeyDao (); Employés EMP = dao.findByid (15); dao.deleteEmp (EMP); }}Après les tests, ces trois méthodes peuvent fonctionner normalement, le temps se précipite. Certains codes sont utilisés par d'autres copains. Certains endroits peuvent ne pas être considérés comme très complets ou certains codes seront redondants. L'opération générale de CRUD dans Basedao n'a pas été rédigée. Si un ami est intéressé, vous pouvez l'écrire à nouveau, comme la requête, le fonctionnement par lots, etc. Si le test passe, n'oubliez pas de m'envoyer une copie, haha
L'emballage auxiliaire JDBC simple et général ci-dessus (exemple) est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.