列表查询优化,使用异步count和list提高执行效率

  1. 列表参数需继承 common 模块下的 pojo.ListQueryParam 创建参数实体,类名格式为 “模块列表 + QueryParam”,其属性除包含正常参数以外,还需以筛选条件为参考添加 xxxJoinFlag 标识,作为是否进行表连接标识,此标识在count语句时可以完全依赖,在信息查询语句时需考虑字段返回问题;
@Data
public class ListQueryParam {
    /**
     * 页码
     */
    private int pageNo = 1;
    /**
     * 数据条数
     */
    private int pageSize = 10;
    /**
     * 分页信息
     */
    private PageInfo pageInfo;
    /**
     * 数据权限信息
     */
    private DataAuthority dataAuthority;

    public void initListQueryParam(CurrentUser currentUser) {
        this.pageInfo = new PageInfo(this.pageNo, this.pageSize);
        this.dataAuthority = new DataAuthority(currentUser);
    }

    public void setListTotal(int total) {
        this.pageInfo.setTotal(total);
    }

    public void setListData(Object data) {
        this.pageInfo.setList(data);
    }
}
	
	/**
     * 示例
     * biz_customer 表join标识
     */
    private boolean bizCustomerJoinFlag;
	
    public void setCustomerName(String customerName) {
        this.customerName = customerName;
        if (Toolkit.isValid(customerName)) {
            this.bizCustomerJoinFlag = true;
        }
    }
  1. 在 Controller 层进行参数校验、赋值(如调用 initListQueryParam 方法通过 currentUser 设置 dataAuthority)、查询结果的返回;
  2. 通过 common 模块下的 pagination.AbstractPagination 同时进行数据总条数查询及列表数据的获取及组装,在 getDataList 方法中查询完列表数据后进行一些数据的处理;
@Override
    public PageInfo getPreLoanList(PreLoanQueryParam queryParam) {
        PageInfo pageInfo = queryParam.getPageInfo();
        AbstractPagination<PreLoanInfo, PreLoanQueryParam> preLoanPagination = new AbstractPagination<PreLoanInfo, PreLoanQueryParam>() {
            @Override
            public int countDataTotal(PreLoanQueryParam param) {
                // 查询数据总条数
                return preLoanMapper.countPreLoanList(param, param.getDataAuthority());
            }

            @Override
            public List<PreLoanInfo> getDataList(PreLoanQueryParam param) {
                // 查询列表数据
                List<PreLoanInfo> preLoanList = preLoanMapper.getPreLoanList(param, param.getDataAuthority());
                // xxx列表数据处理
                return preLoanList;
            }
        };
        preLoanPagination.execute(pageInfo, queryParam);
        return pageInfo;
    }
/**
 * 分页查询抽象类
 */
@Slf4j
public abstract class AbstractPagination<T, V> {

    /**
     * 统计数据总数
     *
     * @param v 查询参数
     * @return
     */
    public abstract int countDataTotal(V v);

    /**
     * 获取数据列表
     *
     * @param v 查询参数
     * @return
     */
    public abstract List<T> getDataList(V v);

    /**
     * 执行
     *
     * @param p 分页数据
     * @param v 查询参数
     */
    public void execute(PageInfo p, V v) {
        CompletableFuture<PageInfo> totalFuture = CompletableFuture.supplyAsync(() -> {
            p.setTotal(this.countDataTotal(v));
            return p;
        });
        CompletableFuture<PageInfo> listFuture = CompletableFuture.supplyAsync(() -> {
            p.setList(this.getDataList(v));
            return p;
        });
        CompletableFuture.allOf(totalFuture, listFuture).join();
    }
}
  1. 针对列表数据的处理一般包括字典值赋值、创建人、流程状态等,此处遵循的原则是批量获取、一次遍历、多属性赋值,此处可使用查询参数 和 QueryParam 中表JoinFlag 过滤一些特殊情况下才需要的赋值;
  2. mybatis.xml 中应合理使用动态SQL,将筛选语句创建为SQL片段,保证在版本迭代过程中出现 count 语句和 getDataList 语句筛选条件不一致情况,合理使用 QueryParam 中的 joinFlag 标识减少不必要的表连接;
  3. SQL语句可以通过 EXPLAIN 命令进行SQL优化、索引添加;
  4. 字典、用户、机构、项目等可从缓存中获取,通用遵循上方数据处理的原则,如是老接口改造,此类信息未放置缓存则需循序渐进先按照上步骤进行调整,接口稳定后可再进行优化;
  5. 深分页、数据权限待补充;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值