อนิจจาฉันไม่ได้เขียนอะไรมานานแล้ว เนื่องจากเหตุผลในการทำงานฉันได้ติดต่อกับกรอบ ORM พื้นฐานที่พัฒนาโดย บริษัท ฉันบังเอิญพบว่าเมื่อโทรหาการดำเนินการ JDBC เฟรมเวิร์กหมายถึง SimpleJdBctemplate ใน Hibernate ที่นี่ฉันคิดถึงการห่อหุ้ม JDBC แบบง่าย ๆ ที่ฉันใช้เมื่อฉันอยู่ในวิทยาลัย ตอนนี้ฉันจะโพสต์รหัสและแบ่งปันกับคุณ:
config class: อ่านไฟล์การกำหนดค่าการเชื่อมต่อฐานข้อมูลภายใต้แพ็คเกจเดียวกันเพื่อให้ดีกว่าสำหรับการพิจารณาทั่วไป
แพ็คเกจ com.tly.dbutil; นำเข้า java.io.ioException; นำเข้า java.util.properties; การกำหนดค่าระดับสาธารณะ {คุณสมบัติคงที่ส่วนตัว prop = คุณสมบัติใหม่ (); คงที่ {ลอง {// โหลด dbconfig.properties ไฟล์การกำหนดค่า prop.load (config.class.getResourceasstream ("dbconfig.properties")); } catch (ioexception e) {// todo บล็อก catch block ที่สร้างอัตโนมัติ e.printstacktrace (); }} // ตั้งค่าสตริงสุดท้ายคงที่คงที่ class_name = prop.getProperty ("class_name"); public String สุดท้าย String Database_url = prop.getProperty ("database_url"); String String สุดท้ายสาธารณะ Server_ip = prop.getProperty ("Server_ip"); สตริงสุดท้ายคงที่สาธารณะ server_port = prop.getProperty ("server_port"); ฐานข้อมูลสตริงสุดท้ายคงที่สาธารณะ database_sid = prop.getProperty ("database_sid"); Public Static Final String ชื่อผู้ใช้ = prop.getProperty ("ชื่อผู้ใช้"); รหัสผ่านสตริงสุดท้ายคงที่สาธารณะ = prop.getProperty ("รหัสผ่าน"); -dbconfig.properties: ไฟล์การกำหนดค่าฐานข้อมูลคุณยังสามารถใช้รูปแบบ XML ฯลฯ ให้ความสนใจกับตำแหน่งการโทรของไฟล์ในคลาส config
class_name = com.mysql.jdbc.driverdatabase_url = jdbc: mysqlserver_ip = localhostserver_port = 3306database_sid = พนักงาน
ถัดไปคือ DBConn การเชื่อมต่อฐานข้อมูล
แพ็คเกจ com.employees.dbutil; นำเข้า java.sql.connection; นำเข้า java.sql.drivermanager; นำเข้า java.sql.preparedStatement; นำเข้า java.sql.resultset; นำเข้า java.sql.sqlexception; PSTATETEMENT ส่วนตัว PSTMT = NULL; Resultset Private RS = NULL; // สี่วิธี // วิธีการ 1: สร้างการเชื่อมต่อกับฐานข้อมูลการเชื่อมต่อสาธารณะ getConntion () {ลอง {// 1: โหลดไดรเวอร์การเชื่อมต่อ, Java Reflection Principle Class.forName (config.class_name); // 2: สร้างวัตถุอินเตอร์เฟสการเชื่อมต่อเพื่อรับวัตถุการเชื่อมต่อของฐานข้อมูล MySQL สามพารามิเตอร์: URL การเชื่อมต่อสตริงบัญชีรหัสผ่าน 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: วิธีการปิดฐานข้อมูลโมฆะสาธารณะ closeconn () {ถ้า (rs! = null) {ลอง {rs.close (); } catch (sqlexception e) {e.printstacktrace (); }} if (pstmt! = null) {ลอง {pstmt.close (); } catch (sqlexception e) {e.printstacktrace (); }} if (conn! = null) {ลอง {conn.close (); } catch (sqlexception e) {e.printstacktrace (); }}} // วิธีการ 3: วิธีที่ใช้โดยเฉพาะในการส่งเพิ่มลบและแก้ไขคำสั่ง INT Public Int (PreparedStatement PSTMT) {ลอง {// 1 ใช้วัตถุคำสั่งเพื่อส่งคำสั่ง SQL intuedrows = pstmt.executeUpdate (); // 2. ส่งคืนผลลัพธ์ที่ส่งคืนได้รับผลกระทบ; } catch (sqlexception e) {e.printstacktrace (); กลับ -1; }} // Method4: ใช้โดยเฉพาะเพื่อส่งคำสั่งแบบสอบถาม Public Resultset ExecQuery (PreparedStatement PSTMT) {ลอง {// 1 ใช้วัตถุคำสั่งเพื่อส่งคำสั่ง sql rs = pstmt.executeQuery (); // 2. ส่งคืนผลตอบแทนผลลัพธ์ RS; } catch (sqlexception e) {e.printstacktrace (); คืนค่า null; -โดยปกติแล้วการใช้รหัสข้างต้นสามารถแก้ปัญหาแอปพลิเคชัน CRUD อย่างง่าย ๆ ได้ แต่มีข้อ จำกัด มากมาย ตัวอย่างเช่นทุกครั้งที่โปรแกรมใช้การเชื่อมต่อมันจะเพิ่มภาระในระบบไม่มีการทำธุรกรรมไม่มีแหล่งข้อมูล ฯลฯ วันนี้ฉันเห็นเพื่อนในสวนสาธารณะเขียนบทความในสวนโดยใช้การสะท้อนเพื่อแก้ไข crud โดยตรงในพารามิเตอร์วัตถุ ฉันเคยเขียนสิ่งนี้มาก่อน แต่ฉันยังไม่เสร็จ ฉันต้องการเขียน dbutil ทั่วไปเป็นหลัก ในที่สุดฉันศึกษามันและพบว่ามันใกล้ชิดกับ SimpleJdBctemplate ในไฮเบอร์เนตดังนั้นฉันจึงไปดูซอร์สโค้ดของไฮเบอร์เนต นอกจากนี้ยังมีบางสิ่งในช่วงเวลานั้นและฉันไม่มีเวลาดังนั้นฉันจึงออกจากเรื่องนี้ไม่ได้ใช้งาน ตอนนี้ฉันทำสิ่งนี้และตรวจสอบด้วยตัวเอง
ชั้นเรียน
แพ็คเกจ com.employees.dao; นำเข้า java.io.inputstream; นำเข้า java.lang.reflect.method; นำเข้า java.lang.reflect.parameterizedType; นำเข้า java.sql.connection; นำเข้า Java.sql.date; java.util.arraylist; นำเข้า java.util.iterator; นำเข้า java.util.list; นำเข้า com.employees.dbutil.dbconn; คลาสสาธารณะที่ใช้ <t> {dbconn conn = new dbconn (); การเชื่อมต่อส่วนตัวการเชื่อมต่อ = null; @suppresswarnings ("ไม่ได้ใช้") คลาสส่วนตัว <t> persistentClass; @suppresswarnings ("ไม่ได้ตรวจสอบ") Public -basedao () {initConnection (); // รับพารามิเตอร์ประเภทพารามิเตอร์ parameterizedType = (parameterizedType) getClass (). getGenericsuperClass (); persistentClass = (คลาส <t>) type.getActualTuterGuments () [0]; } / *** รับการเชื่อมต่อฐานข้อมูล* / public void initConnection () {connection = conn.getConntion (); } /** * บันทึก * /โมฆะสาธารณะบันทึก (t entity) พ่นข้อยกเว้น {// SQL คำสั่งแทรกลงในชื่อตาราง (สตริง sql = "แทรกลงใน" + entity.getClass (). getSimplename (). toLowerCase () + "("; // รับวัตถุทั้งหมด Iterator <method> iter = list.iterator (); sql = sql.substring (0, sql.lastindexof (",")) +") ค่า ("; // ยืนขึ้นคำสั่ง sql คอมไพล์ sql แทรกลงในชื่อตาราง (id, ชื่อ, อีเมล) ค่า (?,?,?, สำหรับ (int j = 0; j <list.size ลงในชื่อตาราง (ID, ชื่อ, อีเมล) ค่า (?,?,?); // รับการอ้างอิงไปยังคำสั่ง PreparedStatement Object ที่ถูกคอมไพล์ล่วงหน้า = Connection.prepareStatement (SQL); int i = 0; // เลื่อนตัวชี้ไปยังบรรทัดสุดท้ายของตัววนซ้ำไปยังบรรทัดแรก iter = list.iterator (); ในขณะที่ (iter.hasnext ()) {วิธีการ = iter.next (); // สิ่งนี้เริ่มต้นกำหนดประเภทของค่าส่งคืนเนื่องจากรูปแบบค่าฟิลด์บางรูปแบบจำเป็นต้องเปลี่ยนแปลงเมื่อเก็บไว้ในฐานข้อมูล ตัวอย่างเช่นสตริงคำสั่ง sql คือ '"+abc+"' ถ้า (method.getReturnType (). getSimplename (). indexof ("String")! = -1) {attement.setstring (++ i, this.getString (method, เอนทิตี)); } อื่นถ้า (method.getReturnType (). getSimplename (). indexof ("วันที่")! = -1) {attement.setDate (++ i, this.getDate (เมธอด, เอนทิตี)); } อื่นถ้า (method.getReturnType (). getSimplename (). indexof ("inputstream")! = -1) {attement.setasciistream (++ i, this.getBlob (เมธอด, เอนทิตี), 1440); } else {stement.setInt (++ i, this.getInt (วิธีการ, เอนทิตี)); }} // ดำเนินการ conn.execother (คำสั่ง); // closeconn (); } / ** * แก้ไข * / การอัปเดตโมฆะสาธารณะ (t entity) พ่นข้อยกเว้น {string sql = "update" + entity.getClass (). getSimplename (). toLowerCase () + "set"; // รับคอลเลกชัน Objects Method ทั้งหมดของรายการคลาสนี้ <method> list = this.matchpojomethods (เอนทิตี, "รับ"); // วัตถุวิธีการชั่วคราวซึ่งรับผิดชอบในการวนซ้ำวัตถุวิธีแฟชั่น วิธีการ tempMethod = null; // เนื่องจาก ID ไม่จำเป็นต้องแก้ไขเมื่อแก้ไขการเพิ่มพารามิเตอร์ตามลำดับควรย้าย ID ไปยังจุดสิ้นสุด วิธี idmethod = null; Iterator <method> iter = list.iterator (); ในขณะที่ (iter.hasnext ()) {tempMethod = iter.next (); // ถ้าชื่อเมธอดมีสตริง ID และความยาวคือ 2 ถือว่าเป็น ID if (tempmethod.getName (). lastIndexof ("id")! = -1 && tempmethod.getName (). substring (3) .length () == 2) {// บันทึกวัตถุของฟิลด์ ID ลงในตัวแปรและลบในคอลเลกชัน idMethod = tempMethod; iter.remove (); // ถ้าชื่อวิธีการถูกลบออกและสตริง Set/Get ไม่เข้ากันกับ pojo + "id" (กรณีที่ไม่รู้สึก) จะถือว่าเป็น id} อื่นถ้า ((entity.getClass (). getSimplename () + "id") iter.remove (); }} // ย้ายตัวชี้วนซ้ำไปยังตำแหน่งแรก iter = list.iterator (); ในขณะที่ (iter.hasnext ()) {tempMethod = iter.next (); sql + = tempmethod.getName (). substring (3) .toLowerCase () + "=?,"; } // ลบอันสุดท้ายสัญลักษณ์ sql = sql.substring (0, sql.lastindexof (",")); // เพิ่มเงื่อนไข sql + = "โดยที่" + idmethod.getName (). substring (3) .toLowerCase () + "=?"; // sql splicing เสร็จสมบูรณ์, พิมพ์คำสั่ง SQL System.out.println (SQL); คำสั่ง PreparedStatement = this.Connection.prepareStatement (SQL); int i = 0; iter = list.iterator (); ในขณะที่ (iter.hasnext ()) {วิธีการ = iter.next (); // สิ่งนี้เริ่มต้นกำหนดประเภทของค่าส่งคืนเนื่องจากรูปแบบค่าฟิลด์บางรูปแบบจำเป็นต้องเปลี่ยนแปลงเมื่อเก็บไว้ในฐานข้อมูลตัวอย่างเช่นสตริงคำสั่ง SQL คือ '"+abc+"' ถ้า (method.getReturntype (). getSimplename () } อื่นถ้า (method.getReturnType (). getSimplename (). indexof ("วันที่")! = -1) {attement.setstring (++ i, this.getString (วิธีการ, เอนทิตี)); } อื่นถ้า (method.getReturnType (). getSimplename (). indexof ("วันที่")! = -1) {attement.setDate (++ i, this.getDate (เมธอด, เอนทิตี)); } อื่นถ้า (method.getReturnType (). getSimplename (). indexof ("inputstream")! = -1) {attement.setasciistream (++ i, this.getBlob (เมธอด, เอนทิตี), 1440); } else {stement.setInt (++ i, this.getInt (วิธีการ, เอนทิตี)); }} // เพิ่มค่าลงในฟิลด์ ID ถ้า (idmethod.getReturnType (). getSimplename (). indexof ("String")! = -1) {attement.setString (++ i, this.getString (idmethod, เอนทิตี)); } else {stement.setInt (++ i, this.getInt (idMethod, เอนทิตี)); } // เรียกใช้คำสั่ง SQL คำสั่ง ExecuteUpdate (); // ปิดคำสั่ง Object Precompiled.close (); // ปิดการเชื่อมต่อ close (); } / ** * ลบ * / โมฆะสาธารณะลบ (t entity) พ่นข้อยกเว้น {string sql = "ลบจาก" + entity.getClass (). getSimplename (). toLowerCase () + "โดยที่"; // การจัดเก็บวัตถุฟิลด์ด้วยสตริง "ID" เมธอด idmethod = null; // การรับวัตถุฟิลด์ที่มีสตริง "id" รายการ <เมธอด> list = this.matchPojomethods (เอนทิตี, "รับ"); Iterator <method> iter = list.iterator (); ในขณะที่ (iter.hasnext ()) {วิธีการ tempmethod = iter.next (); // ถ้าชื่อเมธอดมีสตริง ID และความยาวคือ 2 ถือว่าเป็น ID if (tempmethod.getName (). lastIndexof ("id")! = -1 && tempmethod.getName (). substring (3) .length () == 2) {// บันทึกวัตถุของฟิลด์ ID ในตัวแปรและลบในชุด idMethod = tempMethod; iter.remove (); // ถ้าชื่อวิธีการถูกลบออกและสตริง Set/Get ไม่เข้ากันกับ pojo + "id" (กรณีที่ไม่รู้สึก) จะถือว่าเป็น id} อื่นถ้า ((entity.getClass (). getSimplename () + "id") iter.remove (); }} sql + = idmethod.getName (). substring (3) .toLowerCase () + "=?"; คำสั่ง PreparedStatement = this.Connection.prepareStatement (SQL); // เพิ่มค่าลงในฟิลด์ ID int i = 0; if (idmethod.getReturnType (). getSimplename (). indexof ("string")! = -1) {attement.setstring (++ i, this.getString (idmethod, เอนทิตี)); } else {stement.setInt (++ i, this.getInt (idMethod, เอนทิตี)); } // ดำเนินการ conn.execother (คำสั่ง); // closeconn (); } / *** Query โดย ID* / Public T FindById (วัตถุวัตถุ) พ่นข้อยกเว้น {String SQL = "SELECT* จาก" + PersistentClass.getSimplename (). TOLOWERCASE () + "โดยที่"; // ใช้ตัวสร้างของคลาสย่อยเพื่อให้ได้ประเภทเฉพาะของประเภทพารามิเตอร์ ตัวอย่างเช่นพื้นฐาน <t> นั่นคือรับประเภทเฉพาะของ t entity = persistentClass.newInstance (); // จัดเก็บวัตถุวิธีการที่เก็บคีย์หลักของ pojo (หรือตารางที่ดำเนินการ) เมธอด idmethod = null; รายการ <method> list = this.matchpojomethods (เอนทิตี, "set"); Iterator <method> iter = list.iterator (); // ตัวกรองเพื่อรับวัตถุวิธีการในขณะที่ (iter.hasnext ()) {วิธีการ tempmethod = iter.next (); if (tempmethod.getName (). indexof ("id")! = -1 && tempmethod.getName (). substring (3) .length () == 2) {idmethod = tempMethod; } อื่นถ้า ((entity.getClass (). getSimplename () + "id"). equalsignorecase (tempmethod.getName (). substring (3))) {idmethod = tempMethod; }} // ตัวอักษรตัวแรกถูกแปลงเป็นตัวพิมพ์เล็ก sql += idmethod.getName (). substring (3,4) .toLowerCase () +idMethod.getName (). substring (4) +"=?"; // หลังจากคำสั่ง encapsulation ให้พิมพ์คำสั่ง SQL System.out.println (SQL); // รับคำสั่งการเชื่อมต่อ PreparedStatement = this.Connection.prepareStatement (SQL); // ตัดสินประเภทของ ID ถ้า (วัตถุอินสแตนซ์ของจำนวนเต็ม) {attement.setint (1, (จำนวนเต็ม) วัตถุ); } else if (object instance string) {stement.setString (1, (สตริง) วัตถุ); } // ดำเนินการ SQL เพื่อรับชุดผลลัพธ์แบบสอบถาม Resultset RS = Conn.ExecQuery (คำสั่ง); // ลงทะเบียนบันทึกลูปกับจำนวนฟิลด์ int i = 0; // ชี้ตัวชี้ไปที่บรรทัดแรกของตัววนซ้ำ iter = list.iterator (); // encapsulate ในขณะที่ (rs.next ()) {ในขณะที่ (iter.hasnext ()) {method method = iter.next (); if (method.getParameterTypes () [0] .getSimplename (). indexof ("string")! = -1) {// เพราะในชุดรายการลำดับของวัตถุวิธีการที่จะดึงข้อมูลไม่สอดคล้องกับลำดับของฐานข้อมูล this.setstring (วิธีการ, เอนทิตี, rs.getString (method.getName (). substring (3) .ToLowerCase ())); } อื่นถ้า (method.getParameterTypes () [0] .getSimplename (). indexof ("วันที่")! = -1) {this.setDate (วิธีการ, เอนทิตี, rs.getDate (method.getName (). substring (3). } อื่นถ้า (method.getParameterTypes () [0] .getSimplename (). indexof ("inputStream")! = -1) {this.setBlob (วิธีการ, เอนทิตี, rs.getBlob (method.getName (). substring (3). } else {this.setint (วิธีการ, เอนทิตี, rs.getInt (method.getName (). substring (3) .toLowerCase ())); }}} // ปิดชุดผลลัพธ์ rs.close (); // ปิดคำสั่ง Object Precompiled.close (); เอนทิตีกลับ; } /*** กรองวัตถุวิธีการทั้งหมดที่มีสตริงขาเข้าในคลาส POJO ปัจจุบันและส่งคืนคอลเลกชันรายการ */รายการส่วนตัว <method> matchpojomethods (t entity, string methodname) {// รับเมธอดวิธีการ POJO เมธอดปัจจุบันทั้งหมด [] เมธอด = entity.getClass (). getDeclaredMethods (); // รายการคอนเทนเนอร์จัดเก็บวัตถุวิธีการทั้งหมดด้วย Get String List <เมธอด> list = new ArrayList <Mething> (); // กรองวัตถุวิธีการทั้งหมดที่มีสตริง Get ในคลาส POJO ปัจจุบันและจัดเก็บไว้ในรายการคอนเทนเนอร์สำหรับ (int index = 0; index <methods.length; index ++) {ถ้า (วิธี [index] .getName (). indexof (methodName)! = -1) {list.add }} รายการส่งคืน; } /*** วิธีการส่งคืนค่าคำสั่ง SQL เมื่อประเภทคือ int หรือจำนวนเต็ม สอดคล้องกับ Get */ Public Integer getInt (วิธีการ, t entity) โยนข้อยกเว้น {return (จำนวนเต็ม) method.invoke (เอนทิตี, วัตถุใหม่ [] {}); } /*** วิธีการส่งคืนค่าแอสเซมบลีคำสั่ง SQL เมื่อประเภทคือสตริง ตัวอย่างเช่น 'ABC' ซึ่งสอดคล้องกับการรับ */ สตริงสาธารณะ getString (วิธีการ, t เอนทิตี) โยนข้อยกเว้น {return (string) method.invoke (เอนทิตี, วัตถุใหม่ [] {}); } /*** วิธีการส่งคืนค่าคำสั่ง SQL ที่ประกอบเมื่อประเภทของหยด สอดคล้องกับ Get */ Public InputStream getBlob (วิธีการ, t entity) พ่นข้อยกเว้น {return (inputStream) method.invoke (เอนทิตี, วัตถุใหม่ [] {}); } / ** * วิธีการส่งคืนค่าคำสั่ง SQL ที่รวบรวมเมื่อประเภทของวันที่สอดคล้องกับการรับ * / วันที่สาธารณะ getDate (วิธีการ, เอนทิตี T) โยนข้อยกเว้น {return (วันที่) วิธีการ (เอนทิตี, วัตถุใหม่ [] {}); } / ** * เมื่อประเภทพารามิเตอร์เป็นจำนวนเต็มหรือ int ให้ตั้งค่าพารามิเตอร์สำหรับฟิลด์เอนทิตีซึ่งสอดคล้องกับชุด * / public integer setint (วิธีการ, เอนทิตี t, integer arg) โยนข้อยกเว้น {return (จำนวนเต็ม) method.invoke (เอนทิตี, วัตถุใหม่ [] {arg}); } / ** * เมื่อประเภทพารามิเตอร์คือสตริงให้ตั้งค่าพารามิเตอร์สำหรับฟิลด์เอนทิตีซึ่งสอดคล้องกับการตั้งค่า * / สตริงสาธารณะ setstring (วิธีการ, เอนทิตี t, สตริง arg) โยนข้อยกเว้น {return (string) method.invoke (เอนทิตี, วัตถุใหม่ [] {arg}); } / ** * เมื่อประเภทพารามิเตอร์คืออินพุตสตรีมให้ตั้งค่าพารามิเตอร์สำหรับฟิลด์เอนทิตีซึ่งสอดคล้องกับชุด * / สาธารณะอินพุต SetBlob (วิธีการเมธอด t เอนทิตี t, อินพุต arg) โยนข้อยกเว้น {return (inputstream) method.invoke (เอนทิตี, วัตถุใหม่ [] {arg}); } / ** * เมื่อประเภทพารามิเตอร์คือวันที่ให้ตั้งค่าพารามิเตอร์สำหรับฟิลด์เอนทิตีซึ่งสอดคล้องกับการตั้งค่า * / วันที่สาธารณะ setDate (วิธีการ, t เอนทิตี, วันที่ arg) โยนข้อยกเว้น {return (วันที่) เมธอด. -พนักงาน dao สืบทอดตามพื้นฐานและสามารถใช้วิธีการคลาสแม่ได้โดยตรงเพิ่มการใช้รหัสซ้ำ
แพ็คเกจ com.employees.dao; นำเข้า java.util.arraylist; นำเข้า java.util.list; นำเข้า com.employees.po.employees; พนักงานชั้นเรียนสาธารณะ กลับมาจริง; } // เพิ่มข้อมูลพนักงานลงในรายการสาธารณะรายการ <SpopainerT> addemployees (int id) พ่นข้อยกเว้น {รายการ <พนักงาน> lstemployees = new ArrayList <MALSPORY> (); พนักงานพนักงาน = FindById (ID); // โหลดข้อมูลที่แนบมาในปัจจุบันลงในวัตถุ lstemployees.add (พนักงาน); return lstemployees; } โมฆะสาธารณะ deleteemp (นิติบุคคลขั้นสุดท้าย) โยนข้อยกเว้น {this.delete (เอนทิตี); } โมฆะสาธารณะอัพเดท updateEmp (นิติบุคคลขั้นสุดท้าย) โยนข้อยกเว้น {this.update (เอนทิตี); -ฉันจะไม่โพสต์รหัสของเลเยอร์ PO ตอนนี้ใช้ Junit4 เพื่อทำการทดสอบ
แพ็คเกจ com.employees.dao; นำเข้า org.junit.test; นำเข้า com.employees.po.employees; พนักงานชั้นเรียนสาธารณะ {@test โมฆะสาธารณะ testadd () โยนข้อยกเว้น {พนักงาน emp = พนักงานใหม่ (); emp.setPname ("tly"); emp.setpsex ("ชาย"); emp.setpbeliefs ("xxxxx"); emp.setpaddr ("tianhe"); emp.setphobby ("เล่นบาสเก็ตบอล"); emp.setPsubject ("คอมพิวเตอร์"); emp.setptel ("123456"); พนักงาน dao dao = new stompowerdao (); dao.addemployees (EMP); } @Test Public Void TestUpDate () โยนข้อยกเว้น {พนักงาน dao = พนักงานใหม่ DAPERSIONDAO (); พนักงาน emp = dao.findbyid (14); emp.setptel ("999999"); dao.updateemp (EMP); } @Test Public Void TestDelete () พ่นข้อยกเว้น {พนักงาน dao = พนักงานใหม่ daomedao (); พนักงาน emp = dao.findbyid (15); dao.deleteemp (EMP); -หลังจากการทดสอบวิธีการทั้งสามนี้สามารถทำงานได้ตามปกติเวลาจะเร่งรีบ มีการใช้รหัสบางอย่างโดยเพื่อนคนอื่น ๆ สถานที่บางแห่งอาจไม่ได้รับการพิจารณาว่าครอบคลุมมากหรือบางรหัสจะซ้ำซ้อน การดำเนินการทั่วไปในอิงตามยังไม่ได้เขียนเต็ม หากเพื่อนคนใดสนใจคุณสามารถเขียนได้อีกครั้งเช่นการสืบค้นการดำเนินการแบทช์ ฯลฯ หากการทดสอบผ่านไปอย่าลืมส่งสำเนามาให้ฉันฮ่าฮ่า
บรรจุภัณฑ์เสริม JDBC ที่เรียบง่ายและทั่วไปข้างต้น (ตัวอย่าง) เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น