分页插件
添加分页插件
分页就是将查询结果集的一部分取出来方便用户一页一页看 ,因为一次性把数据全部都查出来会降低用户的阅读体验
limit startIndex,length
: startIndex是起始数据的下标(每页的起始索引),length是取几条数据(每页显示几条数据)limit (pageNo-1) * pageSize,pageSize
: 每页显示pageSize条记录,显示第pageNo页的数据- 如果起始下标是0可以省略,同样如果显示第一页的数据页码可以省略
MyBatis Plus自带分页插件只要简单的配置即可实现分页功能
- 在MyBatis Plus底层,我们先写了查询功能然后它对我们的查询操作进行拦截,增加一些额外的操作红再执行查询操作从而达到分页的功能
第一步: 添加配置类config.MybatisPlusConfig
,开启MyBatis Plus的插件功能
- 先向容器中注入MyBatis Plus配置插件的对象
MybatisPlusInterceptor
,然后在插件对象内部添加分页插件对象PaginationInnerInterceptor
@Configuration
@MapperScan("com.atguigu.mybatisplus.mapper") //可以将启动类中的扫描Mapper接口的注解移到此处
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
// 配置MyBatis Plus中插件的对象
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 在插件对象中添加分页插件并设置数据库类型(不同数据库分页功能的实现过程不同)
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
第二步: 使用MyBatis Plus提供的方法, 添加测试类测试分页功能
方法 | 功能 |
---|---|
Page<实体类> Page(当前页码,每页显示的总记录数) | 创建一个Page对象,存储查询到的分页数据 和分页相关的信息 |
Page<实体类> selectPage(Page page,Wrapper queryWrapper) | BaseMapper提供的分页查询的方法,条件构造器为null时表示查所有 |
Page<实体类> page(Page page,Wrapper queryWrapper) | IService接口提供的分页查询的方法,条件构造器为null时表示查所有 设置分页的相关参数(当前页码,每页显示的总记录数) |
获取Page对象存储的分页数据
和分页相关的信息
的方法,用来给前端设置页码中分页相关的超链接和按钮
方法名 | 功能 |
---|---|
List <实体类> getRecords | 获取查询到的分页数据 |
long getCurrent | 获取当前页的页码 |
long getSize | 获取每页显示的总记录数 |
long getTotal | 获取总记录条数(注意状态是未删除的记录) |
long getPages | 获取总页数 |
boolean hasPrevious | 判断是否有上一页 |
boolean hasNext | 判断是否有下一页 |
@springBootTest
public class MybatisPlusPluginsTest{
@Autowired
private UserMapper userMapper;
// 查询所有的用户并按照分页展示
/*
SELECT
id,user_name AS name,age,email,is_deleted
FROM
t_user
WHERE
is_deleted=0 LIMIT ? ?
*/
@Test
public void testPage(){
//添加分页对象设置分页参数即当前页码数和每页显示的记录数
Page<User> page = new Page<>(2, 5);
//条件构造器queryWrapper为null表示查询所有数据
userMapper.selectPage(page, null);
//获取分页对象Page封装的分页数据
List<User> list = page.getRecords();
//获取分页相关的数据
list.forEach(System.out::println);
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());
}
}
User(id=3, name=Tom, age=28, email=test3@baomidou.com, isDeleted=null)
User(id=4,name=Sandy, age=21, email=test4@baomidou.com, isDeleted=null)
User(id=5, name=Billie,age=24, email=test5@baomidou.com, isDeleted=null)
User(id=8, name=ybc1, age=21,email=null, isDeleted=null)
User(id=9, name=ybc2, age=22, email=null, isDeleted=null)
当前页:2 每页显示的条数:5 总记录数(只包含删除状态是未删除的数据):12 总页数:3 是否有上一页:true 是否有下一页:true
自定义查询语句用分页插件
第一步: 在UserMapper
中自定义接口方法根据年龄查询用户列表并按照分页显示
- 从MyBatis Plus自带的selectPage方法可以看出要想使用分页插件的功能,方法的第一个参数需要接收一个Page<实体类>对象并且返回值也是一个Page对象
@Repository
public interface UserMapper extends BaseMapper<User> {
Page<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);
}
第二步: 在application.yml
文件中配置类型别名所对应的包,这样该包下所有类的别名默认就是类的简类名且不区分大小写
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 设置MyBatis-Plus的全局配置
global-config:
db-config:
# 设置实体类所对应的表的统一前缀
table-prefix: t_
# 设置统一的主键生成策略
id-type: auto
# 配置类型别名所对应的包
type-aliases-package: com.atguigu.mybatisplus.pojo
第三步: 在UserMapper.xml
中编写自定义SQL,因为最后的结果集是要封装到User对象的属性中,所以返回的参数是User对象
<?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="com.atguigu.mybatisplus.mapper.UserMapper">
<!--IPage<User> selectPageVo(Page<User> page, Integer age);-->
<select id="selectPageVo" resultType="User">
SELECT id,user_name,age,email FROM t_user WHERE age > #{age}
</select>
</mapper>
第四步: 在测试类中测试自定义的接口方法
@Test
public void testSelectPageVo(){
//设置分页参数
Page<User> page = new Page<>(1, 5);
userMapper.selectPageVo(page, 20);
//获取分页数据
List<User> list = page.getRecords();
list.forEach(System.out::println);
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());
}