import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.Properties;
import org.apache.commons.dbcp2.BasicDataSource;
/**
* DBCP数据库连接工具类需要
* 1.mysql驱动
* 2.dbcp相关插件(jar包,附名结尾处)
*/
public class DBUtils {
//连接数据库基本属性
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;
//数据源
private static BasicDataSource bds;
//初始化数据源配置
static{
init();
}
public static void init(){
try {
//创建数据源对象
bds = new BasicDataSource();
//加载属性文件,获取属性信息
Properties props = new Properties();
props.load(DBUtils.class.getResourceAsStream("jdbc.properties"));
driverClass = props.getProperty("driver");
url = props.getProperty("url");
username = props.getProperty("user");
password = props.getProperty("password");
initSize = Integer.parseInt(props.getProperty("initSize"));
maxSize = Integer.parseInt(props.getProperty("maxSize"));
maxIdle = Integer.parseInt(props.getProperty("maxIdle"));
maxWait = Long.parseLong(props.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 (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 stat,Connection conn){
try {
if(rs != null) rs.close();
if(stat != null) stat.close();
if(conn != null)conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 通用增删改操作
*/
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;
}
/**
* C++钩子函数 回调函数
* 集合查询
*/
public static <T> List<T> queryList(String sql,CallBack<T> call,Object...params){
Connection conn = DBUtils.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 = DBUtils.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支持
// public interface CallBack<T>{
// default List<T> getDatas(ResultSet rs){
// return null;
// }
// default T getData(ResultSet rs){
// return null;
// }
// }
//jdk1.8以下使用抽象类
public static abstract class CallBack<T>{
public List<T> getDatas(ResultSet rs){
return null;
}
public T getData(ResultSet rs){
return null;
}
}
}
/**
需要的jar包:
1)MySQL驱动包:mysql-connector-java-5.1.39-bin.jar
2)dbcp2连接池包:
commons-collections4-4.1.jar
commons-dbcp2-2.1.1.jar
commons-logging-1.2.jar
commons-pool2-2.4.2.jar
*/
import java.sql.ResultSet;
import java.sql.SQLException;
import com.softeem.dbutils.DBUtils;
import com.softeem.dbutils.DBUtils.CallBack;
/**
* 测试方法举例
*/
public class Test {
public static void main(String[] args) {
//添加操作
// DBUtils.execUpdate(DBUtils.getConn(),
// "insert into tbuser(username,password) values(?,?)",
// "lilyandlucy","123321");
//查询操作
DBUtils.queryOne("select * from tbuser where id=?",
new CallBack<Object[]>() {
@Override
public Object[] getData(ResultSet rs) {
try {
if(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("username");
String pass = rs.getString("password");
System.out.println(id+"--"+name+"--"+pass);
}
} catch (SQLException e) {
e.printStackTrace();
}
return super.getData(rs);
}
},
10148);
}
}