通用分页02

一:封装StudentDao中的代码

将我们复用中相同的代码进行封装,找出代码中相同的部分经行封装,这个类不需要被继承,不需要被实例化只能调用相应的方法

在封装中sql语句和结果转化是差异化的

那么在复用中不同的代码也就是差异化代码就不进行封装,在异化代码中需要把出查询出来的数据经行转换,这里我们写了一个接口

在使用封装代码时因为并不知道使用者会使用什么方法所以我们使用泛型来接收

具体的封装代码如下

public final class DaoTemplate {

	//不能实例化
	private DaoTemplate() {}
	
	//转换接口
	public static interface Convert<T>{
		List<T> convert(ResultSet rs) throws SQLException; 
	}
 	/**
 	 * 执行查询
 	 * @param sql sql语句
 	 * @param args 查询参数
 	 * @param pageBean 分页参数
 	 * @param convert 转换器
 	 * @return
 	 */
	public static <T> List<T>  query(String sql,
			Object[] args,
			PageBean pageBean,
			Convert<T> convert) {
		
			//查询之前的准备 (相同的)
				List<T> datas = new ArrayList<>();
				Connection con = null;
				PreparedStatement ps = null;
				ResultSet rs = null;
				//
				
				
				//如果不需要分页,直接查询
				if(pageBean == null || !pageBean.isPagination()) {
					try {
						
						//------相同的
						con = DBUtil.getConection();
						ps = con.prepareStatement(sql);
						
						setParams(args, ps);
						rs = ps.executeQuery();
						//-------------------
						
						
						//回调业务类传入的转换器执行转换
						datas=convert.convert(rs);
						
						return datas;
						
					} catch(SQLException e) {
						e.printStackTrace();
					} finally {
						DBUtil.closeDB(rs, ps, con);
					}
					
				} else {//如果需要分页
					//-------相同的
					//1.中记录数
					String countSql = "select COUNT(*) from ("+sql+") t";
					
					try {
						con = DBUtil.getConection();
						ps = con.prepareStatement(countSql);
						//设置查询参数
						setParams(args, ps);
						
						rs = ps.executeQuery();
						//为总记录数赋值
						while(rs.next()) {
							pageBean.setTotal(rs.getInt(1));
						}
						
						//如果总记录数为0,则直接返回一个结果集
						if(pageBean.getT
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值