开发java项目时, 如果需要实现范围查询, 或是多个范围查询等更复杂的查询, 往往需要设计复杂的接口入参, 为了简化开发, 本文通过设计一个基于MyBatis-Plus的Wrapper类(条件构造器)的公共方法类, 以一种规范化的FROM接收入参, 实现复杂查询
同时, 此方法可以给所有查询统一添加默认查询条件, 如:是否删除、租户等
需要掌握的知识:
1.MyBatis-Plus 官网
2.条件构造器Wrapper 条件构造器
3.了解Wrapper和LambdaWrapper的区别
4.方法引用
1.类
1.1 查询条件DTO
@Data
public class SearchRangeDTO {
@ApiModelProperty(value = "范围搜索-起始值")
private String startRange = "";
@ApiModelProperty(value = "范围搜索-结束值")
private String endRange = "";
public SearchRangeDTO() {
}
public SearchRangeDTO(String startRange) {
this.startRange = startRange != null ? startRange : "";
}
public SearchRangeDTO(String startRange, String endRange) {
this.startRange = startRange != null ? startRange : "";
this.endRange = endRange != null ? endRange : "";
}
}
1.2 查询接口入参FORM
@Data
public class GetListFORM{
/**
* 编码
*/
@ApiModelProperty(value = "编码")
private List<SearchRangeDTO> code;
}
1.3 interface
便于开发者寻找自己需要的方法
public interface IConditionDTOWrapper<T> {
/**
* 静态方法
* 直接返回一个基础的wrapper
* 默认拼接条件
* @param <T>
* @return
*/
static<T> LambdaQueryWrapper<T> createWrapper() {
return null; }
/**
* 静态方法
* 先拼接前置查询条件
* 再返回一个基础的wrapper
* 默认拼接条件
* @param <T>
* @param preconditions
* @return
*/
static <T> LambdaQueryWrapper<T> createWrapper(String... preconditions) {
return null; }
/**
* 组装范围查询条件
* 返回ConditionDTOWrapper对象
* @param func 查询条件对应的实体类字段,使用方法引用的方式传入
* @param conditionsList 查询条件列表
* @return
*/
ConditionDTOWrapper<T> assemblyConditions(SFunction<T, ?> func, List<SearchRangeDTO> conditionsList);
/**
* 组装是否包含包含查询条件
* 原字段是多个数据用逗号分隔拼接而成的,匹配包含某一个或者某几个数据的结果
* 返回ConditionDTOWrapper对象
* @param func 查询条件对应的实体类字段,传入字符串
* @param conditionsList 查询条件列表
* @return
*/
ConditionDTOWrapper<T> containConditions(String func, List<SearchRangeDTO> conditionsList);
/**
* 组装模糊查询条件
* 模糊条件只能有一个
* 返回ConditionDTOWrapper对象
* @param func 查询条件对应的实体类字段,使用方法引用的方式传入
* @param conditionsList 查询条件列表
* @return
*/
ConditionDTOWrapper<T> fuzzyConditions(SFunction<T, ?> func, List<SearchRangeDTO> conditionsList);
/**
* 组装查询条件, 单个普通条件
* 返回ConditionDTOWrapper对象
* @param func 查询条件对应的实体类字段,使用方法引用的方式传入
* @param condition 查询条件
* @return
*/
ConditionDTOWrapper<T> assemblyConditions(SFunction<T, ?> func, String condition);
/**
* 组装模糊查询条件, 单个普通条件
* 返回ConditionDTOWrapper对象
* @param func 查询条件对应的实体类字段,使用方法引用的方式传入
* @param condition 查询条件
* @return
*/
ConditionDTOWrapper<T> fuzzyConditions(SFunction<T, ?> func, String condition);
}
1.4 工具类
@Data
@Slf4j
public class ConditionDTOWrapper<T> implements IConditionDTOWrapper<T>{
private LambdaQueryWrapper<T> wrapper;
/**
* 无参构造方法,创建一个基础的wrapper
* 默认拼接条件
*/
public ConditionDTOWrapper(){
this.wrapper = Wrappers.<T>query()
.nested(i -> i.eq("字段名", "要匹配的值"))
.lambda();
}
/**
* 构造方法,创建一个基础的wrapper
* 需要提供默认条件对应的字段
* @param func1 字段1
* @param func2 字段2
*/
public ConditionDTOWrapper(