تضيف معلومات الطالب في هذا المثال معاملات إلى قاعدة البيانات (يمكن تقديم المعاملة ، ويمكن إعادة المعاملات ، وتحسينها مع مؤشرات الترابط المحلية)
الصفحة الرئيسية index.jsp
<٪@ page language = "java" import = "java.util. value = "/query"/>؟ cmd = query '> عرض معلومات الطالب </a> <br> <br> <!-<a href = "<c: url value ='/studservlet؟ cmd = save '/>" الاسم: <type type = "text" name = "name"/> <br> <br> <bieldset style = "الحدود: صلبة ؛ اللون الحدودي: أحمر ؛ العرض: 250px ؛"> <legend> book1 </legend> العنوان: <input type = "text" name = "book"/> <br> price: <price type = style = "الحدود: صلبة ؛ اللون الحدودي: أخضر ؛ العرض: 250px ؛"> <legend> الكتاب 2 </legend> العنوان: <input type = "text" name = "book"/> <br> <br> السعر: <input type = "text" </body> </html>
أداة للحصول على اتصال قاعدة البيانات connutils5.java
package cn.hncu.utils ؛ import java.lang.reflect.invocationHandler ؛ import java.lang.reflect.method ؛ import java.lang.reflect.proxy ؛ import java.sql.connection ؛ import java.sql.drivermer ؛ import java. java.util.properties ؛ connutils connutils5 {// محلي كائن إدارة مؤشر الترابط المحلي ، المستخدم للتنفيذ: الاتصال الذي تم الحصول عليه بواسطة نفس مؤشر الترابط هو نفس مؤشر الترابط الثابت الخاص <connection> t = new threadlocal <Connate> () ؛ القائمة الثابتة النهائية الخاصة <Connate> pool = new ArrayList <Connality> () ؛ حجم int ثابت خاص ؛ // قراءة private connutils5 () {} static {properties p = new properties () ؛ جرب {// يمكن للطريقة التالية قراءة ملف المورد ضمن ClassPath في مشروع Java الخالص ، ولكن لا يمكن قراءة مشروع Javaee. لأن Tomcat غيرت فئة الفئة الافتراضية للنظام //p.load (classloader.getSystemClasslassloader (). GetSystemResourCeasStream ("jdbc.properties")) ؛ // p.load (classloader.getSystemResourCeasStream ("jdbc.properties")) ؛ // اقرأ ملف المورد ضمن classpath من مشروع الويب ، استخدم هذا إلى p.load (connutils3.class.getClassLoader (). getResourCeasStream ("jdbc.properties")) ؛ String Driver = P.GetProperty ("Driver") ؛ url url = p.getProperty ("url") ؛ اسم السلسلة = p.getProperty ("اسم المستخدم") ؛ سلسلة pwd = p.getProperty ("كلمة المرور") ؛ سلسلة ssize = p.getProperty ("الحجم") ؛ الحجم = integer.parseint (ssize) ؛ class.forname (driver) ؛ لـ (int i = 0 ؛ i <size ؛ i ++) {final connection con = drivermanager.getConnection (url ، name ، pwd) ؛ System.out.println ("con =="+con) ؛ . البرنامج الحالي (اختلاف الفئة) فئة جديدة) إرجاع طريقة الإرجاع. pool.add ((connection) ncon) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ }} connection getConnection getConnection () {// get first ، إذا كان هناك واحد ، خذها. إذا لم يكن الأمر كذلك ، فأمسكه في المسبح ووضع الكائن في T connection con = t.get () ؛ if (con == null) {if (pool.size () <= 0) {system.out.println ("ذهب الاتصال في التجمع ...") ؛ حاول {thread.sleep (1000) ؛ } 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؟ useUnicode = true & districtoding = utf-8username = rootpasswor d = 1234size = 3 ## oracle#driver = oracle.jdbc.driver.oracledriver#url = jdbc: oracle: thin:@127.0.0.1: 1521: orcl#username = scott#password = tiger
كائن القيمة
stud.java
Package cn.hncu.domain ؛ استيراد java.util.arraylist ؛ استيراد java.util.list ؛/*** طريقة لإنشاء كائن "واحد" مربع في واحد إلى many*/public class stud {private string id ؛ اسم السلسلة الخاصة ؛ // ※ أضف مجموعة خصيصًا للساحات "المتعددة" --- تعكس "العلاقة الواحدة" في قائمة خاصة متعددة الطاولة <book> books = new ArrayList <book> () ؛ // لاحظ أن المجموعة يجب أن تكون جديدة في أو قبل البناء. السلسلة العامة getId () {معرف الإرجاع ؛ } public void setId (string id) {this.id = id ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } القائمة العامة <book> getBooks () {return books ؛ } public void setbooks (قائمة <book> كتب) {this.books = books ؛ } Override Public String ToString () {return "id =" + id + "،" + name + "،" + books ؛ }}book.java
Package cn.hncu.domain ؛/** طريقة لإنشاء كائنات القيمة المربعة "متعددة" في كتاب الفئة العامة*/public {private integer id ؛ // يتم الإعلان عن جميع أنواع البيانات الأساسية من قبل فئة التغليف للتحضير للاستخدام المستقبلي للأطر --- فئة التغليف متوافقة مع الأطر (لأن الأطر عمومًا تستخدم انعكاس الفئة) اسم السلسلة الخاصة ؛ سعر مزدوج خاص ؛ // ※ أضف متغيرًا من نوع الكائن خصيصًا لـ "One" Square (ملاحظة ، لا تستخدم الدراسة) --- تعكس "العلاقة الواحدة إلى حد كبير" في الجداول المتعددة الخاصة } public void setId (integer id) {this.id = id ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } public double getPrice () {return price ؛ } public void setPrice (price double) {this.price = price ؛ } stud get () {return s ؛ } مجموعات الفراغ العامة (stud s) {this.s = s ؛ } / * * عندما تكون جمعية متعددة الطاولة ، يجب أن تنتبه إلى فخ ، أي طرف واحد يخرج الطرف الآخر ، والطرف الآخر بدوره يخرج الطرف السابق ، ويشكل عودية لا حصر لها! */Override Public String ToString () {return "id =" + id + "،" + name + "،" + price ؛ // لا يمكن إخراج كائن stud هنا ، وإلا infinite recursion}}Queryservlet.java طبقة Servlet من طبقة مسمار
package cn.hncu.stud.servlet ؛ استيراد java.io.ioException ؛ استيراد java.util.list ؛ استيراد java.util.map ؛ import javax.servlet.servletexception ؛ import javax.servlet.http.httpservlet ؛ javax.servlet.http.httpservletresponse ؛ استيراد cn.hncu.domain.book ؛ استيراد cn.hncu.domain.stud ؛ استيراد cn.hncu.stud.service.istudservice ؛ isTudService Service = New StudServiceImpl () ؛ DOGED VOID Public Void (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servletexception ، ioException {dopost (request ، response) ؛ } public void dopost (طلب httpservletrequest ، استجابة httpservletponse) يلقي servletexception ، ioException {string cmd = request.getParameter ("cmd") ؛ system.out.println ("cmd:"+cmd) ؛ if ("Query" .equals (cmd)) {query (request ، response) ؛ } آخر إذا ("إضافة" .equals (cmd)) {add (request ، response) ؛ }} Query public void (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servletexception ، ioException {list <map <string ، string >> studs = service.query () ؛ request.setattribute ("studs" ، studs) ؛ request.getRequestDispatcher ("/jsps/show.jsp"). } public void add (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servleTexception ، ioException {// 1 جمع المعلمات 2 المعلمات المنظمة (يتم ترك حقل ID في DAO لتكملة) اسم السلسلة [] = request.getParametervalues ("اسم") ؛ System.out.println (name [0]) ؛ stud s = new stud () ؛ S.SetName (الاسم [0]) ؛ // Book Information String Books [] = request.getParametervalues ("Book") ؛ // protect --- يجب أيضًا كتابة حماية الأسعار ، هنا نحن كسولون إذا (كتب == null || books.length <= 0) {return ؛ } أسعار السلسلة [] = request.getParametervalues ("السعر") ؛ لـ (int i = 0 ؛ i <books.length ؛ i ++) {book b = new book () ؛ B.SetName (كتب [i]) ؛ B.SetPrice (double.parsedouble (الأسعار [i])) ؛ . // b.sets (s). // multip-party} // 3Call Service Layer Try {service.save (s) ؛ } catch (استثناء e) {// فشل الاتجاه الصفحة}}}واجهة طبقة الخدمة لطبقة مسمار:
package cn.hncu.stud.service ؛ import java.util.list ؛ استيراد java.util.map ؛ استيراد cn.hncu.domain.stud ؛ الواجهة العامة iStudService {قائمة عامة <map ، string >> Query () ؛ Save Public Void Save (Stud stud) ؛}فئة التنفيذ
package cn.hncu.stud.service ؛ import java.sql.connection ؛ import java.sql.sqlexception ؛ import java.util cn.hncu.stud.dao.bookjdbcdao ؛ استيراد cn.hncu.stud.dao.studdao ؛ استيراد cn.hncu.utils.connutils3 ؛/*في المستقبل ، عادة ما نستخدم جدولًا للعمل بشكل مستقل. إذا كان هناك العديد من جداول الكيانات في النظام ، فاكتب بعض DAO. * في المستقبل ، سيقوم الإطار بذلك ، ويجب أن نفعل ذلك ، لأن الهندسة المعمارية جيدة! * * في حالة استخدام المعاملات: * 1. إذا كان هناك DAO واحد فقط ، ولكن يجب تنفيذ عبارات SQL متعددة وإضافة وحذف وتعديل ، فيجب فتح المعاملة. 2. إذا استدعت الخدمة DAO متعددة ، فيجب فتح المعاملة أيضًا. */الفئة العامة studserviceImpl تنفذ isTudService {// حقن studdao dao_stud = جديد studjdbcdao () ؛ bookdao dao_book = new bookjdbcdao () ؛ قائمة Override العامة <map <string ، string >> query () {return dao_stud.query () ؛ } Override public void save (stud stud) {connection con = null ؛ حاول {con = connutils3.getConnection () ؛ System.out.println ("احصل على رابط:"+con) ؛ consetautocommit (false) ؛ dao_stud.save (stud) ؛ dao_book.save (stud.getBooks ()) ؛ System.out.println ("ارتكاب معاملة ...") ؛ con.Commit () ؛ } catch (استثناء e) {try {system.out.println ("rolle back A Transaction ...") ؛ con.rollback () ؛ } catch (sqlexception e1) {e1.printStackTrace () ؛ }} أخيرًا {try {con.setAutocommit (true) ؛ con.close () ؛ } catch (sqlexception e) {E.PrintStackTrace () ؛ }}}} طبقة داو لطبقة ستو
واجهة مسمار
package cn.hncu.stud.dao ؛ استيراد java.util.list ؛ استيراد java.util.map ؛ استيراد cn.hncu.domain.stud ؛ واجهة عامة studdao {قائمة عامة <map ، string >> Query () ؛ إلقاء الفراغ العام (مسمار مسمار) استثناء ؛}فئة تنفيذ مسمار
package cn.hncu.stud.dao ؛ استيراد java.sql.connection ؛ استيراد java.sql.preparedstatement ؛ استيراد java.sql.resultset ؛ import java.sql.sqlexception ؛ import java.sql.statement ؛ import java.util. java.util.list ؛ import java.util.map ؛ import java.util.uuid ؛ import cn.hncu.domain.book ؛ import cn.hncu.domain.stud ؛ import cn.hncu.utils.connutils3 ؛ public class studjdbcdaio studdao {everride public. قائمة <map <string ، string >> list = new ArrayList <map <string ، string >> () ؛ . حاول {con = connutils3.getConnection () ؛ بيان st = con.createstatement () ؛ String SQL = "SELECT * from stud" ؛ resultset rs = St.Executequery (SQL) ؛ بينما (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 () ؛ } أخيرًا {try {con.Close () ؛ } catch (sqlexception e) {E.PrintStackTrace () ؛ }} قائمة الإرجاع ؛ } Override public void save (stud stud) يلقي الاستثناء {connection con = connutils3.getConnection () ؛ System.out.println ("احصل على رابط:"+con) ؛ String sql = "insert في قيم مسمار (؟ ،؟)" ؛ String uuid = uuid.randomuuid (). toString (). استبدال ("-" ، "") ؛ ReparedStatement PST = con.preparestatement (SQL) ؛ stud.setId (uuid) ؛ // من أجل "الأطراف المتعددة" ، أي أن الكتاب يمكن أن يحصل على معرف "Party" ، ويتم استكماله خصيصًا باستخدام pst.setstring (1 ، UUID) ؛ pst.SetString (2 ، stud.getName ()) ؛ System.out.println ("1:"+uuid+"، 2:"+stud.getName ()) ؛ pst.executeupdate () ؛ // con.close () ؛ // الحصول على نفس الخداع ، ليست هناك حاجة لإغلاقه هنا}}واجهة الكتاب
package cn.hncu.stud.dao ؛ استيراد java.util.list ؛ استيراد cn.hncu.domain.book ؛ الواجهة العامة bookdao {public void save (قائمة <book> كتب) رمي الاستثناء ؛}فئة تنفيذ الكتاب
package cn.hncu.stud.dao ؛ استيراد java.sql.connection ؛ استيراد java.sql.preparedstatement رمي الاستثناء {connection con = connutils3.getConnection () ؛ System.out.println ("احصل على رابط:"+con) ؛ String sql = "insert in book (name ، price ، Studid) stable (؟ ،؟ ،؟)" ؛ ReparedStatement PST = con.preparestatement (SQL) ؛ لـ (Book B: Books) {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 () ؛ // إضافة إلى batch} pst.executeBatch () ؛ // تنفيذ batch // con.close () ؛ // احصل على نفس الخداع هنا ، لا حاجة للإغلاق هنا}}عرض صفحة معلومات الطالب JSPs/show.jsp
<٪@ page language = "java" import = "java.util. <c: foreach heads = "$ {studs}" var = "x"> $ {x.id} ، $ {x.name} <br/> </c: foreach> </body> </html>صورة التكاثر:
لمزيد من المعلومات حول نظام الإدارة ، يرجى النقر فوق "موضوع نظام إدارة الخاص" للتعلم
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.