[Java] 一种好的JAVA分页实现
喃都不说了,贴代码,意思都在代码里面了 Page.java //分页类。定义分页字段信息,供前台页面使用 package com.core.common; import java.util.List; public class Page<T> { private int pageIndex;//当前页 private int pageSize;//每页条数 private int totalCount;//符合查询条件总条数 private List<T> pageData;//符合查询条件的列表_注意这里是泛型 private int startRow;//数据库起始记录指针 private int totalPage;//总页数 public Page(int pageIndex, int pageSize){ this.pageIndex = pageIndex <= 0 ? 1 : pageIndex; this.pageSize = pageSize <= 0 ? 10 : pageSize; } public int getPageIndex() { return pageIndex; } public void setPageIndex(int pageIndex) { this.pageIndex = pageIndex; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount = totalCount; } public List<T> getPageData() { return pageData; } public void setPageData(List<T> pageData) { this.pageData = pageData; } public int getStartRow() { startRow = (pageIndex-1) * pageSize; return startRow; } public int getTotalPage() { totalPage = (int) Math.ceil(totalCount/Double.parseDouble(String.valueOf(pageSize))); return totalPage; } } //分页过程————controller @RequestMapping(value = {"/order/list"}) //page当前页 //model 查询参数实体 public ModelAndView get_orders(Integer page,B2cOrderModel model){ ModelAndView mv = new ModelAndView(); mv.setViewName("/order_list"); //传递参数分别是:当前页,每页条数,查询参数 Page<B2cOrderModel> pageData = orderService.getOrders(getPageIndex(page), ConstantUtil.Page.PAGE_NUM, model); mv.addObject("pageData", pageData.getPageData());//列表 mv.addObject("totalCount", pageData.getTotalCount());//总条数 mv.addObject("totalPage", pageData.getTotalPage());//总页数 mv.addObject("currentPage", page);//当前页 mv.addObject("pageNav", PageNavUtil.getBluePageNavHtml(getPageIndex(page), ConstantUtil.Page.PAGE_NUM, pageData.getTotalCount(), ConstantUtil.Page.NAV_NUM));//分页导航 return mv; } //分页过程————service @Override public Page<B2cOrderModel> getOrders(Integer pageIndex, int pageNum, B2cOrderModel model) { Page<B2cOrderModel> page = new Page<B2cOrderModel>(pageIndex, pageNum); //创建查询条件对象 CriteriaCondition condition = new CriteriaCondition();//封装查询条件的类 condition.setDistinct(false); condition.setStart(page.getStartRow()); condition.setPageSize(pageNum); condition.setOrderByClause(" CREATED_DT DESC"); condition.put("postName", model.getPostName()); condition.put("postContactPhone", model.getPostContactPhone()); //查询符合条件的总条数和列表 int totalCount = b2cOrderSourceDao.countByCondition(condition.getCondition()); List<B2cOrderModel> pageData = b2cOrderSourceDao.selectByCondition(condition); //设置分页信息 page.setTotalCount(totalCount); page.setPageData(pageData); //返回分页信息对象 return page; } //分页过程————mybatis语句 查询条数 <select id="countByCondition" parameterType="java.util.Map" resultType="java.lang.Integer"> select count(*) from 表 <include refid="Base_Where_B2cOrder" /> </select> 查询列表 <select id="selectByCondition" resultMap="Base_Result_B2cOrder" parameterType="com.core.common.CriteriaCondition"> select <if test="distinct"> distinct </if> <include refid="Base_Column_B2cOrder" /> from b2c_order <include refid="Base_Where_B2cOrder" /> <if test=" null!= orderByClause"> order by #{orderByClause} </if> <if test="null!=start and null!=pageSize"> limit #{start}, #{pageSize} </if> </select> //结果映射列 <resultMap id="Base_Result_B2cOrder" type="com.source.model.B2cOrderModel"> <result property="model参数名" column="对应的数据库字段"/> </resultMap> //字段列 <sql id="Base_Column_B2cOrder"> 需要查询出的数据库字段 </sql> //查询条件 <sql id="Base_Where_B2cOrder"> <trim prefix="where" prefixOverrides="and|or"> <if test="null!=condition"> <if test="null!=condition.参数字段名 and ''!=condition.参数字段名"> and 数据库字段名= #{condition.参数字段名} </if> </if> </trim> </sql> //分页过程---查询条件封装对象 CriteriaCondition import java.util.HashMap; /** * 公用条件查询类 */ public class CriteriaCondition { /** * 存放条件查询值 */ Map<String, Object> condition; /** * 是否相异 */ boolean distinct; /** * 排序字段 */ String orderByClause; /** * 分页起始页 */ Integer start; /** * 分页数值 */ Integer pageSize; public CriteriaCondition() { super(); condition = new HashMap<String, Object>(); } public CriteriaCondition(String orderByClause, Integer start, Integer pageSize) { this.distinct = true; this.orderByClause = orderByClause; this.start = start; this.pageSize = pageSize; condition = new HashMap<String, Object>(); } public CriteriaCondition(boolean distinct, String orderByClause, Integer start, Integer pageSize) { this.distinct = distinct; this.orderByClause = orderByClause; this.start = start; this.pageSize = pageSize; condition = new HashMap<String, Object>(); } public CriteriaCondition put(String condition, Object value) { this.condition.put(condition, value); return (CriteriaCondition)this; } public Map<String, Object> getCondition() { return condition; } public void setDistinct(boolean distinct) { this.distinct = distinct; } public void setOrderByClause(String orderByClause) { this.orderByClause = orderByClause; } public void setStart(Integer start) { this.start = start; } public void setPageSize(Integer pageSize) { this.pageSize = pageSize; } } //构造前台分页显示 public class PageNavUtil { public static String getBluePageNavHtml(int currentPage, int pageSize, int totalRows, int showNums) { StringBuilder pageNavHtml = new StringBuilder(); if (showNums < 1) { showNums = 5; } // 计算总页数 int totalPage = (int)Math.ceil(totalRows / Double.parseDouble(String.valueOf(pageSize))); // 计算中间页码数字 int midNum = (int)Math.ceil(Double.parseDouble(String.valueOf(showNums)) / 2); int beginNum = currentPage <= midNum ? 1 : currentPage - midNum + 1; int endNum = beginNum + showNums - 1; if (endNum > totalPage) { endNum = totalPage; } // 至少有1页以上 才显示分页导航 if (totalPage > 1) { // 需要显示 首页 if (currentPage > 1) { pageNavHtml.append("<a href='?page=1'> 首页</a>"); } // 如果有上一页 if (currentPage > beginNum) { pageNavHtml.append("<a href='?page=" + (currentPage - 1) + "'> < </a>"); } else { pageNavHtml.append("<a href='javascript:void(0)' class='disabled'> < </a>"); } for (int i = beginNum; i <= endNum; i++) { if (i == currentPage) { pageNavHtml.append("<a href='javascript:void(0)' class='this'>" + currentPage + "</a>"); } else { pageNavHtml.append("<a href='?page=" + i + "'>" + i + "</a>"); } } // 如果有下一页 if (currentPage < endNum) { pageNavHtml.append("<a href='?page=" + (currentPage + 1) + "'> > </a>"); } else { pageNavHtml.append("<a href='javascript:void(0)' class='disabled'> > </a>"); } // 需要显示 尾页 if (currentPage < totalPage) { pageNavHtml.append("<a href='?page=" + totalPage + "'>尾页</a>"); } } return pageNavHtml.toString(); } public static String getPageNavHtml(int currentPage, int pageSize, int totalRows, int showNums) { StringBuilder pageNavHtml = new StringBuilder(); if (showNums < 1) { showNums = 5; } // 计算总页数 int totalPage = (int)Math.ceil(totalRows / Double.parseDouble(String.valueOf(pageSize))); // 计算中间页码数字 int midNum = (int)Math.ceil(Double.parseDouble(String.valueOf(showNums)) / 2); int beginNum = currentPage <= midNum ? 1 : currentPage - midNum + 1; int endNum = beginNum + showNums - 1; if (endNum > totalPage) { endNum = totalPage; } // 至少有1页以上 才显示分页导航 if (totalPage > 1) { // 需要显示 首页 if (currentPage > 1) { pageNavHtml.append("<a href='?page=1'> 首页</a>"); } // 如果有上一页 if (currentPage > beginNum) { pageNavHtml.append("<a href='?page=" + (currentPage - 1) + "'> < </a>"); } else { pageNavHtml.append("<span class='disabled'> < </span>"); } for (int i = beginNum; i <= endNum; i++) { if (i == currentPage) { pageNavHtml.append("<span class='current'>" + currentPage + "</span>"); } else { pageNavHtml.append("<a href='?page=" + i + "'>" + i + "</a>"); } } // 如果有下一页 if (currentPage < endNum) { pageNavHtml.append("<a href='?page=" + (currentPage + 1) + "'> > </a>"); } else { pageNavHtml.append("<span class='disabled'> > </span>"); } // 需要显示 尾页 if (currentPage < totalPage) { pageNavHtml.append("<a href='?page=" + totalPage + "'>尾页</a>"); } } return pageNavHtml.toString(); } }