Die Informationen der Schüler in diesem Beispiel fügen der Datenbank Transaktionen hinzu (die Transaktion kann eingereicht werden, Transaktionen können zurückgeworfen und mit lokalen Threads verbessert werden).
Hauptseitenindex.jsp
<%@ page Language = "java" import = "java.util. value = "/query"/>? Name: <Eingabe type = "text" name = "name"/> <br> <br> <fieldset style = "Border: Solid; Border-Color: rot; Breite: 250px;"> <Legend> Buch1 </legend> Titel: <Eingabe type = "text" name = "buch"/> <br> <br> preis: <Eingabe type type = "text style="border: solid;border-color:green;width: 250px;"> <legend>Book 2</legend> Title:<input type="text" name="book"/><br><br> Price:<input type="text" name="price"/> </fieldset> <br><br> <input type="submit" value="submit"/><br><br> </form> </body> </html>
Toolkit
Tool zum Erhalten von Datenbankverbindung Connutils5.java
Paket cn.hncu.utils; import Java.lang.reflect.invocationHandler; Import Java.lang.reflect.Method; Import Java.lang.reflect.proxy; Import Java.Sql.Connection; java.util.properties; öffentliche Klasse Connutils5 {// Lokales Thread -Verwaltungsobjekt, verwendet, um zu implementieren: Die durch denselbe Thread erhaltene Verbindung ist derselbe private statische ThreadLocal <Connection> t = Neues ThreadLocal <Nobine> (); private endgültige statische Liste <verbindung> pool = new ArrayList <Connection> (); private statische int Größe; // private connutils5 () {} static {Eigenschaften p = neue Eigenschaften (); Versuchen Sie {// Die folgende Methode kann die Ressourcendatei unter ClassPath in einem reinen Java -Projekt lesen, aber das Javaee -Projekt kann nicht gelesen werden. Weil Tomcat den Standardklassenlader des Systems geändert hat //p.load (classloader.getSystemClassloader (). GetSystemResourceAsStream ("jdbc.properties")); // p.Load (classloader.getSystemResourceAsStream ("jdbc.properties"); // Lesen Sie die Ressourcendatei unter dem Klassenpfad des Webprojekts, verwenden Sie diese zu P.Load (connutils3.class.getClassloader (). GetResourceAsStream ("jdbc.properties"); String driver = p.getProperty ("Treiber"); String url = p.getProperty ("url"); String name = p.getProperty ("Benutzername"); String pwd = p.getProperty ("Passwort"); String ssize = p.getProperty ("Größe"); Size = Integer.ParseInt (ssize); Class.Forname (Treiber); für (int i = 0; i <size; i ++) {endgültige Verbindung con = driverManager.getConnection (URL, Name, PWD); System.out.println ("con =="+con); // Ändern Sie die Conn.CLOSE () -Methode // Verwenden Sie den Proxy -Modus, um eine erweiterte Version des Conn -Objekts zu generieren, intercept und ändere seine Close () -Methode in Object ncon = proxy.newproxyinstance (connutils3.class.getClass.GetClassLoader () // Conn.GetClass (). Getinterfaces (). Programm (der Klassenlader ist unterschiedlich) neue Klasse [] {Connection.class}, New InvocationHandler () {@Override öffentliches Objekt (Objektproxy, Methode, Objekt [] args) throwable {if (methodname.GetName () NULL; pool.add ((Verbindung) ncon); }} catch (Ausnahme e) {e.printstacktrace (); }} öffentliche statische synchronisierte Verbindung getConnection () {// Nehmen Sie es zuerst von T, wenn es einen gibt. Wenn nicht, schnappen Sie es sich im Pool und setzen Sie das Objekt in T -Verbindung con = t.get (); if (con == null) {if (pool.size () <= 0) {System.out.println ("Die Verbindung im Pool ist weg ..."); try {thread.sleep (1000); } catch (interruptedException e) {e.printstacktrace (); } return getConnection (); } con = pool.remove (0); T.Set (con); // geben Sie es in t} return con; // Lassen Sie sich einen verschieben}}Schauspiel
Paket cn.hncu.utils; import Java.lang.reflect.invocationHandler; Import Java.lang.reflect.Method; Import Java.lang.reflect.proxy; private txproxy (Objekt srcobj) {this.srcobj = srcobj; } öffentliches statisches Objekt getProxy (Objekt srcobj) {System.out.println ("srcobj:"+srcobj); Objekt newObj = proxy.newProxyInstance (txproxy.class.getClassloader (), srcobj.getClass (). System.out.println ("Newobj:"+Newobj); kehre Newobj zurück; } @Override public Object Invoke (Object Proxy, Methode Methode, Object [] args) wirft Throwable {Connection con = null aus; Objekt returnObj = null; try {con = connutils5.getConnection (); System.out.println ("Invoke hat einen Link erhalten:"+con); con.setAutocommit (falsch); returnObj = methode.invoke (srcobj, args); System.out.println ("eine Transaktion einreichen ..."); con.commit (); } catch (Ausnahme e) {try {System.out.println ("Zurückrollen einer Transaktion ..."); con.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); }} endlich {try {con.setAutocommit (true); con.close (); } catch (sqlexception e) {e.printstacktrace (); }} return returnObj; }}Agent 2: Keine Notwendigkeit, die Übertragung zu erzwingen, sondern alle
Paket cn.hncu.utils; import Java.lang.reflect.invocationHandler; Import Java.lang.reflect.Method; Import Java.lang.reflect.proxy; private txproxy2 (Objekt srcobj) {this.srcobj = srcobj; } public static <t> t GetProxy (Klasse <T> c) {Objekt obj = null; try {obj = C.Newinstance (); } catch (Ausnahme e) {e.printstacktrace (); } Objekt newObj = proxy.newProxyInstance (txproxy2.class.getClassloader (), C.GetInterfaces (), New TxProxy2 (OBJ)); return (t) Newobj; } @Override public Object Invoke (Object Proxy, Methode Methode, Object [] args) wirft Throwable {Connection con = null aus; Objekt returnObj = null; try {con = connutils5.getConnection (); System.out.println ("Invoke hat einen Link erhalten:"+con); con.setAutocommit (falsch); returnObj = methode.invoke (srcobj, args); System.out.println ("eine Transaktion einreichen ..."); con.commit (); } catch (Ausnahme e) {try {System.out.println ("rolle zurück eine Transaktion ..."); con.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); }} endlich {try {con.setAutocommit (true); con.close (); } catch (sqlexception e) {e.printstacktrace (); }} return returnObj; }}Anmerkung
Paket cn.hncu.utils; import Java.lang.Annotation.Elementtype; Import Java.lang.Annotation {}Agent 3: Verwenden Sie Annotationen, um bei Bedarf Transaktionen zu implementieren
Paket cn.hncu.utils; import Java.lang.reflect.invocationHandler; Import Java.lang.reflect.Method; Import Java.lang.reflect.proxy; Import Java.sql.connection; private txproxy3 (Objekt srcobj) {this.srcobj = srcobj; } public static <T> T getProxy (t srcobj) {Objekt newObj = proxy.newproxyInstance (txproxy3.class.getClassLoader (), srcobj.getClass (). getInterfaces (), New TxProxy3 (srcobJ); return (t) Newobj; } @Override public Object Invoke (Object Proxy, Method -Methode, Object [] args) löst Throwable { /* auf, um die angegebene Methode nur zu implementieren. } */ if (methode.isannotationPresent (Transaktion.Class)) {Connection con = null; Objekt returnObj = null; try {con = connutils5.getConnection (); System.out.println ("Invoke hat einen Link erhalten:"+con); con.setAutocommit (falsch); // reale Geschäftsordnung, Release returnObj = methode.invoke (SRCOBJ, Args); System.out.println ("eine Transaktion einreichen ..."); con.commit (); } catch (Ausnahme e) {try {System.out.println ("rolle zurück eine Transaktion ..."); con.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); }} endlich {try {con.setAutocommit (true); con.close (); } catch (sqlexception e) {e.printstacktrace (); }} return returnObj; } else {system.out.println ("Es gibt keine Transaktionsannotation, einfach los!"); return methode.invoke (srcobj, args); }}}Ressourcendatei jdbc.properties
## mysqldriver = com.mysql.jdbc.driverurl = jdbc: mysql: //127.0.0.1: 3306/hncu? UseUnicode = true & charakteristisches Zeichnen = utf-8username = rootpassWor D = 1234SIZE = 3 ## Oracle#Driver = Oracle.jdbc.driver.oracledriver#url = jdbc: oracle: dünn:@127.0.1: 1521: orcl#userername = Scott#Passwort = Tiger
QueryServlet.java Servlet -Schicht der Stiftschicht
Paket cn.Hncu.stud.servlet; import Java.io.ioxception; import Java.util.list; import Java.util.map; import Javax.servlet.servletException; import Javax.servlet.http.httpServlet; javax.servlet.http.httpServletResponse; importieren cn.hncu.domain.book; import cn.hncu.domain.stud; import cn.hncu.stud.Service.istudService; importieren cn.hncu.stud.Service.studService; QueryServlet erweitert httpServlet {//inject//1.// itudService service = (iStudService) txproxy.getProxy (neuer StudServiceImpl ()); //2.// IstudService Service = txproxy2.getProxy (StudServiceImpl.class); // 3. IStudService service = txproxy3.getProxy (new StudServiceImpl ()); public void dodget (httpServletRequest Request, httpServletResponse -Antwort) löst ServletException aus, ioException {Dopost (Request, Antwort); } public void dopost (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, iOException {String cmd = request.getParameter ("CMD"); System.out.println ("CMD:"+CMD); if ("query" .equals (cmd)) {query (request, Antwort); } else if ("add" .equals (cmd)) {add (request, Antwort); }} public void query (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, IOException {System.out.println ("Service:"+Service); Liste <map <String, String >> Studs = service.query (); Request.SetAttribute ("Bolzen", Bolzen); Request.GetRequestDispatcher ("/JSPS/show.jsp"). Forward (Request, Antwort); } public void add (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, ioException {// 1 Parameter sammeln 2 organisieren Parameter (lassen Stud S = neuer Stud (); S.SetName (Name [0]); // Informationsstring -Bücher [] = Request.GetParamTervalues ("Buch"); // Schutz --- Der Preisschutz sollte ebenfalls geschrieben werden. Wir sind faul hier, wenn (books == null || books.length <= 0) {return; } String -Preise [] = Request.GetParamTervalues ("Preis"); für (int i = 0; i <books.length; i ++) {book b = new Book (); B.SetName (Bücher [i]); B.SetPrice (double.Parsedouble (Preise [i])); // ※ Vervollständigen Sie die Datenverkapselung der "Eins-zu-Viel-"-Beziehung zwischen zwei Value-Objekten S.Getbooks (). Hinzufügen (b); // Ein-Party B.Sets (s); // multiple-party} // 3 Rufen Sie die Service Layer Try {service.save (s) an; } catch (Ausnahme e) {// Richtung fehlgeschlagen Seite}}} Die Serviceschicht der Studentschicht
Schnittstelle:
Paket cn.hncu.stud.service; import Java.util.list; import Java.util.map; importieren cn.hncu.domain.stud; import cn.hncu.utils.transaction; public interface istudService {public <map <string >> query (); // Beachten Sie, dass Anmerkungen nur in der Schnittstelle nützlich sind.Implementierungsklasse
Paket cn.hncu.stud.service; import Java.sql.Connection; Import Java.sql.sqlexception; Import Java.util.List; Import Java.util.map; cn.hncu.stud.dao.bookjdbcdao; import cn.hncu.stud.dao.studdao; import cn.hncu.utils.connutils5;/*Wir verwenden normalerweise eine Tabelle, um während der zukünftigen Entwicklung unabhängig zu operieren. Wenn es mehrere Entitätstabellen im System gibt, schreiben Sie ein paar DAO. * In Zukunft wird das Rahmen dies tun, und wir müssen dies tun, weil die Architektur gut ist! * * Bei Verwendung von Transaktionen: * 1. Wenn es nur ein DAO gibt, aber mehrere SQL -Anweisungen müssen ausgeführt und hinzufügen, löschen und geändert werden, muss die Transaktion geöffnet werden. 2. Wenn ein Dienst mehrere DAO anruft, muss auch die Transaktion geöffnet werden. */public class studserviceImpl implementiert istudService {// Inject Studdao dao_stud = new Studjdbcdao (); Bookdao dao_book = new Bookjdbcdao (); @Override öffentliche Liste <map <String, String >> query () {return dao_stud.query (); } @Override public void Save (Stud Stud) löst Ausnahme aus {Dao_stud.save (Stud); dao_book.save (stud.getbooks ()); }} Die Dao -Schicht der Stu -Schicht
Praxis der Studie -Schnittstelle Trennung, eine Tabelle entspricht einem DAO, bereiten Sie sich auf den Framework vor
Paket cn.hncu.stud.dao; import Java.util.List; import Java.util.map; importieren cn.hncu.domain.stud; public interface studdao {publiclist <map <map <String, String >> query (); public void save (stud bofel) löst Ausnahme aus;}Studentimplementierungsklasse
Paket cn.hncu.stud.dao; import Java.sql.Connection; Import Java.Sql.PreparedStatement; Import Java.SQL.Resultset; Import Java.SQL.SQLEXCECECTION; Import. java.util.list; import Java.util.map; import Java.util.uuid; importieren cn.hncu.domain.book; Liste <map <String, String >> list = new ArrayList <map <String, String >> (); // Eine Karte ist eine Datenzeile, List <Map> ist die gesamte Datentabellenverbindung con = null; try {con = connutils3.getConnection (); Anweisung st = con.CreateStatement (); String SQL = "SELECT * From Stud"; ResultSet rs = St.ExecuteQuery (SQL); while (rs.Next ()) {map <string, string> m = new HashMap <String, String> (); M.put ("id", (String) rs.getObject (1)); M.put ("Name", (String) rs.getObject (2)); list.add (m); } rs.close (); St.CLOSE (); } catch (sqlexception e) {e.printstacktrace (); } endlich {try {con.close (); } catch (sqlexception e) {e.printstacktrace (); }} Rückgabeliste; } @Override public void Save (Stud Stud) löst Ausnahme aus {Connection con = connutils3.getConnection (); System.out.println ("Get a Link:"+con); String SQL = "In Stud -Werte einfügen (?,?)"; String uUid = uUid.randomuuid (). ToString (). Ersetzen ("-", ""); PrepedStatement pst = con.Preparestatement (SQL); Stud.setId (UUID); // Um "mehrere Parteien", dh das Buch "One Party" -ID zu erhalten, wird es speziell mit PST.SetString (1, UUID) ergänzt; pst.setstring (2, stud.getName ()); System.out.println ("1:"+uUid+", 2:"+stud.getName ()); pst.executeUpdate (); // con.close (); // Holen Sie sich denselben Betrug, es besteht keine Notwendigkeit, es hier zu schließen}}Buchschnittstelle
Paket cn.hncu.stud.dao; Import Java.util.List; Import Cn.Hncu.Domain.book; Public Interface Bookdao {public void Save (Liste <Book> books) löst Ausnahme aus;}Buch -Implementierungsklasse
Paket cn.hncu.stud.dao; import Java.sql.Connection; Import Java.Sql.PrepararedStatement; Import Java.util.List; löst Ausnahme aus {Connection con = connutils3.getConnection (); System.out.println ("Get a Link:"+con); String SQL = "In Buch (Name, Preis, Studiden) Werte (?,?,?)"; PrepedStatement pst = con.Preparestatement (SQL); für (Buch B: Bücher) {pst.setString (1, b.getName ()); pst.setDouble (2, B.Getprice ()); pst.setObject (3, "12132312"); // Ausnahme (absichtlich ein nicht existierendes Fremdschlüsselfeld zum Testen von Transaktionsrollback) -Test-Transaktionsrollback // pst.setObject (3, B.Gets (). getId ()); System.out.println ("1:"+b.GetName ()+", 2:"+b.Getprice ()+", 3:"+b.gets (). GetId ()); pst.addbatch (); // Hinzufügen zu batch} pst.executebatch (); // Ausführen batch // con.close (); // Holen Sie sich hier die gleiche Betrügerin, keine Notwendigkeit, hier zu schließen}} Wertobjekt
Boldeobjekt
Paket cn.hncu.domain; import Java.util.ArrayList; Import Java.util.list;/** Methode zum Erstellen eines "ein" -Square-Wert-Objekts in Eins-zu-Vielfalt*/Public Class Stud {private String-ID; privater Zeichenfolge Name; // ※ Fügen Sie eine Sammlung speziell für "Multi" Quadrate hinzu-und widerspiegeln die "Eins-zu-Viele-Beziehung" in einer privaten Multi-Tisch-Liste <Book> books = new ArrayList <Book> (); // Beachten Sie, dass die Sammlung bei oder vor dem Bau neu sein muss. public String getid () {return id; } public void setID (String -ID) {this.id = id; } public String getName () {return name; } public void setName (String -Name) {this.name = name; } public List <Book> getBooks () {return books; } public void setbooks (Liste <Book> books) {this.books = books; } @Override public String toString () {return "id =" + id + "," + name + "," + books; }}Buchobjekt
Paket cn.Hncu.domain;/** Methode zum Erstellen von "Multi" -Square-Wert-Objekten in Eins-zu-Many*/Public Class Book {private Integer id; // Alle grundlegenden Datentypen werden von der Verpackungsklasse deklariert, um die zukünftige Verwendung von Frameworks vorzubereiten-die Verpackungsklasse ist mit Frameworks kompatibel (da im Allgemeinen Frameworks-Reflexionen der Klassenreflexion verwendet werden) private String-Name; privater Doppelpreis; // ※ Fügen Sie eine Variable des Objekttyps speziell für "ein" Quadrat hinzu (beachten Sie keine Studie) --- Reflektieren Sie die "Ein-zu-Many-Beziehung" in mehreren Tabellen private Studs. } public void setId (Integer id) {this.id = id; } public String getName () {return name; } public void setName (String -Name) {this.name = name; } public double getPrice () {Rückgabepreis; } public void setPrice (Doppelpreis) {this.price = price; } public Stud gilt () {return s; } public void sets (stud s) {this.s = s; } / * * Wenn Multi-Table-Assoziation auf eine Falle achten, dh eine Partei gibt die andere Partei aus, und die andere Partei ausgibt die vorherige Partei und bildet unendliche Rekursion! */@Override public String toString () {return "id =" + id + "," + name + "," + price; // Das Stud -Objekt kann hier nicht ausgegeben werden, ansonsten unendliche Rekursion}}Schülerinformationen anzeigen Seite JSPS/show.jsp
<%@ page Language = "java" import = "java.util. <c: foreach items = "$ {studs}" var = "x"> $ {x.id}, $ {x.name} <br/> </c: foreach> </body> </html>Reproduktionsbild:
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.