实现分页几种常见方式(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);
}
本文来自博客园,作者:没有烦恼的猫猫,转载请注明原文链接:https://www.cnblogs.com/maomao777/p/17035599.html
分类:
springboot
, Spring体系内容 / ssm
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)