解析:通用分页就是就是把分页方法的共同代码封装起来,利用泛型去传递类对象,然后利用反射获取对象属性给对象属性赋值,这样在之后的项目中就可以直接用了,节省代码,更加方便。
最后效果
1、连接数据库,最基本的操作这里就不细讲了(调用分页我用的mysql的数据库)
导jar包
后面jsp界面会用到的标签jar包
连接mysql数据库的jar包
2、定义工具类pageBean,来控制是否分页,页数,每页数量
里面需要
属性
page 页码
rows 页大小
total 总记录数(这个是从数据库中统计)
方法
pageBean的初始化方法
上一页的方法
下一页的方法
get,set方法
获得起始记录的下标的方法
获取最大页数的方法
/**
* 分页工具类
*/
public class PageBean {
private int page = 1;// 页码
private int rows = 10;// 页大小
private int total = 0;// 总记录数,从数据库中统计的
private boolean pagination = true;// 是否分页 默认分页
private String url;
private Map<String, String[]> ParameterMap = new HashMap<String, String[]>();
//专门写一个方法,做pageBean的初始化
public void setRequest(HttpServletRequest request) {
System.out.println("pagebean初始化");
String page= request.getParameter("page");
String rows= request.getParameter("rows");
String pagination = request.getParameter("pagination");
this.setPage(page);
this.setRows(rows);
this.setPagination(pagination);
this.url=request.getContextPath()+request.getServletPath();
this.ParameterMap =request.getParameterMap();
}
//上一页
public int getPreviousPage() {
System.out.println("getPreviousPage");
int previousPage=this.page-1;
if(0==previousPage) {
previousPage=1;
}
return previousPage;
}
//下一页
public int getNextPage() {
System.out.println("getNextPage");
int nextPage=this.page+1;
if(nextPage>getMaxPage()) {//大于最大页
nextPage=getMaxPage();
}
return nextPage;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public void setPage(String page) {
if(null!=page &&!"".equals(page.trim())){
this.page =Integer.parseInt(page);
}
}
public Map<String, String[]> getParameterMap() {
return ParameterMap;
}
public void setParameterMap(Map<String, String[]> parameterMap) {
ParameterMap = parameterMap;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
public void setRows(String rows) {
if(null!=rows &&!"".equals(rows.trim())){
this.rows =Integer.parseInt(rows);
}
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public void setTotal(String total) {
this.total = Integer.parseInt(total);
}
public boolean isPagination() {
return pagination;
}
public void setPagination(boolean pagination) {
this.pagination = pagination;
}
public void setPagination(String pagination) {
if("false".equals(pagination)) {
this.pagination = Boolean.parseBoolean(pagination);
}
}
public PageBean() {
super();
}
/**
* 获得起始记录的下标
*
* @return
*/
public int getStartIndex() {
return (this.page-1)*this.rows;
}
/**
* 获取最大页数
* @return
*/
public int getMaxPage() {
int maxPage=this.total/this.rows;
if(0!=this.total%this.rows) {
maxPage++;
}
return maxPage;
}
@Override
public String toString() {
return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
}
}
3、实体类(字段,封装,构造方法)
4、工具类
从上至下,依次为(连接数据库工具类、字符编码过滤工具类、分页工具类、连接各种数据库配置工具类)
5、将一般增删改查重复的部分写一个泛型,专门写一个方法用来拼接查询语句的统计满足条件的总行数,专门写一个方法用来存储拼接分页的sql,再在里面写一个内部类将不同的遍历部分放进去,解决每个表字段不一样的问题。
内部接口
Callback:
定义一个遍历ResultSet 的方法
方法
getCountSql 得到数据库表的总条数
getPageSql 得到分页sql语句
executeQuery 具体分页方法
//SOLAR
public class BaseDao<k> {
public interface Callback<k>{
public List<k> foreach(ResultSet rs) throws SQLException;
}
public String getCountSql(String sql) {
return "select count(*) from ("+sql+") t1";
}
public String getPageSql(String sql,PageBean pageBean) {
return sql+"limit "+pageBean.getStartIndex()+","+pageBean.getRows()+"";
}
public List<k> executeQuery(String sql,PageBean pageBean,Callback<k> callback){
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
if(null!=pageBean&&pageBean.isPagination()) {
//1、统计满足条件的总行数
try {
con=DBAccess.getConnection();
String countSql=this.getCountSql(sql);
ps=con.prepareStatement(countSql);
rs=ps.executeQuery();
if(rs.next()) {
int total=rs.getInt(1);
pageBean.setTotal(total);
}
} catch (Exception e) {
// TODO: handle exception
throw new RuntimeException(e);
}finally {
DBAccess.close(null, ps, rs);//不能把连接关闭
}
}
//2、查询指定页码并满足条件的总记录数
try {
if(con==null) {
con=DBAccess.getConnection();
}
String pageSql=sql;
if(null!=pageBean&&pageBean.isPagination()) {
pageSql=getPageSql(sql, pageBean);
}
ps=con.prepareStatement(pageSql);
rs=ps.executeQuery();
return callback.foreach(rs);
} catch (Exception e) {
// TODO: handle exception
throw new RuntimeException(e);
}finally {
DBAccess.close(con, ps, rs);
}
}
}
5.在dao类里继承第4步里创建的BaseDao,重写executeQuery方法返回的foreach,遍历存储取出来的字段,返回结果集
public List<Job> find(PageBean pageBean){
String sql="select * from t_solr_job where 1=1 ";
return this.executeQuery(sql, pageBean, new Callback<Job>() {
@Override
public List<Job> foreach(ResultSet rs) throws SQLException {
List<Job> jobList = new ArrayList<Job>();
Job j = null;
while(rs.next()) {
j = new Job();
j.setId(rs.getString("id"));
j.setJob(rs.getString("job"));
j.setCompany(rs.getString("company"));
j.setAddress(rs.getString("address"));
j.setSalary(rs.getString("salary"));
j.setUrl(rs.getString("url"));
j.setLimit(rs.getString("limit"));
j.setTime(rs.getString("time"));
j.setDesc(rs.getString("desc"));
j.setJobHandle(rs.getString("jobHandle"));
j.setAddressHandle(rs.getString("addressHandle"));
jobList.add(j);
}
return jobList;
}
});
}
6、写servlet,继承HttpServlet,写两个方法(doget,dopost),实例化分页工具类,调用方法
public class JobServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
//设置字符编码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//实例化dao方法
JobDao jd = new JobDao();
//实例化分页工具类,调用方法
PageBean pageBean = new PageBean();
pageBean.setRequest(req);
req.setAttribute("pageBean", pageBean);
//调用分页方法
List<Job> joblist= jd.find(pageBean);
//存储
req.setAttribute("joblist", joblist);
//跳转界面
req.getRequestDispatcher("index.jsp").forward(req, resp);
}
}
这里是调用分页的前半段,后半段JSP界面,以及自定义分页按钮,请看我后面发布的通用分页02.
这是一个通用分页02博客的传送门~(点击)