文档章节

java 后端简单分页

之渊
 之渊
发布于 2017/07/20 20:11
字数 1015
阅读 243
收藏 0

好久没有搞分页了,,一般好点的项目, 都有 集成第三方 的分页插件了,直接用就好啦,根本不需要管那么多。。 可是 在 开发一个 项目的时候, 他的分页没有使用 分页插件,,而是 使用原生的 limit分页,而我又想 集成 分页插件进来。。。所以把我 绕了半天了。。。绝对是没有睡好了,,,下面 解释一下分页吧。

Java后端的分页,要看 前端的需求,,有些他们需要 返回 pageALL 即总页数,, 有些不需要,只需要 总数即可。 前端 请求后端需要 带过来 页数,和 每页的 数据 条数,我们就可以后台分页了。。。 这里不说 什么 物理分页,,,内存分页,,这些 只需要 集成了 分页插件, 都会帮我 们搞定了,,,这里 只说 原生的 mysql limit 分页 实现的。

一般 分页 是很简单的代码的:

@Override public JSONObject findAssetAll(int page, int rows) { // 分页逻辑处理 if (page == 0) { page = 1;// 为了防止0页的情况发生 } int num = 0; if (page == 1) { num = 0; } else {

		num = rows * (page - 1);
	}
	Example example=new Example(Asset.class);
	int total=assetMapper.selectCountByExample(example);
	
	String selectSql="asset_id desc limit "+num+" , "+rows;
	
	example.setOrderByClause(selectSql);
	List<Asset> assets=assetMapper.selectByExample(example);
public class PagerLimit {

	public static void main(String[] args) {
		
		int page = 2; //页数
		int rows = 7; // 即 pageSize
		
		// 分页逻辑处理
		if (page == 0) {
			page = 1;// 为了防止0页的情况发生
		}
		int num = 0;
		if (page == 1) {
			num = 0;
		} else {

			num = rows * (page - 1);
		}
		
		System.out.println(">>>page>>"+page);
		//  num =7 rows =7 反推出  page
		System.out.println(">>>>offset>>"+num);
		
		// 反算出 当前的需要的 页数 
		System.out.println(num/rows +1);
		
		
	}

}

上面没有计算出总 页数,其实并不难计算出来的。。。这里不说明了。百度吧

我今天下午掉进坑里了,,,把limit 的 用法 搞混了,,, 忘记了,,

比如 limit 1,3 不是求出 1到 3 的 数据,,,不是 2条数据。。 而是求出 从1 开始的 后台 3条 数据,如果有的话,,,即使 3条数据。 pageSize 就是 对应 limit 的 最后 一个 数字 即 3 的数字。。。

我这个项目 的分页 的实现有点 不一样的。 前端会根据总数和页数 直接帮我们计算出来 MySQL limit的 2个 数字,后端直接 拿到了 数据了。 直接 放入 SQL里面 limit 就执行就可以了。。。

是挺方便的,可是目前我要集成 分页插件的时候,就郁闷了,,分页插件 需要 放入 page 页数的值的。 即 这样就可以了 将 查询的 起始偏移量 除以 rows 即 每页的数据量 再加 1 即可以取得 正确的 页数的。。 就可以了,,,就可以放心的 集成 分页插件了

page  =  num/rows +1

最后

逻辑分页即是 查询出来 总数据量,然后 分页,,,数据多的话很不好的 limit 就是 物理分页,包括 分页插件也是 物理分页的,,,mybatis 自带的分页是逻辑分页因此 会使用第三方的分页插件 。

逻辑分页代码有兴趣可以看看:

package test.page;

import java.io.Serializable;
import java.util.List;

public class Pager<T> implements Serializable {
	
	public static void main(String[] args) {
		
	}
	

	private static final long serialVersionUID = -8741766802354222579L;
	
	private int pageSize; // 每页显示多少条记录
	
	private int currentPage; //当前第几页数据
	
	private int totalRecord; // 一共多少条记录
	
	private int totalPage; // 一共多少页记录
	
	private List<T> dataList; //要显示的数据
	
	public Pager(int pageNum, int pageSize, List<T> sourceList){
		if(sourceList == null || sourceList.isEmpty()){
			return;
		}
		
		// 总记录条数
		this.totalRecord = sourceList.size();
		
		// 每页显示多少条记录
		this.pageSize = pageSize;
		
		//获取总页数
		this.totalPage = this.totalRecord / this.pageSize;
		if(this.totalRecord % this.pageSize !=0){
			this.totalPage = this.totalPage + 1;
		}
		
		// 当前第几页数据
		this.currentPage = this.totalPage < pageNum ?  this.totalPage : pageNum;
				
		// 起始索引
		int fromIndex	= this.pageSize * (this.currentPage -1);
		
		// 结束索引
		int toIndex  = this.pageSize * this.currentPage > this.totalRecord ? this.totalRecord : this.pageSize * this.currentPage;
				
		this.dataList = sourceList.subList(fromIndex, toIndex);
	}
	
	public Pager(){
		
	}

	public Pager(int pageSize, int currentPage, int totalRecord, int totalPage,
			List<T> dataList) {
		super();
		this.pageSize = pageSize;
		this.currentPage = currentPage;
		this.totalRecord = totalRecord;
		this.totalPage = totalPage;
		this.dataList = dataList;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}

	public int getTotalRecord() {
		return totalRecord;
	}

	public void setTotalRecord(int totalRecord) {
		this.totalRecord = totalRecord;
	}

	public int getTotalPage() {
		return totalPage;
	}

	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}

	public List<T> getDataList() {
		return dataList;
	}

	public void setDataList(List<T> dataList) {
		this.dataList = dataList;
	}

}

© 著作权归作者所有

之渊
粉丝 13
博文 642
码字总数 195719
作品 0
佛山
程序员
私信 提问
HTML我帮您,JEE可视化界面快速接口开发

HTML我帮您,JEE可视化界面快速接口开发,轻松的指定数据源,不是写死的数据源,轻松实现对外开发一些服务接口,有些就是比较简单提供数据的xml,json,html之类。 [产品功能] 执行SQL结果,支...

luck332
2016/06/22
16
0
SpringBoot-vue 0.1发布, 一种高效Java全栈开发实践

背景 如今Web开发领域,当有人提到Java时,总会让人觉得臃肿、古老而过时且开发效率没有某些动态语言高效,甚至在此之前还有人高喊“Java 已死”;,但是事实真是如此吗?其实如果你一直关注着...

boylegu
2017/07/11
15
0
Java Web 框架 Latke v2.4.39,重写控制器层

简介 Latke('lɑ:tkə,土豆饼)是一个简单易用的 Java Web 应用开发框架,包含 MVC、IoC、事件通知、ORM、插件等组件。 在实体模型上使用 JSON 贯穿前后端,使应用开发更加快捷。这是 Latk...

88250
2018/12/21
989
14
请教Sharding-JDBC的分页的问题及优化方案?

初次接触到Sharding-JDBC,关于sharding-jdbc的分页问题请教。 关于Sharding-JDBC的部分贴子建议使用Sharding-JDBC的时候,尽量避免使用分页操作,因为分页操作会带来更多数据量的查询及结果...

晴朗天空
2017/06/27
1K
1
分享几个JAVA程序员们最容易犯的错误,你中了几枪?

都说Java语言是一门简单的编程语言,基于C++演化而来,剔除了很多C++中的复杂特性,但这并不能保证Java程序员不会犯错。那么对于广大的Java程序员来说,它们最常犯的几个错误都是什么样的呢?...

启示录是真的
2018/05/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

可见性有序性,Happens-before来搞定

写在前面 上一篇文章并发 Bug 之源有三,请睁大眼睛看清它们 谈到了可见性/原子性/有序性三个问题,这些问题通常违背我们的直觉和思考模式,也就导致了很多并发 Bug 为了解决 CPU,内存,IO ...

tan日拱一兵
25分钟前
2
0
网络七层模型与TCP/UDP

为了使全球范围内不同的计算机厂家能够相互之间能够比较协调的进行通信,这个时候就有必要建立一种全球范围内的通用协议,以规范各个厂家之间的通信接口,这就是网络七层模型的由来。本文首先...

爱宝贝丶
28分钟前
2
0
Jenkins World 贡献者峰会及专家答疑展位

本文首发于:Jenkins 中文社区 原文链接 作者:Marky Jackson 译者:shunw Jenkins World 贡献者峰会及专家答疑展位 本文为 Jenkins World 贡献者峰会活动期间的记录 Jenkins 15周岁啦!Jen...

Jenkins中文社区
46分钟前
8
0
杂谈:面向微服务的体系结构评审中需要问的三个问题

面向微服务的体系结构如今风靡全球。这是因为更快的部署节奏和更低的成本是面向微服务的体系结构的基本承诺。 然而,对于大多数试水的公司来说,开发活动更多的是将现有的单块应用程序转换为...

liululee
今天
7
0
OSChina 周二乱弹 —— 我等饭呢,你是不是来错食堂了?

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ 自行车丢了:给主编推荐首歌 《クリスマスの夜》- 岡村孝子 手机党少年们想听歌,请使劲儿戳(这里) @烽火燎原 :国庆快来,我需要长假! ...

小小编辑
今天
727
11

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部