ข้อมูลนักเรียนในตัวอย่างนี้จะเพิ่มธุรกรรมลงในฐานข้อมูล (สามารถส่งธุรกรรมได้การทำธุรกรรมสามารถย้อนกลับและปรับปรุงด้วยเธรดท้องถิ่น)
หน้าหลัก index.jsp
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" head> <html> <html> value = "/query"/>? cmd = query '> ดูข้อมูลนักเรียน </a> <br> <br> <!-<a href = "<c: url value ='/studservlet? cmd = บันทึก '/>"> ข้อมูลนักเรียนเพิ่ม </a>-> <h2> ชื่อ: <อินพุต type = "text" name = "name"/> <br> <br> <fieldset style = "border: solid; สีชายแดน: สีแดง; ความกว้าง: 250px;"> <legend> book1 </legend> title: <อินพุตประเภท = "text" name = "book"/> <br> <br> Solid; Border-Color: Green; Width: 250px; "> <legend> หนังสือ 2 </Legend> ชื่อเรื่อง: <อินพุตประเภท =" text "name =" book "/> <br> <br> ราคา: <อินพุตประเภท =" text "name =" ราคา "/> </fieldset> <br> <br> <br>
เครื่องมือสำหรับรับการเชื่อมต่อฐานข้อมูล connutils5.java
แพ็คเกจ cn.hncu.utils; นำเข้า java.lang.reflect.invocationhandler; นำเข้า java.lang.reflect.method; นำเข้า java.lang.reflect.proxy; นำเข้า java.sql.connection; java.util.properties; คลาสสาธารณะ connutils5 {// วัตถุการจัดการเธรดท้องถิ่นที่ใช้ในการใช้งาน: การเชื่อมต่อที่ได้จากเธรดเดียวกันนั้นเป็นเธรดแบบคงที่ส่วนตัวเดียวกัน <การเชื่อมต่อ> t = threadlocal ใหม่ <การเชื่อมต่อ> (); รายการคงที่ส่วนตัวสุดท้าย <การเชื่อมต่อ> pool = new ArrayList <การเชื่อมต่อ> (); ขนาด int คงที่ส่วนตัว; // อ่าน private connutils5 () {} คงที่ {คุณสมบัติ p = คุณสมบัติใหม่ (); ลอง {// วิธีการต่อไปนี้สามารถอ่านไฟล์ทรัพยากรภายใต้ ClassPath ในโครงการ Java บริสุทธิ์ แต่ไม่สามารถอ่านโครงการ Javaee ได้ เนื่องจาก Tomcat เปลี่ยน Loader คลาสเริ่มต้นของระบบ //p.load (classloader.getSystemClassLoader (). getSystemResourceasstream ("jdbc.properties")); // p.load (classloader.getSystemResourceasstream ("jdbc.properties")); // อ่านไฟล์ทรัพยากรภายใต้ classpath ของโครงการเว็บใช้สิ่งนี้เพื่อ p.load (connutils3.class.getclassloader (). getResourceasstream ("jdbc.properties")); สตริงไดรเวอร์ = P.GetProperty ("ไดรเวอร์"); string url = p.getProperty ("url"); ชื่อสตริง = P.GetProperty ("ชื่อผู้ใช้"); สตริง pwd = p.getProperty ("รหัสผ่าน"); String ssize = P.GetProperty ("ขนาด"); size = integer.parseint (ssize); class.forname (ไดรเวอร์); สำหรับ (int i = 0; i <size; i ++) {การเชื่อมต่อสุดท้าย con = drivermanager.getConnection (url, ชื่อ, pwd); System.out.println ("con =="+con); // เปลี่ยนเมธอด conn.close () // ใช้โหมดพร็อกซีเพื่อสร้างเวอร์ชันที่ปรับปรุงแล้วของวัตถุ Conn, การสกัดกั้นและเปลี่ยนวิธีการปิด () เป็นวัตถุ ncon = proxy.newproxyinstance (connutils3.class.getclassloader โปรแกรม (ตัวโหลดคลาสแตกต่างกัน) คลาสใหม่ [] {connection.class}, ใหม่ rechocationHandler () {@Override วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุ, วิธีการ, วัตถุ [] args) โยนลงไปได้ {ถ้า method.getName (); null;} วิธีการกลับมา (con, args); pool.add ((การเชื่อมต่อ) ncon); }} catch (exception e) {e.printstacktrace (); }} การเชื่อมต่อแบบซิงโครไนซ์แบบคงที่สาธารณะ getConnection () {// รับจาก t ก่อนถ้ามีหนึ่งให้นำออกมา ถ้าไม่คว้ามันไว้ในสระว่ายน้ำและใส่วัตถุในการเชื่อมต่อ t con = t.get (); if (con == null) {ถ้า (pool.size () <= 0) {system.out.println ("การเชื่อมต่อในพูลหายไป ... "); ลอง {thread.sleep (1,000); } catch (interruptedException e) {e.printStackTrace (); } return getConnection (); } con = pool.remove (0); t.set (con); // ใส่ไว้ใน t} return con; // รับหนึ่งเพื่อย้ายหนึ่ง}}ไฟล์ทรัพยากร jdbc.properties
## mysqldriver = com.mysql.jdbc.driverurl = jdbc: mysql: //127.0.0.1: 3306/hncu? d = 1234Size = 3 ## Oracle#driver = oracle.jdbc.driver.oracledriver#url = jdbc: Oracle: Thin:@127.0.0.1: 1521: ORCL#username = Scott#รหัสผ่าน = Tiger
วัตถุค่า
stud.java
แพ็คเกจ cn.hncu.domain; นำเข้า java.util.arraylist; นำเข้า java.util.list;/** เมธอดสำหรับการสร้างวัตถุค่า "หนึ่ง" ในหนึ่งถึงหนึ่งในหลาย ๆ ชื่อสตริงส่วนตัว; // ※เพิ่มคอลเลกชันโดยเฉพาะสำหรับสี่เหลี่ยม "หลาย" --- สะท้อนให้เห็นถึง "ความสัมพันธ์แบบหนึ่งต่อหลายคน" ในรายการส่วนตัวหลายตาราง <book> หนังสือ = New ArrayList <Book> (); // โปรดทราบว่าคอลเลกชันจะต้องใหม่ที่หรือก่อนการก่อสร้าง สตริงสาธารณะ getId () {return id; } โมฆะสาธารณะ setId (รหัสสตริง) {this.id = id; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } รายการสาธารณะ <book> getBooks () {ส่งคืนหนังสือ; } void setbooks สาธารณะ (รายการ <book> หนังสือ) {this.books = หนังสือ; } @Override สตริงสาธารณะ toString () {return "id =" + id + "," + name + "," + หนังสือ; -book.java
แพ็คเกจ cn.hncu.domain;/** เมธอดสำหรับการสร้างวัตถุค่าสแควร์ "หลาย" ในหนังสือชั้นเรียนแบบหนึ่งต่อหลาย ๆ // ประเภทข้อมูลพื้นฐานทั้งหมดได้รับการประกาศโดยคลาสบรรจุภัณฑ์เพื่อเตรียมพร้อมสำหรับการใช้เฟรมเวิร์กในอนาคต --- คลาสบรรจุภัณฑ์เข้ากันได้กับเฟรมเวิร์ก (เพราะโดยทั่วไปเฟรมเวิร์กใช้การสะท้อนคลาส) ชื่อสตริงส่วนตัว; ราคาสองเท่าส่วนตัว // ※เพิ่มตัวแปรของประเภทวัตถุโดยเฉพาะสำหรับ "หนึ่ง" สแควร์ (หมายเหตุอย่าใช้การศึกษา) --- สะท้อนให้เห็นถึง "ความสัมพันธ์แบบหนึ่งต่อหลายครั้ง" ในหลายตารางสตั๊ดส่วนตัว s; // ตั้งค่าหลัก // การศึกษาสตริงส่วนตัว; // ★★ไม่ตั้งค่าจำนวนเต็มสาธารณะ getId () {return id; } โมฆะสาธารณะ setId (ID จำนวนเต็ม) {this.id = id; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } สาธารณะ double getPrice () {ราคาคืน; } โมฆะสาธารณะ setPrice (ราคาสองเท่า) {this.price = ราคา; } สตั๊ดสาธารณะได้รับ () {return s; } ชุดโมฆะสาธารณะ (Stud S) {this.s = s; } / * * เมื่อสมาคมหลายตารางคุณควรให้ความสนใจกับกับดักนั่นคือฝ่ายหนึ่งจะส่งออกฝ่ายอื่นและอีกฝ่ายหนึ่งจะส่งออกฝ่ายก่อนหน้า */@Override สตริงสาธารณะ toString () {return "id =" + id + "," + name + "," + price; // วัตถุสตั๊ดไม่สามารถส่งออกได้ที่นี่queryservlet.java servlet เลเยอร์ของ stud layer
แพ็คเกจ cn.hncu.stud.servlet; นำเข้า java.io.ioexception; นำเข้า java.util.list; นำเข้า java.util.map; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; javax.servlet.http.httpservletResponse; นำเข้า cn.hncu.domain.book; นำเข้า cn.hncu.domain.stud; นำเข้า cn.hncu.stud.service.istudservice; นำเข้า cn.hncu.stud.service.studserviceimpl; บริการ istudservice = studserviceimpl ใหม่ (); โมฆะสาธารณะ DOGET (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {dopost (คำขอ, การตอบสนอง); } โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {string cmd = request.getParameter ("cmd"); System.out.println ("CMD:"+CMD); if ("Query" .equals (CMD)) {Query (คำขอ, การตอบกลับ); } อื่นถ้า ("เพิ่ม" .equals (cmd)) {เพิ่ม (คำขอ, การตอบกลับ); }} แบบสอบถามโมฆะสาธารณะ (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {รายการ <แผนที่ <สตริง, สตริง >> studs = service.query (); request.setAttribute ("studs", studs); request.getRequestDispatcher ("/jsps/show.jsp"). forward (คำขอ, การตอบกลับ); } โมฆะสาธารณะเพิ่ม (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {// 1 รวบรวมพารามิเตอร์ 2 จัดพารามิเตอร์ (ฟิลด์ ID ถูกทิ้งไว้ใน DAO เพื่อเสริม) ชื่อสตริง [] = request.getParametervalues ("ชื่อ"); System.out.println (ชื่อ [0]); Stud S = New Stud (); S.SetName (ชื่อ [0]); // หนังสือข้อมูลสตริงหนังสือ [] = request.getParametervalues ("หนังสือ"); // protect --- ควรเขียนการป้องกันราคาด้วยที่นี่เราขี้เกียจถ้า (หนังสือ == null || books.length <= 0) {return; } ราคาสตริง [] = request.getParameterValues ("ราคา"); สำหรับ (int i = 0; i <books.length; i ++) {book b = หนังสือเล่มใหม่ (); B.SetName (หนังสือ [i]); b.setprice (double.parsedouble (ราคา [i])); // ※ความสัมพันธ์ "แบบหนึ่งถึงหลายครั้ง" ของวัตถุสองค่า s.getBooks (). เพิ่ม (b); // B.Sets พรรคเดียว; // Multiple-Party} // 3Call Service Layer ลอง {service.save (s); } catch (exception e) {// ทิศทางล้มเหลวหน้า}}}อินเทอร์เฟซเลเยอร์บริการของเลเยอร์สตั๊ด:
แพ็คเกจ cn.hncu.stud.service; นำเข้า java.util.list; นำเข้า java.util.map; นำเข้า cn.hncu.domain.stud; อินเตอร์เฟสสาธารณะ istudservice {รายการสาธารณะ <แผนที่ <String, String >> Query (); โมฆะสาธารณะบันทึก (สตั๊ดสตั๊ด);}คลาสการดำเนินการ
แพ็คเกจ cn.hncu.stud.service; นำเข้า java.sql.connection; นำเข้า java.sql.sqlexception; นำเข้า java.util.list; นำเข้า java.util.map; นำเข้า cn.hncu.domain.stud; cn.hncu.stud.dao.bookdao; นำเข้า cn.hncu.stud.dao.bookjdbcdao; นำเข้า cn.hncu.stud.dao.studdao; นำเข้า cn.hncu.utils.connutils3;/*ในอนาคต หากมีหลายตารางเอนทิตีในระบบให้เขียน DAO สองสามตัว * ในอนาคตเฟรมเวิร์กจะทำสิ่งนี้และเราต้องทำสิ่งนี้เพราะสถาปัตยกรรมดี! * * ในกรณีที่ใช้ธุรกรรม: * 1. หากมีเพียงหนึ่ง DAO แต่ต้องมีคำสั่ง SQL หลายคำสั่งและเพิ่มลบและแก้ไขการทำธุรกรรมจะต้องเปิด 2. หากบริการเรียกหลาย DAO การทำธุรกรรมจะต้องเปิดด้วย */คลาสสาธารณะ studserviceimpl ใช้ iTudService {// inject studdao dao_stud = ใหม่ studjdbcdao (); bookdao dao_book = ใหม่ bookjdbcdao (); @Override รายการสาธารณะ <แผนที่ <string, string >> query () {return dao_stud.query (); } @Override โมฆะสาธารณะบันทึก (สตั๊ดสตั๊ด) {การเชื่อมต่อ con = null; ลอง {con = connutils3.getConnection (); System.out.println ("รับลิงค์:"+con); Con.setAutocommit (เท็จ); dao_stud.save (สตั๊ด); dao_book.save (stud.getbooks ()); System.out.println ("กระทำการทำธุรกรรม ... "); Con.Commit (); } catch (exception e) {ลอง {system.out.println ("Rolle ย้อนกลับการทำธุรกรรม ... "); Con.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); }} ในที่สุด {ลอง {con.setautocommit (จริง); con.close (); } catch (sqlexception e) {e.printstacktrace (); - ชั้น Dao ของชั้น Stu
อินเทอร์เฟซสตั๊ด
แพ็คเกจ cn.hncu.stud.dao; นำเข้า java.util.list; นำเข้า java.util.map; นำเข้า cn.hncu.domain.stud; อินเตอร์เฟสสาธารณะ studdao {รายการสาธารณะ <แผนที่ <สตริง, สตริง >> query (); โมฆะสาธารณะบันทึก (สตั๊ดสตั๊ด) โยนข้อยกเว้น;}คลาสการใช้งานสตั๊ด
แพ็คเกจ cn.hncu.stud.dao; นำเข้า java.sql.connection; นำเข้า java.sql.preparedStatement; นำเข้า java.sql.resultset นำเข้า java.sql.sqlexception; นำเข้า Java.sql.statement; java.util.list; นำเข้า java.util.map; นำเข้า java.util.uuid; นำเข้า cn.hncu.domain.book; นำเข้า cn.hncu.domain.stud; นำเข้า cn.hncu.utils.connutils3; รายการ <แผนที่ <สตริง, สตริง >> list = arrayList ใหม่ <แผนที่ <สตริง, สตริง >> (); // แผนที่เป็นแถวของข้อมูลรายการ <ap> คือการเชื่อมต่อตารางข้อมูลทั้งหมด con = null; ลอง {con = connutils3.getConnection (); คำสั่ง st = con.createstatement (); String SQL = "SELECT * จาก Stud"; resultset rs = stexecuteQuery (SQL); ในขณะที่ (rs.next ()) {map <string, string> m = new hashmap <string, string> (); m.put ("id", (สตริง) rs.getObject (1)); m.put ("ชื่อ", (สตริง) rs.getObject (2)); list.add (m); } rs.close (); St.Close (); } catch (sqlexception e) {e.printstacktrace (); } ในที่สุด {ลอง {con.close (); } catch (sqlexception e) {e.printstacktrace (); }} รายการส่งคืน; } @Override โมฆะสาธารณะบันทึก (สตั๊ดสตั๊ด) โยนข้อยกเว้น {การเชื่อมต่อ con = connutils3.getConnection (); System.out.println ("รับลิงค์:"+con); String sql = "แทรกลงในค่าสตั๊ด (?,?)"; string uuid = uuid.randomuuid (). toString (). แทนที่ ("-", ""); PreparedStatement PST = con.prepareStatement (SQL); stud.setId (uuid); // เพื่อ "หลายฝ่าย" นั่นคือหนังสือสามารถรับรหัส "หนึ่งฝ่าย" ได้เสริมเป็นพิเศษด้วย pst.setstring (1, uuid); pst.setstring (2, stud.getName ()); System.out.println ("1:"+uuid+", 2:"+stud.getName ()); pst.executeUpdate (); // con.close (); // รับ con เดียวกันไม่จำเป็นต้องปิดที่นี่}}}อินเทอร์เฟซหนังสือ
แพ็คเกจ cn.hncu.stud.dao; นำเข้า java.util.list; นำเข้า cn.hncu.domain.book; อินเตอร์เฟสสาธารณะ bookdao {โมฆะสาธารณะบันทึก (รายการ <book> หนังสือ) โยนข้อยกเว้น;}}ชั้นเรียนการใช้งานหนังสือ
แพ็คเกจ cn.hncu.stud.dao; นำเข้า java.sql.connection; นำเข้า java.sql.preparedStatement; นำเข้า java.util.list; นำเข้า cn.hncu.domain.book; นำเข้า cn.hncu.utils.connutils3; หนังสือ) โยนข้อยกเว้น {การเชื่อมต่อ con = connutils3.getConnection (); System.out.println ("รับลิงค์:"+con); String sql = "แทรกลงในหนังสือ (ชื่อราคา, studid) ค่า (?,?,?)"; PreparedStatement PST = con.prepareStatement (SQL); สำหรับ (หนังสือ B: หนังสือ) {pst.setstring (1, b.getName ()); pst.setDouble (2, b.getPrice ()); PST.SetObject (3, "12132312"); // ข้อยกเว้น (จงใจให้ฟิลด์คีย์ต่างประเทศที่ไม่มีอยู่เพื่อทดสอบการทำธุรกรรมย้อนกลับ)-การทดสอบการทำธุรกรรมการทำธุรกรรม // PST.SetObject (3, b.gets (). getId ()); System.out.println ("1:"+b.getName ()+", 2:"+b.getPrice ()+", 3:"+b.gets (). getId ()); pst.addbatch (); // เพิ่มลงในแบทช์} pst.executebatch (); // ดำเนินการแบทช์ // con.close (); // รับ con เดียวกันที่นี่ไม่จำเป็นต้องปิดที่นี่}}}แสดงหน้าข้อมูลนักเรียน jsps/show.jsp
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" huadd> <html> <html> <c: foreach items = "$ {studs}" var = "x"> $ {x.id}, $ {x.name} <br/> </c: foreach> </body> </html>ภาพการทำซ้ำ:
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับระบบการจัดการโปรดคลิก "หัวข้อการจัดการพิเศษ" เพื่อเรียนรู้
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น