简单的Java数据库连接和关闭工具类
写JDBC应用的人常常为关闭资源而头痛不已,这些代码枯燥无味,如何才能用简单的代码进行关闭呢,下面我写了一个方法,可以解除你的痛苦:
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;
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();
}
}
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();
}
}
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 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;
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();
}
}
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;
}
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;
}
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);
}
}
public static void executeBatchSQL(Connection conn, List 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;
}
}
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;
}
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语句发生异常!");
}
}
public static void main(String[] args) throws SQLException {
String tns = "jdbc:oracle:thin:@n" +
"(description= n" +
"t(ADDRESS_LIST =n" +
"tt(address=(protocol=tcp)(host=10.87.30.44)(port=1521))n" +
"tt(address=(protocol=tcp)(host=10.87.30.45)(port=1521))n" +
"tt(address=(protocol=tcp)(host=10.87.30.46)(port=1521))n" +
"tt(load_balance=yes)n" +
"t)n" +
"t(connect_data =n" +
"tt(service_name=KFCS)n" +
"tt(failover_mode =n" +
"ttt(type=session)n" +
"ttt(method=basic)n" +
"ttt(retries=5)n" +
"ttt(delay=15)n" +
"tt)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();
}
}