[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(); } }
[Java] 一种好的JAVA分页实现的更多相关文章
- 面试官的七种武器:Java篇
起源 自己经历过的面试也不少了,互联网的.外企的,都有.总结一下这些面试的经验,发现面试官问的问题其实不外乎几个大类,玩不出太多新鲜玩意的.细细想来,面试官拥有以下七种武器.恰似古龙先生笔下的武侠世界 ...
- Java:一个简捷的可分页的ResultSet实现
内容 前言 JDBC和分页 和具体数据库相关的实现方法 另一种繁琐的实现方法 使用Vector进行分页 一个新的Pageable接口及其实现 Pageable的使用方法 总结 参考资料 关于作者 前言 ...
- Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...
- Java四种线程池的使用
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...
- Java四种线程池
Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...
- Android的4种文件类型Java,class,dex,apk
Java文件-----应用程序源文件 Android本身相当一部分都是用java编写而成(基本上架构图里头蓝色的部份都是用Java开发的),android的应用必须使用java来开发 Class文件- ...
- 几种任务调度的 Java 实现方法与比较
综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺 ...
- JAVA 几种引用类型学习
1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从J ...
- Java四种引用包括强引用,软引用,弱引用,虚引用。
Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...
随机推荐
- Inside GDALAllRegister之三: 注册指定驱动
现在来仔细分析如何注册一个驱动的代码,看下面代码: #ifdef FRMT_vrt GDALRegister_VRT(); #endif 编译时指定或者取消FRMT_vrt,可以控制这条语句是否编译到 ...
- QtGui.QPixmap
A QtGui.QPixmap is one of the widgets used to work with images. It is optimized for showing images o ...
- linux下php添加cur/soapl扩展
注意:在不同的扩展路径下 ./configure --help 的帮助信息不尽相同 1.跟php一起安装 下载 http://curl.haxx.se/download/ curl 取较低的版本 wg ...
- springmvc 日期解决方案(三)使用jackson
引入jar包: <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jac ...
- Oracle基础学习2--Oracle登录与三种验证机制
首先,Oracle安装完毕有三个默认用户 Ø Sys:数据库对象的拥有者.权限最高.password在安装的时候(口令管理)能够改变 Ø System:数据库管理员,password为manage ...
- ThinkPHP实现事务回滚示例代码(附加:PDO的事务处理)
ThinkPHP的事务回滚示例如下: $m=D('YourModel');//或者是M(); $m2=D('YouModel2'); $m->startTrans();//在第一个模型里启用就可 ...
- SDL视频显示进阶
原文地址:http://blog.csdn.net/qingkongyeyue/article/details/53024467 1.SDL中事件和线程(函数同时运行) 2.练习 (1)创建线程 第一 ...
- NHibernate中ISession的Flush
不知道在执行Insert或者Delete,update之后为什么要调用Flush(),后来看了http://www.cnblogs.com/lyj/archive/2008/10/17/1313612 ...
- AutoFac文档(转载)
目录 开始 注册组件 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 开始 程序集 如果你正在使用Nuget包管理器,你可以通过 ...
- 连接到 Linux 服务器时首先要运行的 5 个命令
作为一个系统管理员/SRE 工作 5 年后,我知道当我连接到一台 Linux 服务器时我首先应该做什么.这里有一系列关于服务器你必须了解的信息,以便你可以(在大部分时间里)更好的调试该服务器. 连上 ...