[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 ...
随机推荐
- DAS存储未死,再次欲获重生
当我们回想存储发展形态时.我们会想到DAS是最原始最主要的存储方式,在个人电脑.server等低端市场和场景上随处可见. 存储的原始形态也来自于DAS,常见的用于连接DAS和主机系统的协议/标准主要 ...
- mysql 流程函数 存储引擎 InnoDB简单特性
建表及插入数据语句: mysql> create table salary(userid int,salary decimal(9,2)); Query OK, 0 rows affected ...
- 【Django】TemplateDoesNotExist at /login/
在Django项目中配置一个简单的页面跳转 说明 OliverPro 为项目名称 ProApp 为应用程序 项目文件结构如下: 文件配置如下: 项目中的urls 应用程序urls views.py文件 ...
- SecureCRT 常用配置
1.SecureFx 中文乱码,应设置成utf-8编码了,依旧乱码 在 C:\Users\root\AppData\Roaming\VanDyke\Config\Sessions 下找到对应的sess ...
- gcc/g++ 命令的常用选项
gcc/g++ 命令的常用选项使用g++编译CPP文件如果用gcc编译C++源文件时,加以下选项:-lstdc++,否则使用了C++操作的文件编译会出错.假如在程序中用到new delete操作,而不 ...
- 查看80port是否被占用
windows下命令: netstat -ano|findstr "0.0:80"
- Intellij Idea下搭建基于Spring+SpringMvc+MyBatis的WebApi接口架构
2018-08-16 09:27 更新 强烈推荐使用Springboot来搭建MVC框架! 强烈推荐使用Springboot来搭建MVC框架! 强烈推荐使用Springboot来搭建MVC框架! 后文 ...
- 使用jquery的 uploadify,在谷歌浏览器上总会崩溃的解决方法
最近做的项目使用了jquery的uploadify,但是在谷歌浏览器测试总是会出现崩溃.如: 因为是java项目. 解决的办法是: 给引入的js加上一个参数,时间戳就可以,防止缓存,使每一次都请求.( ...
- /usr/lib64改名字风波
注:本文描述请勿模仿,仅限万一遇到这种情况一试. 一不小心做了一个操作: cd /usr mv lib64 lib64-bak 然后奇异的发现: cp不能用了!ls也不能用了…… 提示信息如下: -b ...
- 趣味SQL——创建指定的数据类型
原创作品,出自 "深蓝的blog" 博客,深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/46908843 趣味 ...