MYBATIS分页查询代码优化

项目场景:

mybatis分页查询的时候,需要联动其他系统,把每条数据的用户信息查询出来,用户量很多的时候,出现一次查询需要十几秒的情况。


问题描述

查询出的数据,其实除了当前页的数据,其他的实际上并没有任何作用

下面的例子以查询系统日志为例。

该例子原本首先是查询出了所有的日志记录:

List<SysLog> sysLogList = sysLogService.list(Wrappers.<SysLog>lambdaQuery()
        .eq(SysLog::getSchoolId, schoolId)
        .between(SysLog::getCreateTime, startTime, endTime)
        .eq(Objects.nonNull(type), SysLog::getType, type)
        .orderByDesc(SysLog::getCreateTime));

遍历所有数据,查询出每条日志的操作用户信息:

for (SysLog x : sysLogList) {
    SysLogInfo sysLogInfo = new SysLogInfo();
    BeanUtils.copyProperties(x, sysLogInfo);

    sysLogInfo.setUserInfo(makeSendService.getUserInfo(x.getUserId(), schoolId));
    sysLogInfoList.add(sysLogInfo);
}

原因分析:

主要是因为查询出的废物数据太多了。

例如:前端传给你的pageNum=1,pageSize=10,意思就是查询第一页的10条数据,但是按照上面的做法,把全部日志记录都查询出来了,也就是除了前10条数据,剩下的查询,都没意义了,而且每一页都是查询全部,再一条条调用其他系统查询用户信息,为什么不做缓存呢,为什么不在加载页面的时候调用一次,后面就不需要再一遍遍调用了呢?属实是没什么必要了。

我先说,为什么我这里不用缓存和页面加载的时候就获取全部。
不用缓存的原因:我这里获取的用户信息需要是实时的,而且我这里只是拿日志举例,如果是其他的数据,类似我项目里面的获取卡片信息等包括余额这些,更加需要实时获取,因此不能够使用缓存。
不用页面加载的时候获取全部的原因:如果在页面加载的时候就获取全部,同样涉及到实时的问题,而且,解决不了第一次访问的时候,页面加载慢的问题。


解决方案:

其实思路很简单,就是用到什么,就查什么

例如,你只想查询出第一页的10条数据,那就只取前10条,

List<SysLog> sysLogList = sysLogService.list(Wrappers.<SysLog>lambdaQuery()
         .eq(SysLog::getSchoolId, schoolId)
         .between(SysLog::getCreateTime, startTime, endTime)
         .eq(Objects.nonNull(type), SysLog::getType, type)
         .orderByDesc(SysLog::getCreateTime).last("limit 0,10"));

然后查询出总数量、计算出总页数,自己封装分页信息就可以了。这里就不仔细赘述了。下面给大家提供一下分页类。

@Data
public class PageResult<T> implements Serializable {

    @ApiModelProperty(value = "当前页码")
    private int pageNum;

    @ApiModelProperty(value = "每页大小")
    private int pageSize;

    @ApiModelProperty(value = "记录总数")
    private long totalCount;

    @ApiModelProperty(value = "页码总数")
    private int pageCount;

    @ApiModelProperty(value = "分页数据")
    private T pageData;

}

欢迎各位在评论区讨论,指出我的不足,也可以说出你们优化分页查询的方案!

你可能感兴趣的:(mybatis,java,开发语言)