public class DBUtils {
//数据源
private static BasicDataSource bds;
//连接数据库基本属性
private static String driverClass;
private static String url;
private static String username;
private static String password;
//连接池属性
private static int initSize;
private static int maxSize;
private static int maxIdle;
private static long maxWait;
//初始化数据源配置
static {
init();
}
public static void init(){
try {
// 创建数据源对象
bds = new BasicDataSource();
//加载属性文件,获取属性信息
Properties pros = new Properties();
pros.load(DBUtils.class.getResourceAsStream("jdbc.properties"));
driverClass = pros.getProperty("driver");
url = pros.getProperty("url");
username = pros.getProperty("user");
password = pros.getProperty("password");
initSize = Integer.parseInt(pros.getProperty("initSize"));
maxSize = Integer.parseInt(pros.getProperty("maxSize"));;
maxIdle = Integer.parseInt(pros.getProperty("maxIdle"));;
maxWait = Long.parseLong(pros.getProperty("maxWait"));
//设置驱动类路径
bds.setDriverClassName(driverClass);
//设置url
bds.setUrl(url);
//设置用户名
bds.setUsername(username);
//设置密码
bds.setPassword(password);
//设置初始连接数
bds.setInitialSize(initSize);
//设置最大连接数
bds.setMaxTotal(maxSize);
//设置最大闲置连接数
bds.setMaxIdle(maxIdle);
//设置最大等待连接时间(ms)
bds.setMaxWaitMillis(maxWait);
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConn(){
try {
if(bds == null || bds.isClosed()){
init();
}
return bds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//封装资源回收的方法
public static void close(ResultSet rs,Statement stmt,Connection conn){
try {
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 更新操作
* @param conn
* @param sql
* @param objs
* @return
*/
public static boolean execUpdate(Connection conn,String sql,Object...objs){
try {
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; i < objs.length; i++) {
ps.setObject(i+1, objs[i]);
}
int i = ps.executeUpdate();
return i > 0 ? true : false;
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
/**
* 查询操作
* 泛型方法,使参数可以添加泛型
*/
public static <T> List<T> queryList(String sql,CallBack<T> call,Object ...params){
Connection conn = getConn();
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
ps.setObject(i+1, params[i]);
}
ResultSet rs = ps.executeQuery();
return call.getDatas(rs);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static <T> T queryOne(String sql,CallBack<T> call,Object ...params){
Connection conn = getConn();
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
ps.setObject(i+1, params[i]);
}
ResultSet rs = ps.executeQuery();
return call.getData(rs);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//查询返回接口
//JDK1.8 default方法
// public interface CallBack<T>{
// default List<T> getDatas(ResultSet rs){
// return null;
// };
// default T getData(ResultSet rs){
// return null;
// };
// }
//若JDK版本低,使用静态抽象方法
public static abstract class CallBack<T>{
public List<T> getDatas(ResultSet rs){
return null;
}
public T getData(ResultSet rs){
return null;
}
}
}
有了这个封装工具类,数据库的连接,配置,以及JDBC的增删改查操作就十分方便了。就算换用不同的数据库,也只需要修改配置文件就可以。