Day0830对BaseDao类的优化以及反射等笔记记录

        今天老师在impl包下实现(针对bean包里的部门信息表)方法时,对一些重复的代码进行了优化,放在BaseDao中现进行如下总结:

@Override
	public List<Dept> findByCondition(Map<String, Object> map) {
		List<Object> paramList=new ArrayList<Object>();
		StringBuffer sf=new StringBuffer();
		sf.append(" select * from dept where 1=1 ");
		//第一种:重复的反复的写相同的代码 
		//1、获得连接对象
		Connection conn=this.getConnection();
		PreparedStatement pra=null;
		ResultSet rs=null;
		try {
			//2、获得预编译语句集
			pra=conn.prepareStatement(sf.toString());
			
			//2.1、设置占位符的值
			Object[] paramsObjs=paramList.toArray();
			if(paramsObjs!=null && paramsObjs.length>0){
				for(int i=0;i<paramsObjs.length;i++){
					pra.setObject(i+1, paramsObjs[i]);
				}
			}
			
			//3、获得结果集并遍历
			rs=pra.executeQuery();
			while(rs.next()){
				Dept entity=new Dept();
				entity.setDeptno(rs.getInt("deptno"));
				entity.setDname(rs.getString("dname"));
				entity.setLoc(rs.getString("loc"));
				list.add(entity);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			this.closeAll(rs, pra, conn);
		}
		return list;
    }

  这种代码缺点就是每次在实现类里添加方法时都要写相同的代码(对占位符进行赋值)所以在BaseDao中集成一个方法如下:

public ResultSet executeQuery(String sql,Object... paramsObjs) throws Exception{
		//1、获得连接对象
		conn=this.getConnection();
		
		//2、获得预编译语句集
		pra=conn.prepareStatement(sql);
		
		//2.1、设置占位符的值
		if(paramsObjs!=null && paramsObjs.length>0){
			for(int i=0;i<paramsObjs.length;i++){
				pra.setObject(i+1, paramsObjs[i]);
			}
		}
		//3、获得结果集并遍历
		ResultSet rs=pra.executeQuery();
		return rs;
	}

  优化后的代码在实现类中如下:

@Override
	public List<Dept> findByCondition(Map<String, Object> map) {
		List<Object> paramList=new ArrayList<Object>();
		StringBuffer sf=new StringBuffer();
		sf.append(" select * from dept where 1=1 ");
        //第二种,在第一种的基础上初步优化的代码 
		try {
			rs=this.executeQuery(sf.toString(), paramList.toString());
			while(rs.next()){
				Dept entity=new Dept();
				entity.setDeptno(rs.getInt("deptno"));
				entity.setDname(rs.getString("dname"));
				entity.setLoc(rs.getString("loc"));
				list.add(entity);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			this.closeAll(rs, pra, conn);
		}
            return list;
    }

[注]BaseDao中不能有bean原生类的代码出现,因为BaseDao时通用的工具类,所以在集成的时候要把占位符赋值的代码拿出来

        但是每个方法还是要获取结果集,再一个一个把占位符放到sql语句上才能执行,还是不够精简,每次都要打重复的很多代码,所以再想办法把手动添加占位符的代码集成到BaseDao中,由于不能使用反射,就相当于我传sql进去,传一个(Object...)可变数组进去,在调用findByCondition方法时就直接能得到查询的结果。所以在集成executeQuery方法时,不让他返回的是结果集而是一个list<Object>以达到通用性。所以再BaseDao中继续对executeQuery方法进行优化且达到通用效果,代码如下:

public abstract class BaseDao<T> {

    protected Connection conn=null;
	protected PreparedStatement pra=null;
	protected ResultSet rs=null;

    public abstract T getEntity(ResultSet rs);

    public List<T> executeQuery2(String sql,Object... paramsObjs){
		List<T> list=new ArrayList<T>();//返回的结果集合
		//1、获得连接对象
		Connection conn=this.getConnection();
		PreparedStatement pra=null;
		ResultSet rs=null;
		try {
			//2、获得预编译语句集
			pra=conn.prepareStatement(sql);
			
			//2.1、设置占位符的值
			if(paramsObjs!=null && paramsObjs.length>0){
				for(int i=0;i<paramsObjs.length;i++){
					pra.setObject(i+1, paramsObjs[i]);
				}
			}
			
			//3、获得结果集并遍历
			rs=pra.executeQuery();
			while(rs.next()){
                //通过调用子类的重写方法获得泛形类的实例
				list.add(this.getEntity(rs));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			this.closeAll(rs, pra, conn);
		}
		return list;
	}

因为不能用反射,还要实现通用性,所以这里利用了Java的编程思想,利用继承,让每一个子类重写抽象方法,再调用的时候用的是子类重写的方法,传一个对应的结果集,就实现了设置占位符是获取相应的类型:实现类代码如下:

public class DeptDaoImpl extends BaseDao<Dept> implements DeptDao {
	@Override
	public Dept getEntity(ResultSet rs) {
		Dept entity=new Dept();
		try {
			entity.setDeptno(rs.getInt("deptno"));
			entity.setDname(rs.getString("dname"));
			entity.setLoc(rs.getString("loc"));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return entity;
	}
    @Override
	public List<Dept> findByCondition(Map<String, Object> map) {
		List<Object> paramList=new ArrayList<Object>();
		StringBuffer sf=new StringBuffer();
		sf.append(" select * from dept where 1=1 ");
		
		//第三种:在第二种的基础上继续优化
		return this.executeQuery2(sf.toString(), paramList.toArray());
    }

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值