前言
由于工作中经常使用到MybatisPlus的框架,对此详细连接Page类有利于开发,更加游刃有余
对于该类的源码:baomidou / mybatis-plus 中的Page源码
- MybatisPlus的框架:MyBatis-plus从入门到精通(全)
- 实战中的其他CRUD:【Java项目】实战CRUD的功能整理(持续更新)
- 学习JAVA其他框架:java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
1. 基本知识
主要的包来源于:com.baomidou.mybatisplus.extension.plugins.pagination.Page
,这个才是 MyBatis-Plus 框架中的分页类。需要与其他Page包区分开!
一、概念
Page 类是用于封装分页信息的 Java 类,它主要用于在数据库查询时支持分页查询操作。
二、分页查询的作用
- 提高查询性能:当数据库中数据量庞大时,一次性查询所有数据可能导致性能问题。通过分页查询,可以限制每次查询的数据量,提高查询性能。
- 减轻数据库负担:分页查询可以减轻数据库的负担,降低资源消耗,特别是在大型数据集的情况下。
三、支持不同数据库的分页查询
MyBatis-Plus 的 Page 类封装了不同数据库的分页查询语句,使得在不同数据库中实现分页更加灵活。
四、常见用法
在 MyBatis-Plus 中,通常会将 Page 对象传递给查询方法,然后在查询中使用它的信息进行分页操作,以获取指定页的数据。
五、分页查询的关键属性
current
:当前页码,表示当前查询的是第几页的数据。size
:每页记录数,表示每页显示多少条记录。total
:总记录数,表示满足查询条件的总记录数。pages
:总页数,通过总记录数和每页记录数计算得出。
六、分页查询的方法链式调用
MyBatis-Plus 的 Page 类支持方法链式调用,可以通过链式调用设置和获取分页信息,使代码更加简洁。
(通过 page 对象获取分页信息和查询结果)
/*
selectPage 方法是 MyBatis-Plus 提供的分页查询方法,它会根据传入的 Page 对象进行分页查询,并将结果设置回 Page 对象中
*/
Page<User> page = new Page<>(1, 10);
page.setRecords(userMapper.selectPage(page, new QueryWrapper<User>().eq("status", 1)).getRecords());
2. 常用方法
构造方法:
Page(long current, long size)
:通过指定当前页码和每页记录数创建分页对象。Page(long current, long size, long total)
:通过指定当前页码、每页记录数和总记录数创建分页对象。
其属性除了上面的四个还有如下:
常用方法:
setRecords(List<T> records)
:设置当前页的记录列表。getRecords()
:获取当前页的记录列表。setTotal(long total)
:设置总记录数。getTotal()
:获取总记录数。setCurrent(long current)
:设置当前页码。getCurrent()
:获取当前页码。setSize(long size)
:设置每页记录数。getSize()
:获取每页记录数。getPages()
:计算总页数。hasPrevious()
:判断是否有上一页。hasNext()
:判断是否有下一页。
示例的Demo如下:
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
public class pagedemo {
public static void main(String[] args) {
// 创建分页对象,指定当前页码为1,每页记录数为10
Page<String> page = new Page<>(1, 10);
// 模拟从数据库中查询总记录数
long total = 100;
page.setTotal(total);
// 输出分页信息
System.out.println("当前页码:" + page.getCurrent());
System.out.println("每页记录数:" + page.getSize());
System.out.println("总记录数:" + page.getTotal());
System.out.println("总页数:" + page.getPages());
System.out.println("是否有上一页:" + page.hasPrevious());
System.out.println("是否有下一页:" + page.hasNext());
}
}
截图如下:
3. 实战
以实战来分析后端对于该类是如何操作的!
对于自定义分页的Controller类:
/**
* 自定义分页
*/
@GetMapping("/page")
@ApiOperationSupport(order = 3)
@ApiOperation(value = "分页", notes = "传入User")
public R<IPage<UserVO>> page(UserVO userVO, Query query) {
IPage<UserVO > pages = userService.selectUserPage(Condition.getPage(query), userVO);
return R.data(pages);
}
对应Service中的方法如下:
public interface UserService extends BaseService<User> {
/**
* 自定义分页
*
* @param page
* @param userVO
* @return
*/
IPage<UserVO> selectUserPage(IPage<UserVO> page, UserVO userVO);
}
对应的实现类如下:
@Service
public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implements UserService{
@Override
public IPage<UserVO> selectUserPage(IPage<UserVO> page, UserVO userVO) {
return page.setRecords(baseMapper.selectUserPage(page, userVO));
}
}
对应的Mapper如下:
public interface UserMapper extends BaseMapper<User> {
/**
* 自定义分页
*
* @param page
* @param tyreRepareOrderVO
* @return
*/
List<UserVO> selectUserPage(IPage page, UserVO userVO);
}
其中selectUserPage涉及xml文件,主要与数据库对接:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.xx.mapper.UserMapper">
<!-- 通用查询映射结果 -->
<resultMap id="userResultMap" type="org.xx.entity.UserMapper">
<result column="id" property="id"/>
<result column="create_user" property="createUser"/>
<result column="create_dept" property="createDept"/>
</resultMap>
<select id="selectUserPage" resultMap="userResultMap">
select * from User where is_deleted = 0
</select>
</mapper>
对于上述框架还涉及Mybatis的基本知识,可看这篇文章进行补充:Mybatis从入门到精通(全)