我们知道原生的jdbc操作dao非常麻烦,要获取连接,然后预编译SQL语句,然后再发送执行获取结果。
如果是查询我们还要通过迭代器来迭代获取数据再做封装,不能做到通用的一个处理。
我这里分享一个自己做的封装的工具类,可以支持所有的 DQML操作,基本就两个方法
一个update方法,支持所有的DML操作
一个query方法,支持所有的query操作
那么这里需要导入apache提供的jdbc的jar包(可以自行去apache官网进行下载)
以及连接池的jar(C3P0)
自行导入数据库提供的jar包,我这里使用的是mysql
1.我们在src目录新建 c3p0-config.xml文件 主要配置连接池信息
2.我们先准备DButil工具类,专门用来获取数据库连接
public class DButil {
private static ComboPooledDataSource dataSource;
//使用静态块 初始化dataSource 默认加载src下的xml配置
static{
dataSource = new ComboPooledDataSource();
}
/**
* 构造私有
*/
private DButil(){
}
/**
* 获取QueryRunner对象
* @return
*/
public static QueryRunner getQueryRunner(){
//必须给定连接池的类
return new QueryRunner(dataSource);
}
/**
* 获取conn 在连接池
* @return
*/
public static Connection geteConn(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
2.编写BaseDao(封装jdbc造作)
/**
* 封装 CURD操作 增删改查
* 增删改 是一类 update
* 查询 是一类 query
* @author xz
*
*/
public class BaseDao {
//使用Log 类 传入当前类的字节码信息
private Logger log = Logger.getLogger(BaseDao.class);
/**
* 统一的DML操作 增删改
* @param sql 执行的sql语句
* @param params sql语句对应的参数
* @return true/false
*/
protected boolean update(String sql,Object ... params){
log.info(sql+"=================="+params);
boolean flag =false;
//获取QueryRunner
QueryRunner qr = DButil.getQueryRunner();
try {
int i = qr.update(sql, params);
if(i>0){
flag=true;
}
} catch (SQLException e) {
log.error(e.getMessage());//记录日志 在控制台输出 并且记录到文件
e.printStackTrace();
}
return flag;
}
/**
* 统一的带事物操作的DML操作 增删改
* @param sql 执行的sql语句
* @param params sql语句对应的参数
* @return true/false
*/
protected boolean update(Connection conn,String sql,Object ... params){
log.info(sql+"=================="+params);
boolean flag =false;
//获取QueryRunner 带了连接池
QueryRunner qr = new QueryRunner();
try {
int i = qr.update(conn,sql, params);
if(i>0){
flag=true;
}
} catch (SQLException e) {
log.error(e.getMessage());//记录日志 在控制台输出 并且记录到文件
e.printStackTrace();
}
return flag;
}
/**
* 支持所有类的查询
* @param sql 查询的语句
* @param cls 被查询的对象的类的class
* @param params 查询语句的参数
* @return 对用的类的list集合
*/
protected <T> List<T> query(String sql,Class<T> cls,Object ...params){
log.info(sql+"=================="+params);
List<T> list = new ArrayList<T>();
try {
//获取QueryRunner
QueryRunner qr = DButil.getQueryRunner();
list = qr.query(sql, new BeanListHandler<T>(cls), params);
} catch (SQLException e) {
log.error(e.getMessage());
e.printStackTrace();
}
return list;
}
/**
* 支持所有对象的单个查询
* @param sql 查询的sql语句
* @param cls 被查询的对象的class
* @param params sql语句的参数值
* @return cls的对象
*/
protected <T> T queryByOne(String sql,Class<T> cls,Object ...params){
log.info(sql+"=================="+params);
T bean = null;
try {
QueryRunner qr = DButil.getQueryRunner();
bean = qr.query(sql, new BeanHandler<T>(cls), params);
} catch (SQLException e) {
log.error(e.getMessage());
e.printStackTrace();
}
return bean;
}
/**
* 根据模糊查询所有的总数
* @param sql
* @param params
* @return
*/
protected int getCount(String sql,Object ... params){
StringBuilder sb = new StringBuilder(" select count(*) from ( ");
sb.append(sql);
sb.append(" ) tab");
sql = sb.toString();
log.info(sql);
long max = 0;
try {
QueryRunner qr = DButil.getQueryRunner();
/*BigDecimal bd = qr.query(sql, new ScalarHandler<BigDecimal>(), params);
max = bd.intValue();*/
max = qr.query(sb.toString(), new ScalarHandler<Long>(), params);
} catch (SQLException e) {
e.printStackTrace();
}
return (int)max;
}
/**
* 支持所有的排序分页查询 oracle 分页
* @param sql 查询sql语句 select * from emp where ??????
* @param cls 被查询的对象的class
* @param page 当前页码
* @param rows 每页的条数
* @param column 排序的字段
* @param type 排序的类型 desc asc
* @param params sql的参数
* @return
*//*
protected <T> List<T> queryByPage(String sql,Class<T> cls,
int page,int rows,String column,String type,ArrayList<Object> list){
StringBuilder sb = new StringBuilder(" select * from ( select rownum rn ,t.* from (");
sb.append( sql );
//拼接排序
if(!"".equals(column) && !"".equals(type)){
sb.append(" order by ");
sb.append(column+" "+type);
}
sb.append(" ) t ) p where p.rn between ? and ?");
//自动计算起始条数 和结束的条数
int minRow= (page-1)*rows+1;//起始条数
int maxRow=page*rows;//终止条数
//把参数加入到list
list.add(minRow);
list.add(maxRow);
//执行 sql语句 带了N多的参数 数组 ==动态参数
return query(sb.toString(), cls, list.toArray());
}*/
/**
* mysql分页
* 支持所有的对象的分页查询
* @param sql 查询的sql语句
* @param cls 被查询的对象字节码类
* @param page 当前第几页
* @param rows 每页的条数
* @param params sql语句的参数
* @return
*/
protected <T> List<T> queryByPage(String sql,Class<T> cls,int page,int rows,String column,String type,ArrayList<Object> params) {
log.info("sql:"+sql+",cls:"+cls+",params:"+params);
List<T> list = null;
try {
if(!"".equals(column) && !"".equals(type)){
sql+=" order by " +column+" "+ type;
}
sql+=" limit ? , ?";
//指的是起始数
int start = (page-1)*rows;
//添加参数值
params.add(start);
params.add(rows);
//调用query方法
list = query(sql, cls, params.toArray());
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
}
return list;
}
}
注意:我在BaseDao中使用了log日志记录,主要是用来记录日志信息,如果需要,可以自行导入log4j的jar和配置log4j的信息