Mybatis-plus 自定义分页查询

时间:2025-02-16 07:01:16

为什么要自定义?

实际开发中需要联表查询,这需要我们自定义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);