สองวิธีในการสร้างการเชื่อมต่อฐานข้อมูลโดยใช้ JDBC:
1. ใช้ DriverManager ในรหัสเพื่อรับการเชื่อมต่อฐานข้อมูล วิธีนี้ไม่มีประสิทธิภาพและประสิทธิภาพความน่าเชื่อถือและความมั่นคงจะค่อยๆลดลงเมื่อจำนวนผู้ใช้เข้าชมเพิ่มขึ้น
2. ใช้วิธีการกำหนดค่าแหล่งข้อมูลเพื่อเชื่อมต่อกับฐานข้อมูล สาระสำคัญของวิธีนี้คือการเพิ่มพูลการเชื่อมต่อฐานข้อมูลตามวิธีข้างต้นซึ่งมีประสิทธิภาพสูง
มีความแตกต่างต่อไปนี้ระหว่างการเชื่อมต่อกับฐานข้อมูลโดยใช้ DriverManager ในรหัส:
1) พูลการเชื่อมต่อแหล่งข้อมูลคือการเชื่อมต่อกับฐานข้อมูลในโปรแกรม โดยการสอบถามเซิร์ฟเวอร์ JNDI (การตั้งชื่อ Java และอินเทอร์เฟซไดเรกทอรี) นั่นคือการเรียกใช้วิธีการค้นหา () ของอินเทอร์เฟซบริบทเพื่อรับวัตถุแหล่งข้อมูลจากนั้นเรียกใช้วิธี getConnection () ของวัตถุแหล่งข้อมูลเพื่อสร้างการเชื่อมต่อ
2) เพื่อนำวัตถุการเชื่อมต่อฐานข้อมูลกลับมาใช้ใหม่ให้ปรับปรุงเวลาตอบสนองต่อการร้องขอและประสิทธิภาพของเซิร์ฟเวอร์เทคโนโลยีการเชื่อมต่อการเชื่อมต่อจะถูกนำมาใช้ เทคโนโลยีการเชื่อมต่อการเชื่อมต่อสร้างวัตถุการเชื่อมต่อฐานข้อมูลหลายรายการล่วงหน้าจากนั้นบันทึกวัตถุการเชื่อมต่อไปยังกลุ่มการเชื่อมต่อ เมื่อคำขอของลูกค้ามาถึงวัตถุการเชื่อมต่อจะถูกนำออกจากกลุ่มเพื่อให้บริการลูกค้า เมื่อคำขอเสร็จสมบูรณ์โปรแกรมไคลเอนต์จะเรียกวิธีการปิด () และนำวัตถุการเชื่อมต่อกลับเข้าไปในพูล
3) ในการใช้ DriverManager เพื่อรับการเชื่อมต่อฐานข้อมูลในรหัสวัตถุการเชื่อมต่อที่ได้รับจากโปรแกรมไคลเอนต์คือการเชื่อมต่อทางกายภาพ การเรียกใช้วิธีปิด () ของวัตถุการเชื่อมต่อจะปิดการเชื่อมต่อ การใช้เทคโนโลยีการเชื่อมต่อการเชื่อมต่อวัตถุการเชื่อมต่อที่ได้รับจากโปรแกรมไคลเอนต์เป็นที่จับของการเชื่อมต่อทางกายภาพในกลุ่มการเชื่อมต่อ การเรียกวิธีการปิด () ของวัตถุการเชื่อมต่อการเชื่อมต่อทางกายภาพจะไม่ปิด การใช้แหล่งข้อมูลจะลบการเชื่อมต่อระหว่างวัตถุการเชื่อมต่อในโปรแกรมไคลเอนต์และวัตถุการเชื่อมต่อในพูลเท่านั้น
เพื่อการทดสอบความสะดวกคุณสามารถสร้างตารางผู้ใช้ในฐานข้อมูล (ดู MySQL 5 เป็นตัวอย่างที่นี่):
สร้างตาราง `ผู้ใช้ '(` id` int (10) ที่ไม่ได้ลงชื่อไม่ใช่ null auto_increment, `username` varchar (50) ค่าเริ่มต้น null,` รหัสผ่าน' varchar (50) ค่าเริ่มต้น null, `อีเมล 'varchar (50) ค่าเริ่มต้น, คีย์หลัก (` id`),);
นำเข้าแพ็คเกจ JAR ของไดรเวอร์ของฐานข้อมูลลงในไดเรกทอรี LIB ของ TOMCAT (ที่นี่นำ MySQL5 เป็นตัวอย่างแพ็คเกจ JAR ที่ใช้คือ: MySQL-Connector-Java-5.0.8-bin.jar)
1. ใช้ DriverManager ในรหัสเพื่อรับการเชื่อมต่อฐานข้อมูล วิธีนี้ไม่มีประสิทธิภาพและประสิทธิภาพความน่าเชื่อถือและความมั่นคงจะค่อยๆลดลงเมื่อจำนวนผู้ใช้เข้าชมเพิ่มขึ้น
รหัส Java สำหรับการเชื่อมต่อฐานข้อมูล Oracle มีดังนี้:
นำเข้า java.sql.connection; นำเข้า java.sql.drivermanager; / ***รับการเชื่อมต่อฐานข้อมูล*/ คลาสสาธารณะ dbConnection {/ ** oracle ฐานข้อมูลการเชื่อมต่อ url*/ สตริงคงสุดท้ายสุดท้าย db_url = "jdbc: Oracle: Thin:@127.0.0.1: 1521: ORCL"; / ** ไดรเวอร์การเชื่อมต่อฐานข้อมูล Oracle*/ ส่วนตัวสตริงคงสุดท้ายคงที่ db_driver = "oracle.jdbc.driver.oracledriver"; / ** ชื่อผู้ใช้ฐานข้อมูล*/ ส่วนตัวสตริงคงสุดท้ายคงที่ db_username = "root"; / ** รหัสผ่านฐานข้อมูล*/ สตริงคงสุดท้ายของส่วนตัว db_password = "admin"; / *** รับการเชื่อมต่อฐานข้อมูล* @return*/ การเชื่อมต่อสาธารณะ getConnection () {/ ** ประกาศวัตถุการเชื่อมต่อการเชื่อมต่อ*/ การเชื่อมต่อ conn = null; ลอง { / ** ใช้เมธอด class.forName () เพื่อสร้างอินสแตนซ์ของไดรเวอร์นี้โดยอัตโนมัติและเรียกใช้ DriverManager โดยอัตโนมัติเพื่อลงทะเบียน* / class.forName (db_driver); / ** รับการเชื่อมต่อฐานข้อมูลผ่านวิธี driverManager getConnection ()*/ conn = driverManager.getConnection (db_url, db_username, db_password); } catch (exception ex) {ex.printstacktrace (); } return conn; } / *** ปิดการเชื่อมต่อฐานข้อมูล** @param Connect* / public void closeconnection (การเชื่อมต่อ conn) {ลอง {ถ้า (conn! = null) { / ** กำหนดว่าวัตถุการเชื่อมต่อการเชื่อมต่อปัจจุบันไม่ปิดให้เรียกวิธีการปิด* / if (! conn.isclosed ()) {conn.close }}} catch (Exception Ex) {Ex.PrintStackTrace (); -รหัส JSP สำหรับการเชื่อมต่อฐานข้อมูล MySQL มีดังนี้:
<%@page import = "java.sql.*, com.mysql.jdbc.driver"%> <%@page language = "java" contentType = "ข้อความ/html; charset = utf-8" pageencoding = "utf-8"%> <html> class.forName (driver.class.getName ()). newInstance (); string url = "jdbc: mysql: // localhost: 3306/demo? useunicode = true & characterencoding = utf8"; String user = "root"; สตริงรหัสผ่าน = "123"; Connection Conn = driverManager.getConnection (URL, ผู้ใช้, รหัสผ่าน); คำสั่ง stmt = conn.createstatement (); String SQL = "SELECT * จากผู้ใช้"; resultset rs = stmt.executeQuery (SQL); ในขณะที่ (rs.next ()) {out.print ("<br />" + "======================" + "<br />"); out.print (Rs.getLong ("id") + ""); out.print (Rs.getString ("ชื่อผู้ใช้") + ""); out.print (rs.getString ("รหัสผ่าน") + ""); out.print (Rs.getString ("อีเมล") + ""); } %> </body> </html>2. ใช้วิธีการกำหนดค่าแหล่งข้อมูลเพื่อเชื่อมต่อกับฐานข้อมูล สาระสำคัญของวิธีนี้คือการเพิ่มพูลการเชื่อมต่อฐานข้อมูลตามวิธีข้างต้นซึ่งมีประสิทธิภาพสูง
1) รหัส JSP ของพูลการเชื่อมต่อแหล่งข้อมูลฐานข้อมูล MySQL มีดังนี้:
<%@page import = "java.sql.*, javax.naming.*, javax.sql.datasource"%> <%@page language = "java" contentType = "text/html; charset = utf-8" การเริ่มต้น DataSource DS = (DataSource) initctx.lookup ("Java: comp/env/jdbc/demoDB"); การเชื่อมต่อ conn = ds.getConnection (); คำสั่ง stmt = conn.createstatement (); String SQL = "SELECT * จากผู้ใช้"; resultset rs = stmt.executeQuery (SQL); ในขณะที่ (rs.next ()) {out.print ("<br />" + "======================" + "<br />"); out.print (Rs.getLong ("id") + ""); out.print (Rs.getString ("ชื่อผู้ใช้") + ""); out.print (rs.getString ("รหัสผ่าน") + ""); out.print (Rs.getString ("อีเมล") + ""); } %> </body> </html>2) เพิ่มรหัสต่อไปนี้ลงใน server.xml ในไดเรกทอรี COF ของ TOMCAT:
<dexting> <resource name = "JDBC/DEMODB" auth = "container" type = "javax.sql.datasource" driverclassName = "com.mysql.jdbc.driver" url = "jdbc: mysql: // localhost: 3306/demo" username = " maxwait = "10,000" /> </texting>
3) กำหนดค่าเนื้อหาต่อไปนี้ภายใต้โหนดรูทของ web.xml ในไดเรกทอรีเว็บโครงการ:
<resource-ref> <sention> การเชื่อมต่อ MySQLDB </คำอธิบาย> <s res-ref-Name> JDBC/DEMODB </res-ref-Name> <s Res-type> javax.sql.datasource </res-type>
การกำหนดค่าพูลการเชื่อมต่อของแหล่งข้อมูลเสร็จสมบูรณ์ แต่เพื่อปรับปรุงความสามารถในการพกพาของโครงการควรนำเนื้อหาของขั้นตอนที่สองไว้ข้างต้นลงในบริบท xml ของไดเรกทอรี meta-inf ของโครงการ (ไฟล์นี้จะต้องสร้างขึ้นด้วยตัวเอง):
<? XML เวอร์ชัน = "1.0" การเข้ารหัส = "UTF-8"?> <บริบท> <ชื่อทรัพยากร = "JDBC/DEMODB" auth = "container" type = "javax.sql.datasource" drivertrassname = "com.mysql.jdbc.driver" url = "jdb รหัสผ่าน = "123" maxactive = "50" maxidle = "30" maxwait = "10,000" /> </text>
3. คลาสเครื่องมือการทำงานของฐานข้อมูลเมื่อกำหนดค่าพูลการเชื่อมต่อฐานข้อมูลของแหล่งข้อมูล
รหัสมีดังนี้:
แพ็คเกจ db.utils; นำเข้า java.sql.connection; นำเข้า java.sql.preparedStatement; นำเข้า java.sql.resultset; นำเข้า java.sql.resultsetmetadata; นำเข้า java.sql.sqlexception; นำเข้า java.sql.statement; นำเข้า java.text.dateFormat; นำเข้า java.util.arraylist; นำเข้า java.util.date; นำเข้า java.util.hashmap; นำเข้า java.util.list; นำเข้า java.util.map; นำเข้า Javax.naming.initialContext; นำเข้า Javax.sql.Datasource; // นำเข้า org.apache.log4j.logger; /*** การดำเนินการฐานข้อมูลคลาสเสริมคลาส*/คลาสสาธารณะ dbutils {// logger logger แบบคงที่ส่วนตัว = logger.getLogger ("dbutils"); / ** * คำสั่งนี้จะต้องเป็น SQL แทรกอัพเดตหรือลบคำสั่ง * @param sql * @param paramlist: พารามิเตอร์ที่สอดคล้องกับตัวยึดตำแหน่งในคำสั่ง SQL * @return * @throws Exception */ public int execute //logger.info("Parameter ใช้ได้! "); } การเชื่อมต่อ conn = null; PreparedStatement PSTMT = NULL; int result = 0; ลอง {conn = getConnection (); pstmt = dbutils.getPreparedStatement (Conn, SQL); SetPreparedStatementParam (PSTMT, Paramlist); if (pstmt == null) {return -1; } result = pstmt.executeUpdate (); } catch (exception e) {//logger.info (e.getMessage ()); โยนข้อยกเว้นใหม่ (e); } ในที่สุด {CloseStatement (PSTMT); closeconn (Conn); } ผลตอบแทนผลลัพธ์; } / *** แปลงชุดผลลัพธ์ที่ได้จากการสอบถามฐานข้อมูลลงในวัตถุแผนที่* @param SQL: คำสั่งค้นหา* @param paramlist: พารามิเตอร์* @return* / รายการสาธารณะ <แผนที่ <สตริง, วัตถุ >> getQueryList //logger.info("Parameter ใช้ได้! "); คืนค่า null; } การเชื่อมต่อ conn = null; PreparedStatement PSTMT = NULL; ผลลัพธ์ RS = NULL; รายการ <แผนที่ <สตริงวัตถุ >> queryList = null; ลอง {conn = getConnection (); pstmt = dbutils.getPreparedStatement (Conn, SQL); SetPreparedStatementParam (PSTMT, Paramlist); if (pstmt == null) {return null; } rs = getResultSet (PSTMT); queryList = getQueryList (RS); } catch (runtimeException e) {//logger.info (e.getMessage ()); System.out.println ("พารามิเตอร์ถูกต้อง!"); โยนข้อยกเว้นใหม่ (e); } ในที่สุด {CloseSultSet (RS); ใกล้เคียงที่สุด (PSTMT); closeconn (Conn); } return queryList; } โมฆะส่วนตัว setPreparedStatementParam (PreparedStatement PSTMT, รายการ <Ojrop> Paramlist) โยนข้อยกเว้น {ถ้า (pstmt == null || paramlist == null || paramlist.isempty ()) {return; } dateFormat df = dateFormat.getDatEtimeInstance (); สำหรับ (int i = 0; i <paramlist.size (); i ++) {ถ้า (paramlist.get (i) อินสแตนซ์ของจำนวนเต็ม) {int paramValue = ((จำนวนเต็ม) paramlist.get (i)). intValue (); pstmt.setint (i+1, paramValue); } อื่นถ้า (paramlist.get (i) อินสแตนซ์ของลอย) {float paramValue = ((float) paramlist.get (i)). floatValue (); pstmt.setfloat (i+1, paramvalue); } อื่นถ้า (paramlist.get (i) อินสแตนซ์ของสองเท่า) {double paramValue = ((double) paramlist.get (i)). doubleValue (); pstmt.setDouble (i+1, paramValue); } else if (paramlist.get (i) วันที่อินสแตนซ์) {pstmt.setstring (i+1, df.format ((วันที่) paramlist.get (i))); } อื่นถ้า (paramlist.get (i) อินสแตนซ์ยาว) {long paramValue = ((ยาว) paramlist.get (i)). longValue (); pstmt.setLong (i+1, paramValue); } อื่นถ้า (paramlist.get (i) อินสแตนซ์ยาว) {long paramValue = ((ยาว) paramlist.get (i)). longValue (); pstmt.setLong (i+1, paramValue); } อื่นถ้า (paramlist.get (i) string ของสตริง) {pstmt.setstring (i+1, (สตริง) paramlist.get (i)); } } กลับ; } / ** * รับการเชื่อมต่อฐานข้อมูล * @return * @throws Exception * / การเชื่อมต่อส่วนตัว getConnection () พ่นข้อยกเว้น {initialContext cxt = new InitialContext (); DataSource DS = (DataSource) CXT.Lookup (JnDiname); if (ds == null) {โยนข้อยกเว้นใหม่ ("ไม่พบแหล่งข้อมูล!"); } return ds.getConnection (); } ส่วนตัวคงที่ preparedStatement getPreparedStatement (Connection Conn, String SQL) โยนข้อยกเว้น {ถ้า (conn == null || sql == null || sql.trim (). เท่ากับ ("")) {return null; } PreparedStatement pstmt = conn.preparestatement (sql.trim ()); ส่งคืน pstmt; } / ** * รับชุดผลลัพธ์การสืบค้นฐานข้อมูล * @param pstmt * @return * @throws Exception * / private resultset getResultset (PreparedStatement pstmt) โยนข้อยกเว้น {ถ้า (pstmt == null) {return null; } resultset rs = pstmt.executeQuery (); กลับอาร์เอส; } / ** * @param rs * @return * @throws Exception * / รายการส่วนตัว <แผนที่ <String, Object >> getQueryList (Resultset Rs) โยนข้อยกเว้น {ถ้า (rs == null) {return null; } resultsetMetAdata rsmetadata = rs.getMetAdata (); int columnCount = rsmetadata.getColumnCount (); รายการ <map <string, object >> datalist = new ArrayList <แผนที่ <String, Object >> (); ในขณะที่ (rs.next ()) {map <string, object> datamap = new hashmap <string, object> (); สำหรับ (int i = 0; i <columncount; i ++) {datamap.put (rsmetadata.getColumnName (i+1), rs.getObject (i+1)); } datalist.add (datamap); } ส่งคืน Datalist; } / *** ปิดการเชื่อมต่อฐานข้อมูล* @param conn* / โมฆะส่วนตัว closeconn (การเชื่อมต่อ Conn) {ถ้า (conn == null) {return; } ลอง {conn.close (); } catch (sqlexception e) {//logger.info (e.getMessage ()); }} / *** ปิด* @param stmt* / โมฆะส่วนตัวใกล้เคียงกับการใกล้ชิด (คำสั่ง stmt) {ถ้า (stmt == null) {return; } ลอง {stmt.close (); } catch (sqlexception e) {//logger.info (e.getMessage ()); }} / *** ปิด* @param rs* / โมฆะส่วนตัวใกล้ชิด (ผลลัพธ์ RS) {ถ้า (rs == null) {return; } ลอง {rs.close (); } catch (sqlexception e) {//logger.info (e.getMessage ()); }} สตริงส่วนตัว jndiname = "java:/comp/env/jdbc/demodb"; โมฆะสาธารณะ setJnDiname (สตริง jndiname) {this.jndiname = jndiname; -สรุป: ใช้วิธีการกำหนดค่าแหล่งข้อมูลเพื่อเชื่อมต่อกับฐานข้อมูล วิธีนี้มีประสิทธิภาพและมีเสถียรภาพดังนั้นจึงขอแนะนำให้ใช้
หากต้องการดูไวยากรณ์ Java เพิ่มเติมคุณสามารถติดตามได้: "การคิดในคู่มือจีน Java", "JDK 1.7 คู่มือการอ้างอิงอย่างเป็นทางการภาษาอังกฤษ", "JDK 1.6 API Java คู่มืออ้างอิงจีน", "JDK 1.5 API Java คู่มืออ้างอิงจีน" ฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น