Bootstrap

使用mybatis-plus实现分页查询

第一步,在maven中导入mybatis-plus依赖。

<dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-boot-starter</artifactId>
   <version>3.4.2</version>
</dependency>

第二步,在application.yml中添加如下配置:

mybatis-plus:
  configuration:
    #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: ASSIGN_ID

第二步,创建mybatis-plus配置类并添加@Configuration注解,然后在MybatisPlusInterceptor拦截器对象中添加分页拦截器,返回对象并注入到bean容器中。
以下是具体代码:

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加分页查询拦截器
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

第三步,在controller层接收前端传来的分页信息,包括当前页号(page)、页大小(pageSize)、查询关键字(name)等。根据分页信息创建Page类对象和查询条件构造器LambdaQueryWrapper类对象,然后使用mybatis-plus提供的service层对象中的page(IPage<T> page, Wrapper<T> queryWrapper)方法,该方法会将查询结果赋值给传入的第一个参数page对象,之后我们就可以直接给前端返回查询结果pageInfo对象。
下面来看代码:

@GetMapping("/page")
    public R<Page> page(int page, int pageSize, String name) {
        log.info("page: {}, pageSize: {}, name: {}", page,pageSize,name);
        // 创建Page类对象
        Page<Employee> pageInfo = new Page(page, pageSize);
        // 创建查询条件构造器LambdaQueryWrapper类对象
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
		// 根据条件查询
        queryWrapper.like(StringUtils.isNotEmpty(name),Employee::getName, name);

        queryWrapper.orderByDesc(Employee::getUpdateTime);
        // 查询结果返回到pageInfo中的records属性中
        employeeService.page(pageInfo, queryWrapper);
        // 返回查询结果pageInfo对象给前端
        return R.success(pageInfo);
    }

这里我们需要注意一下为什么可以直接返回pageInfo这个对象作为结果,我们来查看Page类中的属性以及service层的page方法:

Page类:

public class Page<T> implements IPage<T> {
    private static final long serialVersionUID = 8545996863226528798L;
    protected List<T> records;		// 查询结果
    protected long total;			// 总页数
    protected long size;			// 页大小
    protected long current;			 // 当前页
    protected List<OrderItem> orders;
    protected boolean optimizeCountSql;
    protected boolean isSearchCount;
    protected boolean hitCount;
    protected String countId;
    protected Long maxLimit;
}

当执行完service层的page方法后会将查询结果封装到Page类对象中的records属性中。

下面看一下service层page方法是如何实现该操作的:
service层的page方法将调用mapper层的selectPage方法,并且将查询结果封装到IPage对象中返回。
以下是selectPage方法法定义:

IPage<T> selectPage(IPage<T> page, @Nullable Wrapper<T> queryWrapper);

其中,IPage 是 Mybatis-Plus 提供的分页对象接口,T 表示实体类类型,page 参数是分页对象,queryWrapper 参数是查询条件。
调用 selectPage 方法时,需要传入一个分页对象,该对象包含了分页信息(当前页码、每页显示数量等)以及查询结果。同时,还可以传入一个查询条件,用于过滤查询结果。
在执行 selectPage 方法时,Mybatis-Plus 会根据传入的分页对象进行分页查询,并将查询结果封装到分页对象中返回。具体的 SQL 查询语句由 Mybatis-Plus 自动生成,无需手动编写。

以上就是使用mybatis-plus实现分页查询的步骤,实际上我们只需配置分页拦截器并提供分页信息及查询条件,剩下的SQL操作都由mybatis-plus框架帮我们实现好了。

;