使用Java編寫控制JDBC串連、執行及關閉的工具類_java

來源:互聯網
上載者:User

簡單的Java資料庫連接和關閉工具類
 
寫JDBC應用的人常常為關閉資源而頭痛不已,這些代碼枯燥無味,如何才能用簡單的代碼進行關閉呢,下面我寫了一個方法,可以解除你的痛苦:

   /**    * 關閉所有可關閉資源    *    * @param objs 可關閉的資來源物件有Connection、Statement、ResultSet,別的類型資源自動忽略    */   public static void closeAll(Object... objs) {     for (Object obj : objs) {       if (obj instanceof Connection) close((Connection) obj);       if (obj instanceof Statement) close((Statement) obj);       if (obj instanceof ResultSet) close((ResultSet) obj);     }   } 

這個方法,帶了“...”參數,這個實際上是Java5中的可變參數方法。可以不論順序,不論個數,調用時候直接關閉想要關閉的資來源物件就ok了。例如:
 

catch (SQLException e) {       e.printStackTrace();     } finally {       DBTools.closeAll(stmt, pstmt1, pstmt2, conn);     }

 
下面給出這個類完整的寫法:

package com.lavasoft.ibatistools.common; import com.lavasoft.ibatistools.bean.Table; import com.lavasoft.ibatistools.metadata.DataSourceMetaData; import com.lavasoft.ibatistools.metadata.MySQLDataSourceMetaData; import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.List; import java.util.Properties; /** * 簡單的Java資料庫連接和關閉工具類 * * @author leizhimin 11-12-20 下午4:32 */ public class DBTools {   private static String driverClassName, url, user, password;   static {     init();   }   private static void init() {     InputStream in = DBTools.class.getResourceAsStream("/com/lavasoft/ibatistools/jdbc.properties");     Properties preps = new Properties();     try {       preps.load(in);       driverClassName = preps.getProperty("jdbc.driver");       url = preps.getProperty("jdbc.url");       user = preps.getProperty("jdbc.username");       password = preps.getProperty("jdbc.password");     } catch (IOException e) {       e.printStackTrace();     }   }   /**    * 建立一個JDBC串連    *    * @return 一個JDBC串連    */   public static Connection makeConnection() {     Connection conn = null;     try {       Class.forName(driverClassName);       conn = DriverManager.getConnection(url, user, password);     } catch (ClassNotFoundException e) {       e.printStackTrace();     } catch (SQLException e) {       e.printStackTrace();     }     return conn;   }   public static void close(Connection conn) {     if (conn != null)       try {         conn.close();       } catch (SQLException e) {         e.printStackTrace();       }   }   public static void close(ResultSet rs) {     if (rs != null)       try {         rs.close();       } catch (SQLException e) {         e.printStackTrace();       }   }   public static void close(Statement stmt) {     if (stmt != null)       try {         stmt.close();       } catch (SQLException e) {         e.printStackTrace();       }   }   /**    * 關閉所有可關閉資源    *    * @param objs 可關閉的資來源物件有Connection、Statement、ResultSet,別的類型資源自動忽略    */   public static void closeAll(Object... objs) {     for (Object obj : objs) {       if (obj instanceof Connection) close((Connection) obj);       if (obj instanceof Statement) close((Statement) obj);       if (obj instanceof ResultSet) close((ResultSet) obj);     }   }   public static void main(String[] args) {     DataSourceMetaData dbmd = MySQLDataSourceMetaData.instatnce();     List<Table> tableList = dbmd.getAllTableMetaData(DBTools.makeConnection());     for (Table table : tableList) {       System.out.println(table);     }   } }

 
因為是在寫工具,串連用到的次數很少,所以這裡採用jdbc模式建立,而沒有用到串連池。關閉方法用起來很爽,減少了代碼量,也提高了程式的可靠性和品質。


一個簡單的JDBC通用工具
 
支援多種資料庫,統一方式產生串連,最佳化、最簡單方式釋放資源。
 
歡迎拍磚!
 

import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.sql.*; import java.util.List; import java.util.Properties; /** * 通用資料庫操作工具,提供資料庫連接擷取、SQL執行、資源關閉等功能,支援的資料庫為Oracle10g、MySQL5.x。</P> * * @author leizhimin 2012-03-05 11:22 */ public class DBToolkit {   private static Log log = LogFactory.getLog(DBToolkit.class);   static {     try {       Class.forName("oracle.jdbc.driver.OracleDriver");       Class.forName("com.mysql.jdbc.Driver");     } catch (ClassNotFoundException e) {       log.error("載入資料庫驅動發生錯誤!");       e.printStackTrace();     }   }   /**    * 建立一個資料庫連接    *    * @param url    資料庫連接URL串    * @param properties 作為串連參數的任一字元串標記/值對的列表;通常至少應該包括 "user" 和 "password" 屬性    * @return 一個JDBC的資料庫連接    * @throws SQLException 擷取串連失敗時候拋出    */   public static Connection makeConnection(String url, Properties properties) throws SQLException {     Connection conn = null;     try {       conn = DriverManager.getConnection(url, properties);     } catch (SQLException e) {       log.error("擷取資料庫連接發生異常", e);       throw e;     }     return conn;   }   /**    * 在一個資料庫連接上執行一個靜態SQL語句查詢    *    * @param conn   資料庫連接    * @param staticSql 靜態SQL語句字串    * @return 返回查詢結果集ResultSet對象    * @throws SQLException 執行異常時候拋出    */   public static ResultSet executeQuery(Connection conn, String staticSql) throws SQLException {     ResultSet rs = null;     try {       //建立執行SQL的對象       Statement stmt = conn.createStatement();       //執行SQL,並擷取返回結果       rs = stmt.executeQuery(staticSql);     } catch (SQLException e) {       log.error("執行SQL語句出錯,請檢查!\n" + staticSql);       throw e;     }     return rs;   }   /**    * 在一個資料庫連接上執行一個靜態SQL語句    *    * @param conn   資料庫連接    * @param staticSql 靜態SQL語句字串    * @throws SQLException 執行異常時候拋出    */   public static void executeSQL(Connection conn, String staticSql) throws SQLException {     Statement stmt = null;     try {       //建立執行SQL的對象       stmt = conn.createStatement();       //執行SQL,並擷取返回結果       stmt.execute(staticSql);     } catch (SQLException e) {       log.error("執行SQL語句出錯,請檢查!\n" + staticSql);       throw e;     } finally {       close(stmt);     }   }   /**    * 在一個資料庫連接上執行一批靜態SQL語句    *    * @param conn  資料庫連接    * @param sqlList 靜態SQL語句字串集合    * @throws SQLException 執行異常時候拋出    */   public static void executeBatchSQL(Connection conn, List<String> sqlList) throws SQLException {     try {       //建立執行SQL的對象       Statement stmt = conn.createStatement();       for (String sql : sqlList) {         stmt.addBatch(sql);       }       //執行SQL,並擷取返回結果       stmt.executeBatch();     } catch (SQLException e) {       log.error("執行批量SQL語句出錯,請檢查!");       throw e;     }   }   /**    * 擷取Oracle資料一個指定的Sequence下一個值    *    * @param conn   資料庫連接    * @param seq_name Sequence名稱    * @return Sequence下一個值    */   public static long sequenceNextval(Connection conn, String seq_name) {     long val = -1L;     Statement stmt = null;     ResultSet rs = null;     try {       //建立執行SQL的對象       stmt = conn.createStatement();       //執行SQL,並擷取返回結果       rs = stmt.executeQuery("select " + seq_name + ".nextval from dual");       if (rs.next()) val = rs.getLong(1);     } catch (SQLException e) {       log.error("#ERROR# :擷取Sequence值出錯,請檢查!\n" + seq_name);       e.printStackTrace();       throw new RuntimeException(e);     } finally {       close(rs);       close(stmt);     }     return val;   }   /**    * 關閉所有可關閉的JDBC資源,不論先後順序,總能以正確的順序執行    *    * @param objs 可關閉的資來源物件有Connection、Statement、ResultSet,別的類型資源自動忽略    */   public static void closeAll(Object... objs) {     for (Object obj : objs)       if (obj instanceof ResultSet) close((ResultSet) obj);     for (Object obj : objs)       if (obj instanceof Statement) close((Statement) obj);     for (Object obj : objs)       if (obj instanceof Connection) close((Connection) obj);   }   private static void close(Connection conn) {     if (conn != null)       try {         conn.close();       } catch (SQLException e) {         log.error("關閉資料庫連接發生異常!");       }   }   private static void close(ResultSet rs) {     if (rs != null)       try {         rs.close();       } catch (SQLException e) {         log.error("關閉結果集發生異常!");       }   }   private static void close(Statement stmt) {     if (stmt != null)       try {         stmt.close();       } catch (SQLException e) {         log.error("關閉SQL語句發生異常!");       }   }   /**    * 測試代碼,沒用    *    * @param args    * @throws SQLException    */   public static void main(String[] args) throws SQLException {     String tns = "jdbc:oracle:thin:@\n" +         "(description= \n" +         "\t(ADDRESS_LIST =\n" +         "\t\t(address=(protocol=tcp)(host=10.87.30.44)(port=1521))\n" +         "\t\t(address=(protocol=tcp)(host=10.87.30.45)(port=1521))\n" +         "\t\t(address=(protocol=tcp)(host=10.87.30.46)(port=1521))\n" +         "\t\t(load_balance=yes)\n" +         "\t)\n" +         "\t(connect_data =\n" +         "\t\t(service_name=KFCS)\n" +         "\t\t(failover_mode =\n" +         "\t\t\t(type=session)\n" +         "\t\t\t(method=basic)\n" +         "\t\t\t(retries=5)\n" +         "\t\t\t(delay=15)\n" +         "\t\t)\n" +         "\t)\n" +         ")";     Properties p_ora = new Properties();     p_ora.put("user", "base");     p_ora.put("password", "1qaz!QAZ");     p_ora.put("internal_logon", "normal");     Connection ora_conn = makeConnection(tns, p_ora);     ResultSet rs1 = ora_conn.createStatement().executeQuery("select count(1) from base.cfg_static_data");     rs1.next();     System.out.println(rs1.getInt(1));     rs1.close();     ora_conn.close();     Properties p_mysql = new Properties();     p_mysql.put("user", "root");     p_mysql.put("password", "leizm");     String url = "jdbc:mysql://localhost:3306/tdmc";     Connection mysql_conn = makeConnection(url, p_mysql);     ResultSet rs2 = mysql_conn.createStatement().executeQuery("select count(1) from cfg_code");     rs2.next();     System.out.println(rs2.getInt(1));     rs2.close();     mysql_conn.close();   } }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.