應用Java編寫掌握JDBC銜接、履行及封閉的對象類。本站提示廣大學習愛好者:(應用Java編寫掌握JDBC銜接、履行及封閉的對象類)文章只能為提供參考,不一定能成為您想要的結果。以下是應用Java編寫掌握JDBC銜接、履行及封閉的對象類正文
簡略的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(); } }