为什么要自定义?
实际开发中需要联表查询,这需要我们自定义sql语句,因此,自带的分页查询就无法完成需求。
实现
实体类
public class UserDTO extends T_rbac_user implements Serializable {
private static final long serialVersionUID = 2818149523126963829L;
private String channelname;
private String rolename;
}
Service层定义接口,并实现方法
public interface IT_rbac_userService extends IService<T_rbac_user> {
IPage<UserDTO> SelectPage(IPage<UserDTO> page, Wrapper<UserDTO> queryWrapper);
}
@Override
public IPage<UserDTO> SelectPage(IPage<UserDTO> page, Wrapper<UserDTO> queryWrapper){
return page.setRecords(this.baseMapper.page(page, queryWrapper));
}
Mapper 中定义接口,并mapper文件中写sql
List<UserDTO> page(@Param("page") IPage<UserDTO> page,
@Param(Constants.WRAPPER) Wrapper<UserDTO> queryWrapper);
这里的参数注解要注意,就这么写
<select id="page" resultType="UserDTO">
SELECT t_rbac_user.id,t_rbac_user.account,t_rbac_user.status,
t_rbac_channel.channelname, t_rbac_role.rolename
FROM t_rbac_user
LEFT JOIN t_rbac_channel ON t_rbac_user.channelid = t_rbac_channel.id
LEFT JOIN t_rbac_role on t_rbac_user.roleid = t_rbac_role.id
<!-- 省略条件sql语句 -->
${}
</select>
这里使用了mybatis-plus的自定义的条件,这样使用时还是和单表表查询一样。
注意一个问题,由于是多表查询,写条件column时需要表名+column,否则可能会产生歧义。
实际使用
int pageNum = paramDTO.getPageNum() > 0? paramDTO.getPageNum():1;
int pageSize = paramDTO.getPageSize() > 0? paramDTO.getPageSize():20;
Page<UserDTO> page=new Page<>(pageNum,pageSize);
QueryWrapper<UserDTO> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("t_rbac_user.status", MyConstant.USER_STATUS_ABLE);
IPage<UserDTO> pageData = rbac_userService.SelectPage(page,queryWrapper);