封装JDBC操作

我们知道原生的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的信息

猜你喜欢

转载自blog.csdn.net/xiezhi_1130/article/details/84849212