今天老师在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());
}