目录
通用后台分页
1.简单的查询功能
编码:Connection建立连接
preparestatement获得预编译对象
执行查询
ResultSet结果集处理
不足之处:
完全重复的代码:Connection建立连接
preparestatement获得预编译对象
执行查询
重复的思路:结果集处理
2.通用的查询功能
为简单查询的不足提供解决方案:
①定义父类处理重复的代码,将重复代码放到父类由子类继承
②利用放射处理重复的思路,反射可以解决应对不同结果集不同字段的问题
下面我们将解决思路转换成代码来实现:
首先我们需要创建父类BaseDao,代码如下
package com.dao;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.util.DBAccess;
import com.util.PageBean;
public class BaseDao<T> {
public List<T> getAll(String sql, Class<T> cla) throws Exception {
List<T> list = new ArrayList<T>();
Connection con = DBAccess.getConnection();
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
T t = cla.newInstance();
Field[] field = cla.getDeclaredFields();
for (Field f : field) {
f.setAccessible(true);
f.set(t, rs.getObject(f.getName()));
}
list.add(t);
}
return list;
}
/**
* 通用分页查询
*
* @param sql
* @param cla
* @param pageBean
* @return
* @throws Exception
*/
// 1.判断是否需要分页 无需分页:下拉框 必须分页:项目中列表类的需求 订单列表,学生列表.....
public List<T> pages(String sql, Class<T> cla, PageBean pageBean) throws Exception {
List<T> list = new ArrayList<T>();
Connection con = DBAccess.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
if (pageBean != null && pageBean.isPagination()) {
// 需要分页
String countSQL = getCountSQL(sql);// 符合条件的数据条数
ps = con.prepareStatement(countSQL);
rs = ps.executeQuery();
if (rs.next()) {
pageBean.setTotal(String.valueOf(rs.getObject(1)));
}
String pageSQL = getPageSQL(sql, pageBean);// 分页语句
ps = con.prepareStatement(pageSQL);
rs = ps.executeQuery();
} else {
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
}
while (rs.next()) {
T t = cla.newInstance();
Field[] field = cla.getDeclaredFields();
for (Field f : field) {
f.setAccessible(true);
f.set(t, rs.getObject(f.getName()));// f.getName是,每个属性名称
}
list.add(t);
}
return list;
}
/**
* 将原生sql转换成pageSQL
*
* @param sql
* @param pageBean
* @return
*/
private String getPageSQL(String sql, PageBean pageBean) {
// TODO Auto-generated method stub
return sql + " limit " + pageBean.getStartIndex() + "," + pageBean.getRows() + "";
}
/**
* 将原生sql转换成countSQL
*
* @param sql
* @return
*/
private String getCountSQL(String sql) {
// TODO Auto-generated method stub
return "select count(1)from(" + sql + ")t";
}
}
子类BookDao,继承父类的方法
package com.dao;
import java.sql.Connection;
import java.sql.Prepared