طريقتان لإنشاء اتصال قاعدة البيانات باستخدام JDBC:
1. استخدم DriverManager في الكود للحصول على اتصال قاعدة البيانات. هذه الطريقة غير فعالة وتناقص أدائها وموثوقيتها واستقرارها تدريجياً مع زيادة عدد زيارات المستخدمين.
2. استخدم طريقة تكوين مصادر البيانات للاتصال بقاعدة البيانات. يتمثل جوهر هذه الطريقة في إضافة تجمع اتصال قاعدة بيانات استنادًا إلى الطريقة المذكورة أعلاه ، وهو فعال للغاية.
هناك الفرق التالي بين الاتصال بقاعدة بيانات باستخدام drivermanager في الكود:
1) تجمع اتصال مصدر البيانات هو الاتصال بقاعدة البيانات في البرنامج. من خلال الاستعلام عن خادم JNDI (Java Naming and Directory Interface) ، أي استدعاء طريقة Lookup () لواجهة السياق للحصول على كائن DataSource ، ثم استدعاء طريقة getConnection () لكائن DataSource لإنشاء اتصال.
2) من أجل إعادة استخدام كائنات اتصال قاعدة البيانات ، وتحسين وقت الاستجابة للطلبات وأداء الخادم ، يتم اعتماد تقنية تجميع الاتصالات. تقوم تقنية تجميع الاتصالات بإنشاء كائنات اتصال متعددة قاعدة بيانات مقدمًا ، ثم تقوم بحفظ كائن الاتصال إلى تجمع الاتصال. عندما يأتي طلب العميل ، يتم إخراج كائن اتصال من التجمع لخدمة العميل. عند اكتمال الطلب ، يقوم برنامج العميل باستدعاء طريقة Close () ويعيد كائن الاتصال إلى التجمع.
3) في طريقة استخدام DriverManager للحصول على اتصالات قاعدة البيانات في الكود ، فإن كائن الاتصال الذي تم الحصول عليه بواسطة برنامج العميل هو اتصال فعلي. سيؤدي استدعاء طريقة Close () لكائن الاتصال إلى إغلاق الاتصال. باستخدام تقنية تجميع الاتصال ، فإن كائن الاتصال الذي تم الحصول عليه بواسطة برنامج العميل هو مقبض للاتصال الفعلي في تجمع الاتصال. استدعاء طريقة Close () لكائن الاتصال ، لا يتم إغلاق الاتصال المادي. يقوم تنفيذ مصدر البيانات بحذف الاتصال بين كائن الاتصال في برنامج العميل وكائن الاتصال في التجمع.
لاختبار الراحة ، يمكنك إنشاء جدول مستخدم في قاعدة البيانات (انظر MySQL 5 كمثال هنا):
قم بإنشاء جدول `user` (`id` int (10) غير موقّع غير موقّع auto_increment ،` username` varchar (50) الافتراضي الفارغ ، `password` varchar (50) null null ،` email` varchar (50) null ، المفتاح الأساسي (`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 Database Connection URL*/ Private Final Static String DB_URL = "JDBC: Oracle: Thin:@127.0.0.1: 1521: Orcl" ؛ / ** Oracle Database Connection Driver*/ Private Final Static String db_driver = "Oracle.jdbc.driver.oracledriver" ؛ / ** Database اسم المستخدم*/ السلسلة الثابتة النهائية الخاصة DB_USERNAME = "ROOT" ؛ / ** كلمة مرور قاعدة البيانات*/ السلسلة الثابتة النهائية الخاصة db_password = "admin" ؛ / *** احصل على اتصال قاعدة البيانات* regurn*/ اتصال عام getConnection () {/ ** إعلان كائن اتصال الاتصال*/ connection conn = null ؛ جرب { / ** استخدم طريقة class.forname () لإنشاء مثيل لهذا السائق تلقائيًا واتصل تلقائيًا drivermanager بتسجيله* / class.forname (db_driver) ؛ / ** احصل على اتصال قاعدة البيانات من خلال طريقة drivermanager getConnection ()*/ conn = drivermanager.getConnection (db_url ، db_username ، db_password) ؛ } catch (استثناء ex) {ex.printStackTrace () ؛ } return conn ؛ } / *** أغلق اتصال قاعدة البيانات** param connect* / public void closeConnection (connection conn) {try {if (conn! = null) { / ** حدد أن كائن الاتصال الحالي غير مغلق ، اتصل بالطريقة الإغلاق* / if (! conn.isclosed ()) {conn.close () ؛ }}} catch (استثناء ex) {ex.printStackTrace () ؛ }}}رمز JSP لاتصال قاعدة بيانات MySQL كما يلي:
<٪@page import = "java.sql.*، com.mysql.jdbc.driver" ٪> <٪@page language = "java" contentType = "text/html ؛ charset = utf-8" pageencoding = "utf-8" ٪> <html> <vody> <dal //com.mysql.jdbc.jdbcy class.forname (driver.class.getName ()). newInstance () ؛ url url = "jdbc: mysql: // localhost: 3306/demo؟ useUnicode = true & directionDing = utf8" ؛ string user = "root" ؛ سلسلة كلمة المرور = "123" ؛ Connection conn = drivermanager.getConnection (url ، المستخدم ، كلمة المرور) ؛ بيان stmt = conn.createstatement () ؛ String SQL = "SELECT * from user" ؛ resultset rs = stmt.executequery (SQL) ؛ بينما (rs.next ()) {out.print ("<br />" + "====================" + "<br />") ؛ out.print (rs.getLong ("id") + "") ؛ Out.print (rs.getString ("username") + "") ؛ out.print (rs.getString ("password") + "") ؛ 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" pageencoding = "utf-8" ٪> <html> DataSource ds = (dataSource) initctx.lookup ("java: comp/env/jdbc/demodb") ؛ Connection conn = ds.getConnection () ؛ بيان stmt = conn.createstatement () ؛ String SQL = "SELECT * from user" ؛ resultset rs = stmt.executequery (SQL) ؛ بينما (rs.next ()) {out.print ("<br />" + "====================" + "<br />") ؛ out.print (rs.getLong ("id") + "") ؛ Out.print (rs.getString ("username") + "") ؛ out.print (rs.getString ("password") + "") ؛ Out.print (rs.getString ("البريد الإلكتروني") + "") ؛ } ٪> </body> </html>2) أضف الكود التالي إلى server.xml في دليل conf من tomcat:
<context> <resource name = "jdbc/demodb" auth = "container" type = "javax.sql.datasource" driverClassName = "com.mysql.jdbc.driver maxwait = "10000" /> </sectext>
3) تكوين المحتوى التالي ضمن عقدة الجذر لـ Web.xml في دليل مشروع الويب:
<Sroff-REF> <Description> MySQLDB Connection </description> <red-ref-name> JDBC/DEMODB </res-ref-name> <red-type> javax.sql.dataSource </s-type> <red-auth> حاوية </res-auth> </rossersion-ref>
تم الانتهاء من تكوين مجموعة الاتصال لمصدر البيانات ، ولكن من أجل تحسين قابلية نقل المشروع ، من الأفضل وضع محتوى الخطوة الثانية أعلاه في السياق. xml من دليل التعريف للمشروع (يجب إنشاء هذا الملف بمفرده):
<؟ username = "root" password = "123" maxactive = "50" maxidle = "30"
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 ؛ // import org.apache.log4j.logger ؛ /*** عملية قاعدة البيانات الفئة المساعدة*/الفئة العامة dbutils {// private static logger = logger.getLogger ("dbutils") ؛ / ** * يجب أن يكون هذا البيان عبارة عن إدراج SQL أو تحديث أو حذف البيانات * param sql * param paramlist: المعلمة ، المقابلة مع العنصر النائب في عبارة sql * regurn * @therws استثناء */ public int execute (string sql ، rip //logger.info(" Parameter صالحة! ") ؛ } connection conn = null ؛ ReparedStatement PSTMT = NULL ؛ int النتيجة = 0 ؛ حاول {conn = getConnection () ؛ PSTMT = dBUtils.getPreparedStatement (Conn ، SQL) ؛ setPreparedStatementParam (PSTMT ، ParamList) ؛ if (pstmt == null) {return -1 ؛ } النتيجة = pstmt.executeupdate () ؛ } catch (استثناء e) {//logger.info (e.getMessage ()) ؛ رمي استثناء جديد (هـ) ؛ } أخيرًا {exerestatement (pstmt) ؛ CloseConn (conn) ؛ } نتيجة الإرجاع ؛ } / *** قم بتحويل مجموعة النتائج التي تم الحصول عليها عن طريق الاستعلام عن قاعدة البيانات في كائن خريطة* param sql: Query عبارة* param paramlist: المعلمة* regurn* / public list <map <string ، object >> getQuery (string sql ، rip //logger.info(" Parameter صالحة! ") ؛ العودة لاغية. } connection conn = null ؛ ReparedStatement PSTMT = NULL ؛ resultset rs = null ؛ قائمة <map <string ، object >> 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 ("المعلمة صالحة!") ؛ رمي استثناء جديد (هـ) ؛ } أخيرًا {exereresultset (rs) ؛ الاقتراب (PSTMT) ؛ CloseConn (conn) ؛ } return QueryList ؛ } private void setPrepedStatementParam (preparedStatement PSTMT ، قائمة <Object> paramlist) يلقي الاستثناء {if (pstmt == null || paramlist == null || paramlist.isempty ()) {return ؛ } dateFormat df = dateFormat.getDateTimeInstance () ؛ لـ (int i = 0 ؛ i <paramlist.size () ؛ i ++) {if (paramlist.get (i) intaeof integer) {int paramvalue = ((integer) paramlist.get (i)). intvalue () ؛ pstmt.setint (i+1 ، paramvalue) ؛ } آخر if (paramlist.get (i) easuleof float) {float paramvalue = ((float) paramlist.get (i)). floatvalue () ؛ pstmt.setFloat (i+1 ، paramvalue) ؛ } آخر إذا (paramlist.get (i) مثيل من double) {double paramValue = ((double) paramlist.get (i)). doublevalue () ؛ pstmt.setDouble (i+1 ، paramvalue) ؛ } آخر إذا (paramlist.get (i) dateof date) {pStMt.SetString (i+1 ، df.format ((date) paramlist.get (i))) ؛ } آخر إذا (paramlist.get (i) easuleof long) {long paramValue = ((long) paramList.get (i)). longvalue () ؛ pStMt.SetLong (i+1 ، paramvalue) ؛ } آخر إذا (paramlist.get (i) easuleof long) {long paramValue = ((long) paramList.get (i)). longvalue () ؛ pStMt.SetLong (i+1 ، paramvalue) ؛ } آخر إذا (paramlist.get (i) estructionof string) {pStMt.SetString (i+1 ، (string) paramlist.get (i)) ؛ } } يعود؛ } / ** * احصل على اتصال قاعدة البيانات * REGRURN * Throws استثناء * / اتصال خاص getConnection () يلقي استثناء {initialContext cxt = new initialContext () ؛ Datasource ds = (datasource) cxt.lookup (jndiname) ؛ إذا (ds == null) {رمي استثناء جديد ("لم يتم العثور على مصدر البيانات!") ؛ } return ds.getConnection () ؛ } private static reparedStatement getPreparedStatement (connection conn ، string sql) يرمي استثناء {if (conn == null || sql == null || sql.trim (). equals ("")) {return null ؛ } preparedStatement pStMt = conn.preparestatement (sql.trim ()) ؛ إرجاع PSTMT ؛ } / ** * الحصول على مجموعة نتائج استعلام قاعدة البيانات * param pstmt * return * throws استثناء * / private resultset getResultset (preparedStatement pstmt) يلقي استثناء {if (pstmt == null) {return null ؛ } resultset rs = pstmt.executequery () ؛ إرجاع روبية ؛ } / ** * param rs * return * @throws استثناء * / قائمة خاصة <map <string ، object >> getQueryList (resultset rs) يلقي الاستثناء {if (rs == null) {return null ؛ } resultSetMetAdata rsmetadata = rs.getMetAdata () ؛ int columnCount = rsmetadata.getColumnCount () ؛ قائمة <map <string ، object >> datalist = new ArrayList <map <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* / private void closeConn (connection conn) {if (conn == null) {return ؛ } حاول {conn.close () ؛ } catch (sqlexception e) {//logger.info (e.getMessage ()) ؛ }} / *** إغلاق* param stmt* / private void closeStatement (بيان stmt) {if (stmt == null) {return ؛ } جرب {stmt.close () ؛ } catch (sqlexception e) {//logger.info (e.getMessage ()) ؛ }} / *** إغلاق* param rs* / private void closeresultset (resultset rs) {if (rs == null) {return ؛ } حاول {rs.close () ؛ } catch (sqlexception e) {//logger.info (e.getMessage ()) ؛ }} سلسلة خاصة jndiname = "java:/comp/env/jdbc/demodb" ؛ public void setjndiname (string jndiname) {this.jndiname = jndiname ؛ }}ملخص: استخدم طريقة تكوين مصادر البيانات للاتصال بقاعدة البيانات. هذه الطريقة فعالة ومستقرة ، لذلك يوصى باستخدامها.
لعرض المزيد من بناء جملة Java ، يمكنك متابعة: "التفكير في Java Chinese Manual" ، "JDK 1.7 المرجعية النسخة الإنجليزية الرسمية" ، "JDK 1.6 API Java الصينية المرجعية" ، "JDK 1.5 API Java الصينية المرجعية". آمل أيضًا أن يدعم الجميع wulin.com أكثر.