学习过程中我们经常需要利用jdbcUtils和c3p0连接池结合来操作数据库,由于数据操作的基本步骤大体一致,所以我们会自己写一个工具类来提供Datasource,Connection,释放资源等操作,再次做一个整理。
package cn.wang.customer.utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCUtils {
/**
* JDBC工具类 1.提供连接池 2.释放资源,根据CRUD的实际情况释放资源方法需要重载
*
*/
private static DataSource dataSource = new ComboPooledDataSource();
/**
* 工具类提供,连接池对象给 QueryRunner(DataSource dataSourece) 根据实际情况:需要事物管理的就是 无参构造
* 不需要事物管理的就是有参构造
*
* @return
*/
public static DataSource getDataSource() {
return dataSource;
}
/**
* 当需要手动控制事物的时候,需要把conn当做参数传递给方法, 所以这边提供一个方法,获取conn;
*
* @return
*/
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e + "获取连接池失败");
}
}
/**
* 提供多个重载的方法释放资源,根据实际情况调用
*
*/
public static void close(Connection conn) {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
conn = null;
}
}
public static void close(Connection conn, Statement stat) {
try {
if (stat != null) {
stat.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
stat = null;
close(conn);
}
}
public static void close(Connection conn, Statement stat, ResultSet res) {
try {
if (res != null) {
res.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
res = null;
close(conn, stat);
}
}
public static void close(PreparedStatement pst) {
try {
if (pst != null) {
pst.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
pst = null;
}
}
}