使用Java編寫控制JDBC連接、執(zhí)行及關(guān)閉的工具類
簡單的Java數(shù)據(jù)庫連接和關(guān)閉工具類
寫JDBC應(yīng)用的人常常為關(guān)閉資源而頭痛不已,這些代碼枯燥無味,如何才能用簡單的代碼進(jìn)行關(guān)閉呢,下面我寫了一個(gè)方法,可以解除你的痛苦:
/** * 關(guān)閉所有可關(guān)閉資源 * * @param objs 可關(guān)閉的資源對(duì)象有Connection、Statement、ResultSet,別的類型資源自動(dòng)忽略 */ 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); } }
這個(gè)方法,帶了“...”參數(shù),這個(gè)實(shí)際上是Java5中的可變參數(shù)方法??梢圆徽擁樞颍徽搨€(gè)數(shù),調(diào)用時(shí)候直接關(guān)閉想要關(guān)閉的資源對(duì)象就ok了。例如:
catch (SQLException e) { e.printStackTrace(); } finally { DBTools.closeAll(stmt, pstmt1, pstmt2, conn); }
下面給出這個(gè)類完整的寫法:
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數(shù)據(jù)庫連接和關(guān)閉工具類 * * @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(); } } /** * 創(chuàng)建一個(gè)JDBC連接 * * @return 一個(gè)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(); } } /** * 關(guān)閉所有可關(guān)閉資源 * * @param objs 可關(guān)閉的資源對(duì)象有Connection、Statement、ResultSet,別的類型資源自動(dòng)忽略 */ 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); } } }
因?yàn)槭窃趯懝ぞ?,連接用到的次數(shù)很少,所以這里采用jdbc模式創(chuàng)建,而沒有用到連接池。關(guān)閉方法用起來很爽,減少了代碼量,也提高了程序的可靠性和質(zhì)量。
一個(gè)簡單的JDBC通用工具
支持多種數(shù)據(jù)庫,統(tǒng)一方式產(chǎn)生連接,最優(yōu)化、最簡單方式釋放資源。
歡迎拍磚!
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.sql.*; import java.util.List; import java.util.Properties; /** * 通用數(shù)據(jù)庫操作工具,提供數(shù)據(jù)庫連接獲取、SQL執(zhí)行、資源關(guān)閉等功能,支持的數(shù)據(jù)庫為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("加載數(shù)據(jù)庫驅(qū)動(dòng)發(fā)生錯(cuò)誤!"); e.printStackTrace(); } } /** * 創(chuàng)建一個(gè)數(shù)據(jù)庫連接 * * @param url 數(shù)據(jù)庫連接URL串 * @param properties 作為連接參數(shù)的任意字符串標(biāo)記/值對(duì)的列表;通常至少應(yīng)該包括 "user" 和 "password" 屬性 * @return 一個(gè)JDBC的數(shù)據(jù)庫連接 * @throws SQLException 獲取連接失敗時(shí)候拋出 */ public static Connection makeConnection(String url, Properties properties) throws SQLException { Connection conn = null; try { conn = DriverManager.getConnection(url, properties); } catch (SQLException e) { log.error("獲取數(shù)據(jù)庫連接發(fā)生異常", e); throw e; } return conn; } /** * 在一個(gè)數(shù)據(jù)庫連接上執(zhí)行一個(gè)靜態(tài)SQL語句查詢 * * @param conn 數(shù)據(jù)庫連接 * @param staticSql 靜態(tài)SQL語句字符串 * @return 返回查詢結(jié)果集ResultSet對(duì)象 * @throws SQLException 執(zhí)行異常時(shí)候拋出 */ public static ResultSet executeQuery(Connection conn, String staticSql) throws SQLException { ResultSet rs = null; try { //創(chuàng)建執(zhí)行SQL的對(duì)象 Statement stmt = conn.createStatement(); //執(zhí)行SQL,并獲取返回結(jié)果 rs = stmt.executeQuery(staticSql); } catch (SQLException e) { log.error("執(zhí)行SQL語句出錯(cuò),請(qǐng)檢查!\n" + staticSql); throw e; } return rs; } /** * 在一個(gè)數(shù)據(jù)庫連接上執(zhí)行一個(gè)靜態(tài)SQL語句 * * @param conn 數(shù)據(jù)庫連接 * @param staticSql 靜態(tài)SQL語句字符串 * @throws SQLException 執(zhí)行異常時(shí)候拋出 */ public static void executeSQL(Connection conn, String staticSql) throws SQLException { Statement stmt = null; try { //創(chuàng)建執(zhí)行SQL的對(duì)象 stmt = conn.createStatement(); //執(zhí)行SQL,并獲取返回結(jié)果 stmt.execute(staticSql); } catch (SQLException e) { log.error("執(zhí)行SQL語句出錯(cuò),請(qǐng)檢查!\n" + staticSql); throw e; } finally { close(stmt); } } /** * 在一個(gè)數(shù)據(jù)庫連接上執(zhí)行一批靜態(tài)SQL語句 * * @param conn 數(shù)據(jù)庫連接 * @param sqlList 靜態(tài)SQL語句字符串集合 * @throws SQLException 執(zhí)行異常時(shí)候拋出 */ public static void executeBatchSQL(Connection conn, List<String> sqlList) throws SQLException { try { //創(chuàng)建執(zhí)行SQL的對(duì)象 Statement stmt = conn.createStatement(); for (String sql : sqlList) { stmt.addBatch(sql); } //執(zhí)行SQL,并獲取返回結(jié)果 stmt.executeBatch(); } catch (SQLException e) { log.error("執(zhí)行批量SQL語句出錯(cuò),請(qǐng)檢查!"); throw e; } } /** * 獲取Oracle數(shù)據(jù)一個(gè)指定的Sequence下一個(gè)值 * * @param conn 數(shù)據(jù)庫連接 * @param seq_name Sequence名稱 * @return Sequence下一個(gè)值 */ public static long sequenceNextval(Connection conn, String seq_name) { long val = -1L; Statement stmt = null; ResultSet rs = null; try { //創(chuàng)建執(zhí)行SQL的對(duì)象 stmt = conn.createStatement(); //執(zhí)行SQL,并獲取返回結(jié)果 rs = stmt.executeQuery("select " + seq_name + ".nextval from dual"); if (rs.next()) val = rs.getLong(1); } catch (SQLException e) { log.error("#ERROR# :獲取Sequence值出錯(cuò),請(qǐng)檢查!\n" + seq_name); e.printStackTrace(); throw new RuntimeException(e); } finally { close(rs); close(stmt); } return val; } /** * 關(guān)閉所有可關(guān)閉的JDBC資源,不論先后順序,總能以正確的順序執(zhí)行 * * @param objs 可關(guān)閉的資源對(duì)象有Connection、Statement、ResultSet,別的類型資源自動(dòng)忽略 */ 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("關(guān)閉數(shù)據(jù)庫連接發(fā)生異常!"); } } private static void close(ResultSet rs) { if (rs != null) try { rs.close(); } catch (SQLException e) { log.error("關(guān)閉結(jié)果集發(fā)生異常!"); } } private static void close(Statement stmt) { if (stmt != null) try { stmt.close(); } catch (SQLException e) { log.error("關(guān)閉SQL語句發(fā)生異常!"); } } /** * 測試代碼,沒用 * * @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(); } }
- jdbc+jsp實(shí)現(xiàn)簡單員工管理系統(tǒng)
- Mybatis工具類JdbcTypeInterceptor運(yùn)行時(shí)自動(dòng)添加jdbcType屬性
- java使用jdbc連接數(shù)據(jù)庫工具類和jdbc連接mysql數(shù)據(jù)示例
- JDBC自定義連接池過程詳解
- java數(shù)據(jù)庫開發(fā)之JDBC基礎(chǔ)使用方法及實(shí)例詳解
- jdbcTemplate使用方法實(shí)例解析
- 5分鐘快速學(xué)會(huì)spring boot整合JdbcTemplate的方法
- Java JDBC導(dǎo)致的反序列化攻擊原理解析
- 如何使用JDBC實(shí)現(xiàn)工具類抽取
相關(guān)文章
Java多線程中的CountDownLatch詳細(xì)解讀
這篇文章主要介紹了Java多線程中的CountDownLatch詳細(xì)解讀,一個(gè)同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個(gè)或多個(gè)線程一直等待,用給定的計(jì)數(shù) 初始化 CountDownLatch,需要的朋友可以參考下2023-11-11spring框架下@value注解屬性static無法獲取值問題
這篇文章主要介紹了spring框架下@value注解屬性static無法獲取值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11springboot項(xiàng)目啟動(dòng)的時(shí)候參數(shù)無效的解決
這篇文章主要介紹了springboot項(xiàng)目啟動(dòng)的時(shí)候參數(shù)無效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Springboot如何使用mybatis實(shí)現(xiàn)攔截SQL分頁
這篇文章主要介紹了Springboot使用mybatis實(shí)現(xiàn)攔截SQL分頁,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06SpringBoot整合Spring Security構(gòu)建安全的Web應(yīng)用
pring Security是一個(gè)強(qiáng)大的身份驗(yàn)證和訪問控制框架,本文主要介紹了SpringBoot整合Spring Security構(gòu)建安全的Web應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01MyBatis注解實(shí)現(xiàn)動(dòng)態(tài)SQL問題
這篇文章主要介紹了MyBatis注解實(shí)現(xiàn)動(dòng)態(tài)SQL問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02