[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 ...
随机推荐
- C#基础视频教程7.2 如何编写简单游戏
前面一小节我们实现了简单的碰撞检测,但是实际上游戏的对象并不是一个标准的矩形(小鸟是一个不规则的物体,其实碰撞的管道也是不规则物体),所以如果真的要做的比较完美,我们自己要写一个方法,能够导入一个图像 ...
- 解决ARC下performselector-may-cause-a-leak-because-its-selector-is-unknown 警告
在ARC下使用 [theTarget performSelector:theTarget withObject:Nil]; 会出现警告:performselector-may-cause-a-leak ...
- 【转】Linux下的多线程编程背景知识
1. 进程和线程 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(pr ...
- SecureCRT 常用配置
1.SecureFx 中文乱码,应设置成utf-8编码了,依旧乱码 在 C:\Users\root\AppData\Roaming\VanDyke\Config\Sessions 下找到对应的sess ...
- C#拼接SQL中in条件
一.拼接字符串类型的字段 string sql = @"select distinct ziduan from tablename where ziduan in ('{0}')" ...
- 浏览器HTTP请求分析
普通网民打开网页,访问网站,并不需要了解所谓HTTP协议.作为软件工程师,了解一下浏览器的工作过程还是一件比较有意思的事情.我向大家介绍一下当我们在浏览器的地址栏里面回车的时候,浏览器如何和Web服务 ...
- [译]聊聊C#中的泛型的使用(新手勿入) Seaching TreeVIew WPF 可编辑树Ztree的使用(包括对后台数据库的增删改查) 字段和属性的区别 C# 遍历Dictionary并修改其中的Value 学习笔记——异步 程序员常说的「哈希表」是个什么鬼?
[译]聊聊C#中的泛型的使用(新手勿入) 写在前面 今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发 ...
- linux 查看CPU、内存大小
查看linux下的cpu.内存和硬盘大小: 查看cpu的方法 1. cat /proc/cpuinfo 或者 更直观的查看cpu的型号命令:dmesg |grep -i xeon 查看内存的方法 2 ...
- 关于“Could not open ServletContext resource [/WEB-INF/applicationContext.xml]”解决方案
问题说明,我在web.xml文件中进行了如下配置 <servlet> <servlet-name>dispatcherServlet</servlet-name> ...
- atitit..主流 浏览器 js 引擎 内核 市场份额 attialx总结vOa9
atitit..主流 浏览器 js 引擎 内核 市场份额 attialx总结vOa9 1. 浏览器内核 1 2. 浏览器的主要组件包括: 2 2.1. 主要组件体系结构 2 2.2. WebCore ...