文档章节

java 后端简单分页

之渊
 之渊
发布于 2017/07/20 20:11
字数 1015
阅读 250
收藏 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;
	}

}

© 著作权归作者所有

之渊
粉丝 14
博文 648
码字总数 199921
作品 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
38
0
Java Web 框架 Latke v2.4.39,重写控制器层

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

88250
2018/12/21
996
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

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
31分钟前
5
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
33分钟前
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
4
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
8
0
前端技术之:webpack热模块替换(HMR)

第一步:安装HMR中间件: npm install --save-dev webpack-hot-middleware 第二步:webpack配置中引入webpack对象 const webpack = require('webpack’); 第三步:增加devServer配置项: ho......

popgis
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部