MyBatis-Plus(十)Service的CRUD接口2:分页查询
Service的CRUD接口2:分页查询1、添加配置MyBatis-Plus 提供了物理分页的功能,使用前我们需要要进行相关的插件配置:逻辑分页与物理分页比较:逻辑分页:内存开销比较大,在数据量比较小的情况下效率比物理分页高;在数据量很大的情况下,内存开销过大,容易内存溢出,不建议使用。物理分页:内存开销比较小,在数据量比较小的情况下效率比逻辑分页还是低;在数据量很大的情况下,建议使用物理分页。@
·
Service的CRUD接口2:分页查询
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 语句的分页查询
- 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>
- 对应的 mapper 只需要传递参数 Page 即自动会实现分页:
注意:递参数 Page 即自动分页,必须放在第一位(我们也可以继承 Page 实现自己的分页对象)
public interface UserInfoMapper extends BaseMapper<UserInfo> {
IPage<UserInfo> selectPage2(Page<?> page, Integer age);
}
- 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);
}
--------------最后感谢大家的阅读,愿大家技术越来越流弊!--------------

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


所有评论(0)