Service的CRUD接口2:分页查询

1、添加配置

  1. MyBatis-Plus 提供了物理分页的功能,使用前我们需要要进行相关的插件配置:

逻辑分页与物理分页比较:

  • 逻辑分页:内存开销比较大,在数据量比较小的情况下效率比物理分页高;在数据量很大的情况下,内存开销过大,容易内存溢出,不建议使用。
  • 物理分页:内存开销比较小,在数据量比较小的情况下效率比逻辑分页还是低;在数据量很大的情况下,建议使用物理分页。
@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {
    //mybatis-plus分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        // paginationInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        // paginationInterceptor.setLimit(500);
        // 开启 count 的 join 优化,只针对部分 left join
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        return paginationInterceptor;
    }
}

2、page 方法

IService 接口提供了 page 方法实现分页查询,比如下面我们查询第一页的数据(每页两条记录):

@RestController
public class HelloController {
 
    @Autowired
    UserInfoService userInfoService;
 
    @RequestMapping("/test")
    public IPage<UserInfo> test(){
        LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(UserInfo::getPassWord,"123").lt(UserInfo::getAge,40);
        // 开始查询
        IPage<UserInfo> page = userInfoService.page(new Page<>(1,2), queryWrapper);
        return page;
    }
}

3、pageMaps 方法

pageMaps 的用法和上面的 page 很像,都是传入分页查询条件、以及查询构造器进行查询,然后返回一个 List。不同在于 pageMaps 返回的结果里面是 Map

注意Map 里的 key 为表字段名,而不是对应实体类的属性名。

@RestController
public class HelloController {
 
    @Autowired
    UserInfoService userInfoService;
 
    @RequestMapping("/test")
    public IPage<Map<String, Object>> test(){
        LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(UserInfo::getPassWord,"123").lt(UserInfo::getAge,40);
        // 开始查询
        IPage<Map<String, Object>> page  = userInfoService.pageMaps(new Page<>(1,2), queryWrapper);
        return page;
    }
}

4、自定义 SQL 语句的分页查询

  1. MyBatis-Plus 也支持对自定义的查询语句进行分页,假设我们在 mapper.xml 定义了一个 sql 语句:
<?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.example.demo.mapper.UserInfoMapper">
    <select id="selectPage2" resultType="com.example.demo.model.UserInfo">
        SELECT * FROM user_info WHERE age > #{age}
    </select>
</mapper>
  1. 对应的 mapper 只需要传递参数 Page 即自动会实现分页:

注意:递参数 Page 即自动分页,必须放在第一位(我们也可以继承 Page 实现自己的分页对象)

public interface UserInfoMapper extends BaseMapper<UserInfo> {
    IPage<UserInfo> selectPage2(Page<?> page, Integer age);
}
  1. UserInfoServiceImpl.java 里调用 mapper 自定义的分页方法:
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo>
        implements UserInfoService {
    public IPage<UserInfo> selectPage2(Page<?> page, Integer age) {
        // 不进行 count sql 优化,解决 MP 无法自动优化 SQL 问题,这时候你需要自己查询 count 部分
        // page.setOptimizeCountSql(false);
        // 当 total 为小于 0 或者设置 setSearchCount(false) 分页插件不会进行 count 查询
        // 要点!! 分页返回的对象与传入的对象是同一个
        return baseMapper.selectPage2(page, age);
    }
}
  • UserInfoService 接口中也添加相应的方法:
public interface UserInfoService extends IService<UserInfo> {
    IPage<UserInfo> selectPage2(Page<?> page, Integer age);
}

点击跳转至原文地址

--------------最后感谢大家的阅读,愿大家技术越来越流弊!--------------

在这里插入图片描述

--------------也希望大家给我点支持,谢谢各位大佬了!!!--------------

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐