package util;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.Properties;
import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
/**
* 管理连接的工具类,带有连接池,
* 适用于多线程的场景。
*/
public class DBUtil {
private static BasicDataSource ds;
//加载连接参数
static {
Properties p = new Properties();
try {
InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("util/db.properties");
p.load(is);
is.close();
//读取连接参数
String driver = p.getProperty("jdbc.driver");
String url = p.getProperty("jdbc.url");
String user =p.getProperty("jdbc.user");
String pwd = p.getProperty("jdbc.pwd");
String initSize = p.getProperty("ds.initSize");
String maxSize = p.getProperty("ds.maxSize");
//创建连接池
ds = new BasicDataSource();
//设置连接参数(必须设置)
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(user);
ds.setPassword(pwd);
//设置连接池管理参数(有默认值)
//初始化连接数
ds.setInitialSize(new Integer(initSize));
//最大连接数
ds.setMaxIdle(new Integer(maxSize));
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("加载配置文件失败", e);
}
}
/**
* 连接池创建的连接,不是原始的连接,
* 而是它重新封装后的连接。典型的特征
* 是其关闭方法是归还连接。
*/
public static Connection getConnection() {
try {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("创建连接失败", e);
}
}
/**
* 若连接由连接池创建,则关闭连接
* 就是将其归还给连接池,该连接的
* 状态会变成空闲,可以继续复用。
*/
public static void close(
Connection con, Statement smt) {
try {
if(smt != null) {
smt.close();
}
if(con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("释放资源失败", e);
}
}
public static void close(Connection con,Statement smt,ResultSet rs) {
try {
if(rs != null) {
rs.close();
}
if(smt != null) {
smt.close();
}
if(con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("释放资源失败", e);
}
}
public static void main(String[] args) {
Connection con = DBUtil.getConnection();
System.out.println(con.getClass());
DBUtil.close(con, null);
}
}