返回 导航

SpringBoot / Cloud

hangge.com

SpringBoot - MyBatis-Plus使用详解6(Mapper的CRUD接口3:分页查询)

作者:hangge | 2020-05-14 08:10

六、Mapper 的 CRUD 接口3:分页查询 

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,selectPage 方法

(1)BaseMapper 提供的 selectPage 方法实现分页查询,比如下面我们查询第一页的数据(每页两条记录):
@RestController
public class HelloController {

    @Autowired
    UserInfoMapper userInfoMapper;

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

(2)返回结果如下:

(3)从日志信息可以发现,分页插件会识别是何数据库,然后自动拼接相应分页语句(若是 mysql 则自动通过 limit 分页,若是 oracle 则自动通过 rownum 进行分页)

3,selectMapsPage 方法

(1)selectMapsPage 的用法和上面的 selectPage 很像,都是传入分页查询条件、以及查询构造器进行查询,然后返回一个 List。不同在于 selectMapsPage 返回的结果里面是 Map
注意Map 里的 key 为表字段名,而不是对应实体类的属性名。
@RestController
public class HelloController {

    @Autowired
    UserInfoMapper userInfoMapper;

    @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 = userInfoMapper.selectMapsPage(new Page<>(1,2),
                queryWrapper);
        return page;
    }
}

(2)查询结果如下:

附:自定义 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>

(2)对应的 mapper 只需要传递参数 Page 即自动会实现分页:
注意:递参数 Page 即自动分页,必须放在第一位(我们也可以继承 Page 实现自己的分页对象)
public interface UserInfoMapper extends BaseMapper<UserInfo> {
    IPage<UserInfo> selectPage2(Page<?> page, Integer age);
}

(3)我们调用一下这个自定义方法进行测试:
@RestController
public class HelloController {

    @Autowired
    UserInfoMapper userInfoMapper;

    @RequestMapping("/test")
    public IPage<UserInfo> test(){
        IPage<UserInfo> page = userInfoMapper.selectPage2(new Page<>(1,2), 10);
        return page;
    }
}

(4)可以看到最终执行的 SQL 会自动拼接相应的分页语句:
评论

全部评论(0)

回到顶部