一、背景

mybatis-plus默认不支持多表的分页查询(该处默认配置分页插件),但是mybatis-plus提供了自定义的连表的分页查询方式:
image

                                mybatis-plus官网自定义分页

但是,官网也说明了会出现的问题:
image
mybatis-plus官网注意事项
下面我们将用代码详细说明一下这段话表的意思
二、单表分页
此处只要配置了分页插件基本没有任何问题,如果分页有问题,只需排查分页插件是否正确注入spring容器即可,示例如下:(ps:每页大小比数据大一条是为了体现问题,省的数据库核对)
image

三、连表分页(问题出现)
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());
    }

image

结果可以看出,没有问题。
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.测试:
image
很明显可以看出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>

结果
image
分页问题解决
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>

结果:
image
分页问题解决
五、总结
1.两种方法都可以解决可以根据实际需求配合解决,如果有给定条件推荐第一种,如果没有,或者配合自定义Wrapper使用第二种。