一:封装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