实现分页几种常见方式(SpringBoot)
实现分页
作用:分页展示,减少数据的处理量
封装一个MyBatisUtils工具类
一、直接使用sql中的关键字limit(物理分页)
使用Mybatis实现分页,核心仍为SQL
写mybatis的接口UserMapper
List<User> getUserByLimit(Map<String,Integer> map);
写Mapper.xml
<select id="getUserByLimit" parameterType="map" resultType="user">
select * from mybatis.users limit #{startIndex},#{pageSize}
</select>
可以测试了
@Autowire
UserMapper mapper; //分页
@Test
public void getUserByLimit(){
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("startIndex",0);//从第0个开始
map.put("pageSize",10);//每页10个 List<User> userList = mapper.getUserByLimit(map);
for (User user : userList) {
System.out.println(user);
}
}
}
二、逻辑分页
/**
* 逻辑分页
* @param list 全量数据
* @param pageNum 页码
* @papram pageSize 每页显示条数
*/
private Map<String, Object> getLogicPage(List list, int pageNum, int pageSize){
Map<String, Object> map = new HashMap<>();
int firstIndex = (pageNum -1) * pageSize;
int lastIndex = 0;
int total = 0;
List subList = null;
if(list == null || list.size() == 0) {
subList = new ArrayList<>();
}else {
if(firstIndex > list.size()-1 || firstIndex < 0) {
subList = new ArrayList<>();
}
lastIndex = pageNum * pageSize;
if(lastIndex > list.size()) {
lastIndex = list.size();
}
subList = list.subList(firstIndex, lastIndex);
}
map.put("total", total);
map.put("list", subList);
return map;
}
三、使用RowBounds分页
使用代码实现分页,不需要用SQL 逻辑分页
MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,然在再根据 offset 和 limit 截断记录返回,表示从第几条开始,取多少条。
数据量小时,RowBounds不失为一种好办法。但是数据量大时,实现拦截器就很有必要了。
写接口UserInfoDao
//RowBounds分页
List<UserInfo> queryAllUserByRowBounds(RowBounds rowBounds);
写mapper.xml配置文件
<!--RowBounds分页-->
<select id="queryAllUserByRowBounds" resultType="UserInfo">
select * from userinfo
</select>
可以测试了
@Autowired
UserInfoService userInfoService; @GetMapping("/listByRowBounds")
public List<UserInfo> queryAllUserByRowBounds(@RequestParam(defaultValue = "1")Integer pageNum, @RequestParam(defaultValue = "10")Integer pageSize){
return userInfoService.queryAllUserByRowBounds(new RowBounds((pageNum-1)*pageSize,pageSize));
}
四、使用分页插件pageHelper(拦截器)
第一种:使用PageHelper
导入pagehelper依赖
<!-- pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
Dao层
@Mapper
public interface UserMapper{
// 接口上添加分页参数必须是pageNum, pageSize 自动会分页
@Select("select * from user")
List<User> queryByPageHelper(@Param("pageNum")int pageNum, @Param("pageSize")int pageSize);
}
Service实现类
@ApiOperation("使用PageHelper来进行分页")
@GetMapping("/listByPageHelper")
public void queryByPageHelper(@RequestParam(defaultValue = "1")Integer pageNum, @RequestParam(defaultValue = "10")Integer pageSize) {
//利用PageHelper分页查询
/**
注意:这个一定要放查询语句的前一行,否则无法进行分页,因为它对紧随其后第一个sql语句有效
*/
PageHelper.startPage(pageNum, pageSize);
List<User> userList = userMapper.queryByPageHelper(pageNum,pageSize);
PageInfo<User> pageInfo = new PageInfo<User>(userList);
}
第二种:不使用PageHelper,实用配置分页参数
配置文件
#mybatis分页
pagehelper:
helper-dialect: mysql
reasonable: true
support-methods-arguments: true
params: count=countSql
Service实现类 直接查
@ApiOperation("使用PageHelper来进行分页")
@GetMapping("/listByPageHelper")
public void queryByPageHelper(@RequestParam(defaultValue = "1")Integer pageNum, @RequestParam(defaultValue = "10")Integer pageSize) {
//不使用PageHelper ,自动会在Mapper接口分页
List<User> userList = userMapper.queryByPageHelper(pageNum, pageSize);
}
五、使用List的subList方法
List下的方法:
List<E> subList(int fromIndex, int toIndex); //参数一:集合元素下标,参数二:第几个元素。。。
/*例如list.subList(0,2) 即为从下标0开始,取到第二个元素,结果为下标0,1的元素*/
分页算法简单使用:
public void queryBySubList(Integer pageNum,Integer pageSize) {
List<User> list = userMapper.queryByPage();
try {
list.subList(pageSize*(pageNum-1),pageSize*pageNum); //从下标0开始,找到第10个 即0-9
} catch (IndexOutOfBoundsException e) {
list.subList(pageSize*(pageNum-1),list.size()); //数组越界异常时,取到最后一个元素
}
PageInfo<User> pageInfo = new PageInfo<User>(userList);
}
Mybatis-Plus 自带的分页插件
@AutoWire
BookMapper bookMapper;
/**
* 分页查询
*/
@Test
public void testSelectPage(){
//current 目前的
Page<Book> page=new Page<>(1,5);
bookMapper.selectPage(page, Wrappers.<Book>lambdaQuery().ge(Book::getBookId,2));
List<Book> record=page.getRecords();
record.forEach(System.out::println);
//常用方法
// boolean hasNext=page.hasNext();
// boolean hasPrevious=page.hasPrevious();
// System.out.println(hasNext+" "+hasPrevious);
}
实现分页几种常见方式(SpringBoot)的更多相关文章
- 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式
适用于app.config与web.config的ConfigUtil读写工具类 之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...
- C# DataGridView绑定数据源的几种常见方式
开始以前,先认识一下WinForm控件数据绑定的两种形式,简单数据绑定和复杂数据绑定. 1. 简单的数据绑定 例1 using (SqlConnection conn = new SqlConnect ...
- jedis操作redis的几种常见方式总结
Redis是一个著名的key-value存储系统,也是nosql中的最常见的一种,这篇文章主要给大家总结了关于在java中jedis操作redis的几种常见方式,文中给出了详细的示例代码供大家参考学习 ...
- Tomcat 部署项目的几种常见方式
转自:https://www.cnblogs.com/yuht/p/5714624.html https://www.cnblogs.com/ysocean/p/6893446.html Tomcat ...
- 恶意软件开发——shellcode执行的几种常见方式
一.什么是shellcode? shellcode是一小段代码,用于利用软件漏洞作为有效载荷.它之所以被称为"shellcode",是因为它通常启动一个命令shell,攻击者可以从 ...
- C# 实现AOP 的几种常见方式
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的中统一处理业务逻辑的一种技术,比较常见的场景是:日志记录,错误捕获 ...
- Azure登陆的两种常见方式(user 和 service principal登陆)
通过Powershell 登陆Azure(Azure MoonCake为例)一般常见的有两种方式 1. 用户交互式登陆 前提条件:有一个AAD account 此种登陆方式会弹出一个登陆框,让你输入一 ...
- Tomcat部署项目的几种常见方式
以前学习的时候只知道在Eclipse或者MyEclipse中发布项目到Tomcat,最近实习时发现不同的项目还有不同的发布方式,所以特地学习了Tomcat发布项目的方式,在此记录下来. 1 直接将we ...
- web实现数据交互的几种常见方式
前言 在当今社会,作为一名前端程序猿,并不是一昧的去制作静态页面就可以满足滴:你说你会制作网页,好吧,只能说你算是一个前端程序猿.但这是你作为一个程序猿最基本的能力,并不会为你进行加分: 我们都明白, ...
- SQL判断NULL的几种常见方式
第一种 where XX ='NULL' ,XX字段存的值就是NULL这四个字符, 第二种 where XX is null ,XX字段什么也没存,这是数据库的判断语法, 第三种 where isnu ...
随机推荐
- mongodb查询某个字段数据
如下 db.集合名.find( {}, {需要查询的字段:1, _id:0} ) 例如 db.userInfo.find({}, {'created_at':1, _id: 0}) 默认会显示 _id ...
- DeepSeek 3FS 与 JuiceFS:架构与特性比较
近期,DeepSeek 开源了其文件系统 Fire-Flyer File System (3FS),使得文件系统这一有着 70 多年历时的"古老"的技术,又获得了各方的关注.在 A ...
- Docker学习笔记:Docker 网络配置
2016-10-12 10:29:00 先知 转贴 51964 图: Docker - container and lightweight virtualization Dokcer 通过使用 Li ...
- MySQL-SQL调优-引擎选错索引或者不使用索引分析 和 字符串加索引的方式思考
优化器生成最优执行计划需要考虑的因素 MySQL有一个优化器,专门负责生成最优的查询计划,生成最优查询计划可能考虑的因素有: 扫描行数 是否排序 是否需要回表 是否需要临时表 等等 在不同的因素作用下 ...
- 深入理解Hadoop读书笔记-2
背景 公司的物流业务系统目前实现了使用storm集群进行过门事件的实时计算处理,但是还有一个需求,我们需要存储每个标签上传的每条明细数据,然后进行定期的标签报表统计,这个是目前的实时计算框架无法满足的 ...
- 创建的容器都是没有指定 volume的,为什么docker volume ls命令会看到很多volume列表?
有那么一天,停止了世界所有的容器(在你电脑上),执行以下命令 docker volume ls docker volume ls | wc -l 哎呦,我去,怎么这么多啥玩意,再执行以下命令看占了我多 ...
- SpringAI用嵌入模型操作向量数据库!
嵌入模型(Embedding Model)和向量数据库(Vector Database/Vector Store)是一对亲密无间的合作伙伴,也是 AI 技术栈中紧密关联的两大核心组件,两者的协同作用构 ...
- ElasticStack从入门到精通
什么是ElasticStack ElasticStack早期名称为elk elk代表了三个组件 ElasticSearch 负责数据存储和检索. Logstash 负责数据的采集,将源数据采集到Ela ...
- Redis 分布式锁的正确实现原理演化历程与 Redission的源码
当线程A,加锁并设置过期时间-->执行业务-->判断锁id完成后,但这时CPU线程调度其它工作了在这里卡住了, 而且也到了锁的过期时间了被动被删除,当线程B,加锁并设置过期时间--> ...
- MySQL 中 DELETE、DROP 和 TRUNCATE 的区别是什么?
MySQL 中 DELETE.DROP 和 TRUNCATE 的区别 在 MySQL 中,DELETE.DROP 和 TRUNCATE 都是常用于删除数据的操作,但它们在功能.性能.用途和实现方式上有 ...