JAVA使用Wrapper实现范围查询、多个范围查询等复杂查询

本文介绍了如何利用MyBatis-Plus的Wrapper类创建一个公共方法,以规范化的方式处理范围查询和多范围查询,降低复杂接口入参的设计难度。这个方法也允许在查询前添加默认条件,如删除状态和租户信息。文章涵盖了查询条件DTO、接口入参、工具类的使用,并解释了Wrapper和LambdaWrapper的区别,以及如何在实体类、Mapper和服务中应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发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(
Java中,使用Wrapper类通常是为了处理数据库查询中的复杂条件,尤其是当涉及到多个表之间的关联查询时。Wrapper类可以帮助我们将SQL动态化,因为它们可以封装数据并提供方法来表示查询条件。然而,这个过程通常不是直接通过Wrapper类本身完成联合查询,而是通过JDBC(Java Database Connectivity)API。 以下是一个简单的步骤示例: 1. **创建Wrapper类**: 对于每个表的字段,你可以创建一个自定义的Wrapper类,比如`UserWrapper`、`OrderWrapper`等,用于封装表的数据以及相关的操作方法。 ```java public class UserWrapper { private User user; // 构造函数、getter和setter... public void setUser(User user) { this.user = user; } public User getUser() { return user; } } ``` 2. **构建SQL查询**: 使用StringBuilder或PreparedStatement来动态构建包含JOIN条件的SQL语句。例如: ```java String sql = "SELECT * FROM User u JOIN Order o ON u.id = o.userId"; List<UserWrapper> result = new ArrayList<>(); Connection conn = getConnection(); try (PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setObject(1, newUserWrapper); // 新建的UserWrapper实例 ResultSet rs = pstmt.executeQuery(); while (rs.next()) { UserWrapper wrapper = new UserWrapper(rs); result.add(wrapper); } } catch (SQLException e) { e.printStackTrace(); } ``` 在这个例子中,`newUserWrapper`是传递给查询的`UserWrapper`实例,它的用户id会被用来连接到`Order`表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值