MyBatisPlus分页插件的使用
MyBatisPlus自带分页插件,只需简单的配置就可以实现分页功能。
一、实现一个简单的分页测试功能
1. 引入mybatis-plus依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
2. 创建配置类
在springboot项目的src目录下创建一个config包,包下创建类MyBatisPlusConfig。
- 添加配置类注解@Configuration
- 需要扫描mapper接口所在的包(主类中的注解移过来)
- 配置分页插件(需要注解@Bean)
配置类代码如下:
package com.example.springboot.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.example.springboot.mapper")
public class MyBatisPlusConfig {
//配置分页插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//数据库类型是MySql,因此参数填写DbType.MYSQL
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
3. 创建数据库表及相关实体类
- 在数据库mybatis_plus中创建表t_user,建表语句如下
CREATE TABLE `t_user` (
`uid` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_name` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '姓名',
`age` int DEFAULT NULL COMMENT '年龄',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
`is_deleted` int DEFAULT '0',
`sex` int DEFAULT NULL,
PRIMARY KEY (`uid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1695430495027957767 DEFAULT CHARSET=utf8mb3;
- 创建表t_user对应的实体类User
在src目录下的entity包下创建实体类User,可以使用mybatisx这个插件快速生成实体类、接口类以及接口映射文件,关于如何该插件的使用方法,可以参考下面这篇博客:
IDEA好用插件:MybatisX快速生成接口实体类mapper.xml映射文件
mybatisx生成的User实体类如下。
@TableName(value ="t_user")
@Data
public class User implements Serializable {
/**
* 主键ID
*/
@TableId(type = IdType.AUTO)
private Long uid;
/**
* 姓名
*/
private String userName;
/**
* 年龄
*/
private Integer age;
/**
* 邮箱
*/
private String email;
/**
*
*/
private Integer isDeleted;
/**
*
*/
private Integer sex;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
//...这里省略生成的其他方法
}
使用mybatisx插件生成User实体类、UserMapper接口以及UserMapper.xml映射文件。
4. 创建一个测试类MyBatisPlusTest
- 在MyBatisPlusTest测试类上添加@SpringBootTest注解
- 对使用的mapper注解进行注入,使用AutoWired注解
@Autowired
UserMapper userMapper;
- 编写测试类方法
userMapper方法里有一个selectPage(),这个方法参数有两个,第一个是Page类型的(分页对象),第二个是Wapper类型的,因此我们创建这两个对象。
Page类的泛型为我们操作的实体类对象,参数为当前页的页码(current),个每页显示的条数(size),语句为:
Page<User> page = new Page<>(2,3);
第二个参数Wapper类型为条件构造器的条件,因为这里查询的是所有数据(即没有条件),所以Wapper类型的数据填null。
输出page对象,执行可以看到输出的是page的内存地址。
package com.example.springboot;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.springboot.entity.User;
import com.example.springboot.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class MyBatisPlusTest {
@Autowired
UserMapper userMapper;
@Test
public void testPage() {
Page<User> page = new Page<>(2, 3);
userMapper.selectPage(page, null);
System.out.println(page);
//page对象为 com.baomidou.mybatisplus.extension.plugins.pagination.Page@c412556
System.out.println(page.getRecords());//获取分页记录
System.out.println(page.getPages());//总页数
System.out.println(page.getTotal());//总记录数
System.out.println(page.hasNext());//是否有下一页
System.out.println(page.hasPrevious());//是否有上一页
}
}
二、自定义分页功能
任务需求:以用户年龄为条件查询用户信息并分页。
自定义的page方法返回值必须是page。
- 创建mapper接口
在接口类UserMapper里创建方法SelectPageByAge,代码如下。
/**
方法返回值仍未Page对象,接受的第一个参数也为Page对象,用来自定义分页信息
**/
Page<User> selectPageByAge(@Param("page") Page<User> page, @Param("age") Integer age);
- 在UserMapper.xml中编写方法
<select id="selectPageByAge" resultType="User">
select uid,user_name,age,email
from t_user where age >= #{age}
</select>
- 创建测试方法
@Test
public void testPageByAge(){
Page<User> page = new Page<>(1,3);
userMapper.selectPageByAge(page,20);//查询年龄大于20岁的记录并分页
System.out.println(page.getRecords());//获取分页记录
System.out.println(page.getPages());//总页数
System.out.println(page.getTotal());//总记录数
System.out.println(page.hasNext());//是否有下一页
System.out.println(page.hasPrevious());//是否有上一页
}
参考文章: