Leider habe ich vor kurzem nichts mehr geschrieben. Aus den Arbeitsgründen kam ich mit dem von der Firma entwickelten zugrunde liegenden Orm -Framework in Kontakt. Ich stellte versehentlich fest, dass beim Aufrufen von JDBC -Operationen das Framework auf SimpleJdbctemplate in Hibernate bezieht. Hier dachte ich an eine einfache JDBC -Kapselung, die ich als ich im College verwendet habe. Jetzt werde ich den Code veröffentlichen und mit Ihnen teilen:
Konfigurationsklasse: Lesen Sie die Datenbankverbindungskonfigurationsdatei unter demselben Paket, damit sie für die Überlegungen zur Generalisierung besser ist.
paket com.tly.dbutil; import java.io.ioxception; import java.util.properties; public class config {private statische Eigenschaften prop = neue Eigenschaften (); static {try {// laden dbconfig.properties configuration datei prop.load (config.class.getResourceasStream ("dbconfig.properties"); } catch (ioException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); }} // Konstante öffentliche statische endgültige String 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 ("Benutzername"); public static final String password = prop.getProperty ("Passwort"); }dbconfig.properties: Datenbankkonfigurationsdatei, Sie können auch das XML -Format usw. verwenden, achten Sie auf den Anrufspeicherort der Datei in der Konfigurationsklasse
Class_name = com.mysql.jdbc.driverdatabase_url = jdbc: mysqlserver_ip = localHostserver_port = 3306Database_sid = personalUnername = rootPassword = 1
Als nächstes kommt die Datenbankverbindung Hilfsklasse DBConn
Paket com.EMPLIONEES private prepectStatement pstmt = null; privates Ergebnis rs = null; // vier Methoden // Methode1: Erstellen Sie eine Verbindung zur Datenbank öffentliche Verbindung getConntion () {try {// 1: Laden Sie den Verbindungsfahrer, Java Reflexion Prinzip Class.forname (config.class_name); // 2: Erstellen Sie ein Verbindungsschnittstellenobjekt, um das Verbindungsobjekt der MySQL -Datenbank zu erhalten. Drei Parameter: URL -Verbindungsstring -Kontokennwort Kennwort Zeichenfolge URL = config.database_url+": //"+config.server_ip+":"+config.server_port+"/"+config.database_sid; conn = driverManager.getConnection (URL, config.Unername, config.password); } catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } return conn; } // method2: Methode zum Schließen der Datenbank public 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: Methode, mit der speziell zum Senden, Löschen und Ändern von Anweisungen public int execother (prepedStatement pstmt) {try {// 1 verwendet wird. Verwenden Sie das Anweisungsobjekt, um die SQL -Anweisung int betroffen zu senden. // 2. Rückgabe das Ergebnis der betroffenen Ergebnisse; } catch (sqlexception e) {e.printstacktrace (); Return -1; }} // method4: speziell zum Senden von Abfrageanweisungen public resultSet ExecQuery (prepedStatement pstmt) {try {// 1. Verwenden Sie das Anweisungsobjekt, um die SQL -Anweisung rs = pstmt.executeQuery () zu senden. // 2. Rückgabe die Ergebnisrendite Rs; } catch (sqlexception e) {e.printstacktrace (); null zurückkehren; }}}Normalerweise kann die Verwendung des oben genannten Code einige einfache CRUD -Anwendungen lösen, es gibt jedoch viele Einschränkungen. Beispielsweise wird jedes Mal, wenn das Programm eine Verbindung herstellt, die Belastung des Systems erhöht, es gibt keine Transaktionen, keine Datenquelle usw. Ich habe heute einen Freund im Park gesehen, der einen Artikel im Garten mit Reflexion geschrieben hat, um CRUD direkt in Objektparametern zu lösen. Ich habe das schon einmal geschrieben, aber ich habe es noch nicht beendet. Ich möchte hauptsächlich eine allgemeine DBUTIL schreiben. Schließlich studierte ich es und stellte fest, dass es näher an die SimpleJdbctemplate in Hibernate kommt, also habe ich den Quellcode von Hibernate gesehen. Außerdem gab es in dieser Zeit einige Dinge, und ich hatte keine Zeit, also habe ich diese Angelegenheit untätig gelassen. Jetzt mache ich dieses Ding wieder her und überprüfe es für mich.
Basierendao -Klasse
Paket com.EMPLE.DAO; Import Java.io.inputStream; Import Java.lang.reflect.Method; Import Java.lang.Reflect.ParameterizedType; Import Java.SQL.Connection; Import Java.sql.date; Java.util.ArrayList; Import Java.util.iterator; Import Java.util.List; Import com.EMPLE.DBUTIL.DBConn; Private Connection Connection = NULL; @SuppressWarnings ("unbenutzt") Private Class <t> PersistentClass; @SuppressWarnings ("Deaktiviert") public basedao () {initConnection (); // Parametrisierte Typ parameterizedtype type = (parameterizedType) getClass (). GetGenericsuperClass (); persistentClass = (class <T>) Typ.GetActualtTypeRGumente () [0]; } / *** Datenbankverbindung abrufen* / public void initConnection () {Connection = conn.getConntion (); } /** * speichern * /public void save (t Entity) löst Ausnahme aus {// sql Anweisung, in den Tabellennamen einfügen (String sql = "in" + entity.getClass (). GetSimplename (). TolowerCase () + "; = list.iterator (); sql.substring (0, sql.lastIndexof (",") +") Werte ("; // SQL -Anweisung in den Tabellennamen (ID, Name, E -Mail) -Werte (?,?,?,? Name (ID, Name, E -Mail) Werte (?,?); // den Verweis auf das vorkompilierte Objekt vorbereitete Erregungstatement = Connection.Preparestatement (SQL); int i = 0; // Bewegen Sie den Zeiger in die letzte Zeile des Iterators in die erste Zeile. iter = list.Iterator (); while (iter.hasnext ()) {method method = iter.next (); // Dies bestimmt zunächst die Art des Rückgabewerts, da einige Feldwertformate geändert werden müssen, wenn sie in der Datenbank gespeichert werden. Zum Beispiel ist String, SQL -Anweisung '"+ABC+"' if (method.getReturnTyPe (). GetImpleName (). Indexof ("String")! } else if (method.getReturnType (). getImpleName (). indexof ("Datum")! } else if (methode.getReturnType (). getImpleName (). indexof ("inputStream")! } else {Anweisung.setint (++ i, this.getInt (Methode, Entität)); }} // Conn.execother (Anweisung) ausführen; // Closeconn (); } / ** * modifizieren * / public void update (t Entity) löst eine Ausnahme aus {String sql = "updity" + entity.getClass (). GetImleName (). TolowerCase () + "set"; // alle Sammlungen des GET -Methodenobjekts dieser Klassenliste <Methode> list = this.matchPojomethods (Entity, "get"); // Temporäres Methodenobjekt, verantwortlich für die Iterierung des Modemethodenobjekts. Methode tempMethod = null; // Da die ID bei der Änderung nicht geändert werden muss, sollte das Hinzufügen von Parametern in der Reihenfolge die ID auf das Ende verschieben. Methode IDMethod = NULL; Iterator <Methode> iter = list.iterator (); while (iter.hasnext ()) {tempMethod = iter.next (); // Wenn der Methodenname eine ID -Zeichenfolge enthält und die Länge 2 ist, wird er als ID betrachtet. if (tempMethod.getName (). lastIndexof ("id")! IdMethod = tempMethod; iter.remove (); // Wenn der Methodenname entfernt wird und die Set/GET -String mit Pojo + "ID" (Fall unempfindlich) nicht kompatibel ist, wird er als ID angesehen. iter.remove (); }} // Verschieben Sie den iterativen Zeiger auf die erste Position iter = list.iterator (); while (iter.hasnext ()) {tempMethod = iter.next (); sql + = tempMethod.getName (). substring (3) .tolowerCase () + "=?,"; } // Entfernen Sie den letzten, Symbol SQL = SQL.Substring (0, Sql.LastIndexof (",")); // Bedingung sql + = "where" + idMethod.getName (). Substring (3) .TolowerCase () + "=?"; // SQL -Spleißen ist abgeschlossen, drucken sql Anweisung System.out.println (SQL); PreparedStatement Statement = this.connection.Preparestatement (SQL); int i = 0; iter = list.Iterator (); while (iter.hasnext ()) {method method = iter.next (); // Dies bestimmt zunächst den Typ des Rückkehrwerts, da einige Feldwertformate geändert werden müssen, wenn sie in der Datenbank gespeichert werden, z. } else if (method.getReturnType (). getImpleName (). indexof ("Datum")! } else if (method.getReturnType (). getImpleName (). indexof ("Datum")! } else if (methode.getReturnType (). getImpleName (). indexof ("inputStream")! } else {Anweisung.setint (++ i, this.getInt (Methode, Entität)); }} // Wert zum ID -Feld id if (idMethod.getReturnType (). GetImpleName (). Indexof ("String")! } else {Anweisung. } // SQL Anweisung anerweisung ausführen.executeUpDate (); // die vorkompilierte Objektanweisung schließen.CLOSE (); // die Verbindung schließen.CLOSE (); } / ** * löschen * / public void delete (t Entity) löst eine Ausnahme aus {String sql = "aus" + entity.getClass (). GetImpleName (). TolowerCase () + "wo"; // Feldobjekt mit String "id" -Methode speichern idMethod = null; // Feldobjekt mit String "ID" -Liste <Methode> list = this.matchpojomethods (Entity, "get") abrufen; Iterator <Methode> iter = list.iterator (); while (iter.hasnext ()) {method tempMethod = iter.next (); // Wenn der Methodenname die ID -Zeichenfolge enthält und die Länge 2 ist, wird er als ID betrachtet. if (tempMethod.getName (). lastIndexof ("id")! IdMethod = tempMethod; iter.remove (); // Wenn der Methodenname entfernt wird und die Set/GET -String mit Pojo + "ID" (Fall unempfindlich) nicht kompatibel ist, wird er als ID angesehen. iter.remove (); }} sql + = idMethod.getName (). substring (3) .tolowerCase () + "=?"; PreparedStatement Statement = this.connection.Preparestatement (SQL); // Mehrwert zum ID -Feld int i = 0 verleihen; if (idMethod.getReturnType (). GetImleName (). IndexOf ("String")! } else {Anweisung. } // Conn.execother (Anweisung) ausführen; // Closeconn (); } / *** Abfrage nach id* / public t findById (Object Object) löst eine Ausnahme aus {String sql = "select* aus" + persistentClass.getSimpleName (). TolowerCase () + "wo"; // Verwenden Sie den Konstruktor der Unterklasse, um den spezifischen Typ des parametrisierten Typs zu erhalten. Zum Beispiel basiert der basiertes <t>, dh die spezifische Art von t entity = persistentClass.Newinstance (); // Speichern Sie das Method -Objekt, das den Primärschlüssel der Methode des Pojo (oder der zu bedienenden Tabelle) speichert idMethod = null; List <Methode> list = this.matchPojomethods (Entity, "set"); Iterator <Methode> iter = list.iterator (); // Filter, um das Methodenobjekt zu erhalten (iter.hasnext ()) {Methode tempMethod = iter.next (); if (tempMethod.getName (). indexof ("id")! } else if ((entity.getClass (). getImplename () + "id"). EqualSignoreCase (tempMethod.getName (). Substring (3))) {idMethod = tempMethod; }} // Der erste Buchstabe wird in Kleinbuchstaben SQL += IdMethod.getName (). Substring (3,4) .TolowerCase () +idMethod.getName (). Substring (4) +"=?" // Drucken Sie nach der Kapselungsanweisung das SQL -Anweisung System.out.println (SQL) aus; // Die Anweisung für Verbindung errege erstellt. // beurteilen Sie die Art der ID if (Objektinstanz von Integer) {Anweisung.Setint (1, (Integer) Objekt); } else if (ObjectinstanceOf String) {Anweisung.SetString (1, (String) -Objekt); } // SQL ausführen, um das Abfrageergebnissatz zu erhalten. ResultSet rs = conn.execQuery (Anweisung); // Registrieren Sie Schleifen zur Anzahl der Felder int i = 0; // den Zeiger auf die erste Zeile des Iterators iter = list.iterator () verweisen; // capsulate while (rs.Next ()) {while (iter.hasnext ()) {method method = iter.next (); if (method.getParameterTypes () [0] .GetSImplenName (). IndexOf ("String")! this.setString (Methode, Entity, rsGetString (method.getName (). Substring (3) .TolowerCase ())); } else if (method.getParameterTypes () [0] .GetSimpename (). IndexOf ("Datum")! } else if (method.getParameterTypes () [0] .GetSimpename (). IndexOf ("inputStream")! } else {this.setint (Methode, Entity, rs.getInt (method.getName (). substring (3) .ToLowerCase ()); }}} // Schließen Sie das Ergebnissatz rs.close (); // die vorkompilierte Objektanweisung schließen.CLOSE (); Rückkehr; } /*** Filtern Sie alle Methodenobjekte mit eingehenden Zeichenfolgen in der aktuellen Pojo -Klasse und geben Sie die Listensammlung zurück. */private Liste <Methode> matchpojomethods (t Entity, String methodName) {// Alle aktuellen Pojo -Methoden -Objekte -Methoden erhalten [] methods = entity.getClass (). getDeclaredMethods (); // List Container speichert alle Methodenobjekte mit der Get -String -Liste <Methode> list = new ArrayList <Methode> (); // FILLEN SIE ALLE Methodenobjekte mit GET -Zeichenfolgen in der aktuellen Pojo -Klasse und speichern Sie sie im Listencontainer für (int index = 0; index <methods.length; index ++) {if (Methoden [index] .getName (). Indexof (methodName)! }} Rückgabeliste; } /*** Die Methode gibt den SQL -Anweisungswert zurück, wenn der Typ int oder integer ist. Entsprechend dem Get */ public Integer getInt (Methode Methode, t Entity) löst Ausnahme aus {return (Integer) methode.invoke (Entity, New Object [] {}); } /*** Die Methode gibt den SQL -Anweisung Assembly -Wert zurück, wenn der Typ String ist. Zum Beispiel 'ABC', entsprechend der GET */ public String getString (Methode Methode, t Entity) löst die Ausnahme aus {return (string) methode.invoke (Entity, neues Objekt [] {}); } /*** Die Methode gibt den gesetzlichen Wert der SQL -Anweisung zurück, wenn der Typ des Blobs. Entsprechend dem GET */ public InputStream getblob (Methode Methode, t Entity) löst Ausnahme aus {return (inputStream) methode.invoke (Entity, New Object [] {}); } / ** * Die Methode gibt den gesetzlichen Wert der SQL -Anweisung zusammen, wenn der Datumstyp, der dem Get * / public date getDate (Methode Methode, t Entity) entspricht, die Ausnahme ausgelöst {return (Datum) method.invoke (Entity, neues Objekt [] {}); } / ** * Wenn der Parametertyp ganzzahlig oder int ist, setzen Sie Parameter für das Entitätsfeld, das dem Set * / public Integer setInt (Methode Methode, t enttity, Integer arg) entspricht, Ausnahme {return (Integer) methode.invoke (Entity, New Object [] {arg}); } / ** * Wenn der Parametertyp String ist, setzen Sie die Parameter für das Feld Entity, entsprechend der Set * / public String setString (Methode Methode, t Entity, String Arg) Ausnahme {return (string) methode.invoke (Entity, New Object [] {arg}); } / ** * Wenn der Parametertyp inputStream ist, setzen Sie die Parameter für das Entitätsfeld fest, der dem Set * / public InputStream setBlob (Methode Methode, t Entity, InputStream Arg) Ausnahme {return (inputStream) -Methode.invoke (Entity, New Object [] {arg}) ausgelöst wird. } / ** * Wenn der Parametertyp Datum ist, setzen Sie die Parameter für das Feld Entity, das dem Set * / public date setDate (Methode Methode, t Entity, Datum Arg) entspricht, die Ausnahme aus {return (Datum) methode.invoke (Entity, New Object [] {arg}); }}Powersdao erbtbasiert und kann die übergeordnete Klassenmethode direkt verwenden, wobei die Wiederverwendung von Code hinzugefügt wird
Paket com.EMPLIONEES.DAO; Import Java.util.ArrayList; Import Java.util.List; Import com.EMPLE.PO.EMPLET; zurückkehren; } // Mitarbeiterinformationen in der Tabelle publiclist <hippe <Employees> Hinzufügen von Mitarbeitern (int id) löst eine Ausnahme aus. Mitarbeiter Mitarbeiter = FindById (ID); // Die aktuell beigefügten Daten in das Objekt lstaPledes.ADD (Mitarbeiter) laden; Renditen zurücksätigten; } public void deleteEmp (endgültige Mitarbeiter Entity) löst eine Ausnahme aus {this.delete (Entity); } public void updateemp (endgültige Mitarbeiter entität) löst Ausnahme aus {this.update (Entity); }}Ich werde den Code der PO -Ebene nicht veröffentlichen, verwenden Sie jetzt JUNIT4, um einen Test durchzuführen
Paket com.EMPLIONEES.DAO; Import org.junit.test; Import com.EMPLE.PO.EMPLET; emp.setpname ("tly"); emp.setpsex ("männlich"); emp.setPBeliefs ("xxxxx"); Emp.SetPaddr ("Tianhe"); Emp.SetPhobby ("Basketball spielen"); Emp.Setpsubject ("Computer"); Emp.Setptel ("123456"); Employedao Dao = New EmployeesDao (); Dao.AddaPeres (EMP); } @Test public void testupdate () löst Ausnahme aus {Employedao dao = new EmployeesDao (); Mitarbeiter Emp = Dao.FindbyId (14); Emp.Setptel ("999999"); Dao.UpdateEMP (EMP); } @Test public void testDelete () löst Ausnahme aus {Employedao dao = new EmployeesDao (); Mitarbeiter Emp = Dao.FindbyId (15); Dao.DeleteEmp (EMP); }}Nach dem Testen können diese drei Methoden normal laufen, die Zeit ragt sich. Einige Codes werden von anderen Freunden verwendet. Einige Orte werden möglicherweise nicht als sehr umfassend angesehen, oder einige Codes werden überflüssig. Die allgemeine CRUD -Operation in basierten Asa wurde nicht vollständig geschrieben. Wenn ein Freund interessiert ist, können Sie es erneut schreiben, z. B. Abfrage, Stapeloperation usw. Wenn der Test besteht, denken Sie daran, mir eine Kopie zu senden, haha
Die obige einfache und allgemeine JDBC -Auxiliary -Verpackung (Beispiel) ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.