MybatisPlus分页

本文介绍了如何使用MyBatisPlus进行单表和多表分页查询,并展示了如何封装通用的CommonPage类以简化返回结果。在Controller层和Service层分别展示了分页查询的实现,同时提到在需要返回额外字段时,如何封装Dto对象来满足需求。
摘要由CSDN通过智能技术生成

        当我们对单表数据进行查询的时候可以直接使用MybatisPlus的分页方法最好封装一个通用的CommonPage

CommonPage

public class CommonPage<T> {
    private Integer pageNum;
    private Integer pageSize;
    private Integer totalPage;
    private Long total;
    private List<T> list;

    /**
     * 将MyBatis Plus 分页结果转化为通用结果进行返回
     */
    public static <T> CommonPage<T> restPage(Page<T> pageResult) {
        CommonPage<T> result = new CommonPage<>();
        result.setPageNum(Convert.toInt(pageResult.getCurrent()));
        result.setPageSize(Convert.toInt(pageResult.getSize()));
        result.setTotal(pageResult.getTotal());
        result.setTotalPage(Convert.toInt(pageResult.getTotal()/pageResult.getSize()+1));
        result.setList(pageResult.getRecords());
        return result;
    }

    public Integer getPageNum() {
        return pageNum;
    }

    public void setPageNum(Integer pageNum) {
        this.pageNum = pageNum;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(Integer totalPage) {
        this.totalPage = totalPage;
    }

    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }

    public Long getTotal() {
        return total;
    }

    public void setTotal(Long total) {
        this.total = total;
    }
}

直接看个例子,大家就明白了。

Controller层

  // Result为自定义的统一返回结果
    public Result<CommonPage<CarInfoLog>> getCarInfoLogList(
            @RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize,
            @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) {
            // 这里CarInfoLog为表对象model,传递前端传过来的pageNum,pageSize
        Page<CarInfoLog> carInfoLogList = carInfoLogService.getCarInfoLogList(pageNum, pageSize);
        // restPage为统一风格返回的page对象
        return Result.success(CommonPage.restPage(carInfoLogList));
    }

ServiceImpl层

 public Page<CarInfoLog> getCarInfoLogList(Integer pageNum, Integer pageSize) {
        // 直接new page对象,前面泛型为需要进行分页的对象,可以自己定义条件构造器
        进行条件构造,返回的page()两个参数,不需要其他条件就直接传null
        Page<CarInfoLog> page = new Page<>(pageNum, pageSize);
        return page(page, null);
    }

到这里就结束了单表的分页查询。

        在业务中前端可能要求我们多给他返回一些其他的字段,这里我只写一种我常用的多表分页查询。

        在这里首先我们要封装一个对象,一般大家都是封装Vo,我这里直接封装的Dto,大家参考的时候可以进行一下修改,至于Vo和Dto以及requestDto,responseDto,大家可以自己去了解一下,本人比较懒,写的时候就不做区分了。

AdminAndRoleIdDto

        封装AdminAndRoleIdDto的时候可以看一下要返回给前端的大量数据来源于哪一个实体类,直接继承他就好了,把那些少量数据写在AdminAndRoleIdDto里面。

@Getter
@Setter
// 因为我大量的数据来源都是SysAdmin实体,所以直接继承
public class AdminAndRoleIdDto extends SysAdmin {
// 需要额外返回给前端的关联表的角色id
    @ApiModelProperty(value = "角色id")
    private Long roleId;
}

Controller层

    @ApiOperation("分页获取所有用户信息")
    @RequestMapping(value = "/list", method = RequestMethod.GET)
    @ResponseBody
    public Result<CommonPage<AdminAndRoleIdDto>> getAdminAndRoleIdList(
            @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
            @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) {
        return Result.success(CommonPage.restPage(adminService.getAdminAndRoleIdList(pageNum, pageSize)));
    }

ServiceImpl层

        引申一下:我们进行查询的时候如果还需要前端传递除了pageSize和pageNum外的其他参数的时候,最好还是传递一个Dto,还有一点就是因为分页一般的列表都是需要的,所以我们可以把pageSize和pageNum这两个参数封装成一个BaseDto的类,每一次需要分页的时候可以直接进行继承复用。

    public Page<AdminAndRoleIdDto> getAdminAndRoleIdList(Integer pageNum, Integer pageSize) {

        Page<AdminAndRoleIdDto> page = new Page<>(pageNum, pageSize);
        List<AdminAndRoleIdDto> adminAndRoleIdDto = sysAdminMapper.selectAdminListAndRoleId(page);
        // 将自己进行left join的sql进行page.setRecords
           page.setRecords(adminAndRoleIdDto);
        return page;

    注意:这个时候你在controller层如果没有进行分页通用结果的设置,你返回的数据列表会是records集合数据

 

         通用CommonPage类已经贴在了上面,自己看一下就好了,不过是对分页的一些数据进行了set。

mapper

        根据自己的方法更改自己相应的参数就好了

 List<AdminAndRoleIdDto> selectAdminListAndRoleId(Page<AdminAndRoleIdDto> page);

mapper.xml

        直接在<select> </select>语句块里面加上自己要进行的多表查询就可以了

    SELECT
            sa.*,
            ar.role_id
        FROM
            sys_admin sa
                LEFT JOIN sys_admin_role_relation ar ON sa.id = ar.admin_id

最终测试结果:

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那山川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值