package com.swliu.jt.utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* JDBC工具类
*/
public class JDBCUtils {
/**
* 私有化构造函数:防止别人创建该类的实例
*/
private JDBCUtils() {}
/**
* 创建c3p0连接池实例
*/
private static ComboPooledDataSource pool = new ComboPooledDataSource();
/**
* 用于从连接池中获取一个连接对象并返回
* @return Connection 连接对象
* @throws Exception
*/
public static Connection getConnection() throws SQLException {
try {
return pool.getConnection();
} catch (SQLException e) {
e.printStackTrace();
throw e;//此处不用通知用户服务器内部出错
}
}
/**
* 提供close方法, 用于释放资源
* @param conn 连接对象
* @param stat 传输器对象Statement/PreparedStatement
* @param rs 结果集对象
*/
public static void close(Connection conn, Statement stat,ResultSet rs) {
if(rs != null ){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();//此处不用通知用户服务器内部出错
} finally{
rs = null;
}
}
if(stat != null ){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();//此处不用通知用户服务器内部出错
} finally{
stat = null;
}
}
//释放连接对象
if(conn != null ){
try {
/*conn.close()具体是关闭连接还是归还连接,需要看Connection对象是从哪里来的,
* (1)如果是自己通过数据库获取的连接对象,就是原生的连接,conn.close()就是关闭连接;
* 例如:DriverManager.getConnection(url, user, pwd);
* (2)如果Connection对象是从连接池中获取的,conn.close()已经被改造为归还连接!!!
* 例如:pool.getConnection();
*/
conn.close();
} catch (SQLException e) {
e.printStackTrace();//此处不用通知用户服务器内部出错
} finally{
conn = null;
}
}
}
/**
* demo示例
*/
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();//从连接池中获取连接对象
System.out.println("连接信息:"+conn);
} catch (Exception e) {
e.printStackTrace();
System.out.println("获取连接失败!");
} finally {
JDBCUtils.close(conn, ps, rs);
}
}
}