既然出了这个问题,那么一定是Mybatis-plus用了一段时间了,那么这里我就不多赘述了,直接上代码和我所遇到的问题。这里mybatis-plus的多表关联复杂查询,在网上找了好久也没找到真正适用的,所以这里我整理了遇到的问题和如何解决的,如果你着急看解决方法,直接跳转到下面的Mybatis-plus分页实现一栏。
mybatis思想去实现分页查询(错误)
// service
Page<SysUser> SysUserPage(Page<SysUser> page, SysUser info);
// serviceImpl
@Override
public Page<SysUser> SysUserPage(Page<SysUser> page, SysUser info) {
return page.setRecords(baseMapper.SysUserPage(page, info));
}
// mapper
List<SysUser> SysUserPage(Page page, SysUser info);
mapper.xml
<select id="SysUserPage" resultMap="BaseResultMap">
select <include refid="Column_List"/> from sys_user u
left join sys_company c on c.company_id = u.company_id
where u.company_id = #{company_id}
</select>
这里会死报绑定异常,以为和Hibernate一样实现不了只需要自己写sql就可以,后来网上找了好久发现mybatis-plus里面所有的查询与修改必须使用QueryWrapper和UpdateWrapper。确实要把mybatis的思想转换一下了。
mybatis-plus 使用QueryWrapper做分页查询 (错误)
// controller
sysService.SysUserPage(new Page(1,10), new QueryWrapper<SysUser>().eq("company_id",52L));
// service
Page<SysUser> SysUserPage(Page<SysUser> page, QueryWrapper<SysUser> wrapper);
// serviceImpl
@Override
public Page<SysUser> SysUserPage(Page<SysUser> page, QueryWrapper<SysUser> wrapper) {
return page.setRecords(baseMapper.SysUserPage(page, wrapper));
}
// mapper
List<SysUser> SysUserPage(Page page, QueryWrapper<SysUser> wrapper);
mapper.xml
<select id="SysUserPage" resultMap="BaseResultMap">
select <include refid="Column_List"/> from sys_user u
left join sys_company c on c.company_id = u.company_id
</select>
这里虽说没报错,但是问题同样严重,QueryWrapper里的筛选条件没带入,所以怎么查询都是把所有的数据都给查询出来,再想找解决办法网上都是简单的查询,所以只能去看官网,终于在官网最新更新的文档里面找到了正确的语法。
Mybatis-plus分页实现 (解决)
官网实现: mp.baomidou.com/guide/page.…
// controller
QueryWrapper wrapper = Wrappers.<SysUser>query().eq("u.company_id",52L);
Page<SysUser> page = sysUserService.SysUserPage(new Page<>(1,10), wrapper);
logger.info(JSONObject.toJSONString(page));
// service
Page<SysUser> SysUserPage(Page<SysUser> page, QueryWrapper<SysUser> wrapper);
// serviceImpl
@Override
public Page<SysUser> SysUserPage(Page<SysUser> page, QueryWrapper<SysUser> wrapper) {
return page.setRecords(baseMapper.SysUserPage(page, wrapper));
}
// mapper
List<SysUser> SysUserPage(Page page, @Param(Constants.WRAPPER) QueryWrapper<SysUser> wrapper);
mapper.xml
<select id="SysUserPage" resultMap="BaseResultMap">
select <include refid="Column_List"/> from sys_user u
left join sys_company c on c.company_id = u.company_id
${ew.customSqlSegment}
</select>
官网是这么说的: 在使用了mybatis-plus之后, 自定义SQL的同时也想使用Wrapper的便利应该怎么办? 在mybatis-plus版本3.0.7得到了完美解决 版本需要大于或等于3.0.7, 以下两种方案取其一即可。他说的两种方案无非是在mapper里使用@Select和xml文件里写出多表的关系,至于参数由QueryWrapper传递。这里我专门挑了两张表同名字段,只需要加上对应表的命名就可以,至于value与实体类的数据类型对应上即可。关键在于Wrappers.query().eq("u.company_id",52L)该wrappers的生成语法注意下即可。
小结
还是先看看官方文档靠谱点儿。 有什么错误的地方欢迎指正。