- 列表参数需继承 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);
}
}
private boolean bizCustomerJoinFlag;
public void setCustomerName(String customerName) {
this.customerName = customerName;
if (Toolkit.isValid(customerName)) {
this.bizCustomerJoinFlag = true;
}
}
- 在 Controller 层进行参数校验、赋值(如调用 initListQueryParam 方法通过 currentUser 设置 dataAuthority)、查询结果的返回;
- 通过 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());
return preLoanList;
}
};
preLoanPagination.execute(pageInfo, queryParam);
return pageInfo;
}
@Slf4j
public abstract class AbstractPagination<T, V> {
public abstract int countDataTotal(V v);
public abstract List<T> getDataList(V 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();
}
}
- 针对列表数据的处理一般包括字典值赋值、创建人、流程状态等,此处遵循的原则是批量获取、一次遍历、多属性赋值,此处可使用查询参数 和 QueryParam 中表JoinFlag 过滤一些特殊情况下才需要的赋值;
- mybatis.xml 中应合理使用动态SQL,将筛选语句创建为SQL片段,保证在版本迭代过程中出现 count 语句和 getDataList 语句筛选条件不一致情况,合理使用 QueryParam 中的 joinFlag 标识减少不必要的表连接;
- SQL语句可以通过 EXPLAIN 命令进行SQL优化、索引添加;
- 字典、用户、机构、项目等可从缓存中获取,通用遵循上方数据处理的原则,如是老接口改造,此类信息未放置缓存则需循序渐进先按照上步骤进行调整,接口稳定后可再进行优化;
- 深分页、数据权限待补充;