一、背景
mybatis-plus默认不支持多表的分页查询(该处默认配置分页插件),但是mybatis-plus提供了自定义的连表的分页查询方式:
mybatis-plus官网自定义分页
但是,官网也说明了会出现的问题:
mybatis-plus官网注意事项
下面我们将用代码详细说明一下这段话表的意思
二、单表分页
此处只要配置了分页插件基本没有任何问题,如果分页有问题,只需排查分页插件是否正确注入spring容器即可,示例如下:(ps:每页大小比数据大一条是为了体现问题,省的数据库核对)
三、连表分页(问题出现)
1.根据官网创建自定义分页
mapper
public interface SysDeptMapper extends BaseMapper<SysDeptPO> {
Page<SysDeptPO> pageDept(Page<SysDeptPO> page);
}
.mapper.xml
<select id="pageDept" resultType="com.wf.user.security.domain.po.SysDeptPO">
SELECT * FROM `sys_dept` sd INNER JOIN `sys_user` su ON sd.id = su.dept_id
</select>
2.测试:
@Test
public void testSelfPage(){
Page<SysDeptPO> page = deptMapper.pageDept(new Page<>(1, 10));
System.out.println("当前页"+page.getCurrent());
System.out.println("每页大小"+page.getSize());
System.out.println("总页数"+page.getPages());
System.out.println("数据总条数"+page.getTotal());
System.out.println("分页数据"+page.getRecords());
}
结果可以看出,没有问题。
3.将mapper.xml中的inner join修改为left join
.mapper.xml
<select id="pageDept" resultType="com.wf.user.security.domain.po.SysDeptPO">
SELECT * FROM `sys_dept` sd LEFT JOIN `sys_user` su ON sd.id = su.dept_id
</select>
4.测试:
很明显可以看出left join 分页数据的总条数不正确,正如官网所说“生成 countSql 时,如果 left join 的表不参与 where 条件,会将其优化掉”。
四、连表分页(问题解决)
那么该怎么解决呢?官网也给出了解决办法:
1.left join 的表参与where条件不就不会被优化掉了
修改mapper.xml
<select id="pageDept" resultType="com.wf.user.security.domain.po.SysDeptPO">
SELECT * FROM `sys_dept` sd LEFT JOIN `sys_user` su ON sd.id = su.dept_id where (su.is_delete = 0 or su.is_delete is null)
</select>
结果
分页问题解决
2.根据官网建议给表添加别名(推荐)
mapper.xml
<select id="pageDept" resultType="com.wf.user.security.domain.po.SysDeptPO">
select * from (SELECT sd.* FROM `sys_dept` sd LEFT JOIN `sys_user` su ON sd.id = su.dept_id) aa
</select>
如果有条件:
<select id="pageDept" resultType="com.wf.user.security.domain.po.SysDeptPO">
select * from (SELECT sd.* FROM `sys_dept` sd LEFT JOIN `sys_user` su ON sd.id = su.dept_id where sd.is_delete=0 and su.delete = 0) aa
</select>
结果:
分页问题解决
五、总结
1.两种方法都可以解决可以根据实际需求配合解决,如果有给定条件推荐第一种,如果没有,或者配合自定义Wrapper使用第二种。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现