mybatisPlus快速构造查询条件QueryWrapper

需求

能够根据接口请求的对象直接构造查询条件

实现

QueryField 注解

import java.lang.annotation.*;

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface QueryField {

    String value() default "";

    QueryFieldOpType op() default QueryFieldOpType.EQ;
}

条件枚举

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

public enum QueryFieldOpType {
	/**
	 * 等于
	 */
	EQ,
	/**
	 * 左模糊
	 */
	LEFT_LIKE,
	/**
	 * 右模糊
	 */
	RIGHT_LIKE,
	/**
	 * 模糊匹配
	 */
	LIKE,
	/**
	 * 大于
	 */
	GT,
	/**
	 * 大于等于
	 */
	GE,
	/**
	 * 小于
	 */
	LT,
	/**
	 * 小于等于
	 */
	LE,
	;

	public <T> void wrapperQuery(String fieldName, Object value, QueryWrapper<T> queryWrapper, boolean ignoreNullValue) {
		boolean condition = ignoreNullValue ? ObjectUtils.isNotEmpty(value) : Boolean.TRUE;
		switch (this) {
			case LEFT_LIKE:
				queryWrapper.likeLeft(condition, fieldName, value);
				break;
			case RIGHT_LIKE:
				queryWrapper.likeRight(condition, fieldName, value);
				break;
			case LIKE:
				queryWrapper.like(condition, fieldName, value);
				break;
			case GE:
				queryWrapper.ge(condition, fieldName, value);
				break;
			case GT:
				queryWrapper.gt(condition, fieldName, value);
				break;
			case LT:
				queryWrapper.lt(condition, fieldName, value);
				break;
			case LE:
				queryWrapper.le(condition, fieldName, value);
				break;
			case EQ:
			default:
				queryWrapper.eq(condition, fieldName, value);
		}
	}

}

查询条件父类

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.format.annotation.DateTimeFormat;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.time.LocalDateTime;

/**
 * 所有条件查询的父类,可以使用toQueryWrapper()方法转成QueryWrapper对象,也可直接作为Mapper方法的参数
 */
public class QueryInfo {

	/**
	 * 开始时间
	 */
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	private LocalDateTime leCreateAt;
	/**
	 * 结束时间
	 */
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	private LocalDateTime geCreateAt;
	/**
	 * 是否快速查询
	 */
	private boolean quick;

	public <T> QueryWrapper<T> toQueryWrapper() {
		return buildQueryWrapper(Boolean.FALSE);
	}

	/**
	 * 构造查询对象
	 *
	 * @param ignoreNullValue 查询条件是否忽略空值, true:查询条件空值不做处理, false:查询条件空值也会构造条件
	 * @return QueryWrapper
	 */
	public <T> QueryWrapper<T> toQueryWrapper(boolean ignoreNullValue) {
		QueryWrapper<T> queryWrapper = new QueryWrapper<>();
		Field[] fields = this.getClass().getDeclaredFields();
		try {
			for (Field field : fields) {
				ReflectionUtils.makeAccessible(field);
				Object value = field.get(this);
				if (value != null) {
					QueryField[] annotations = field.getAnnotationsByType(QueryField.class);
					QueryFieldOpType opType = QueryFieldOpType.EQ; // 默认按eq处理
					String fieldName = field.getName(); // 默认按当前字段名处理
					if (annotations.length > 0) {
						// 判断是否有注解
						opType = annotations[0].op();
						if (StringUtils.isNotEmpty(annotations[0].value())) {
							fieldName = annotations[0].value();
						}
					} else {
						continue;
					}
					// 快速查询,条件查询结果相或
					if (getQuick()) {
						queryWrapper.or();
					}
					opType.wrapperQuery(fieldName, value, queryWrapper, ignoreNullValue);
				}
			}
		} catch (IllegalAccessException e) {
			throw DbInternalError.SYSTEM_ERROR.toException(e);
		}

		// 排序字段不为空,则设置排序
		queryWrapper.orderBy(StringUtils.isNotBlank(sortField), isAsc(), sortField);

		return queryWrapper;
	}

    public LocalDateTime getLeCreateAt() {
        return leCreateAt;
    }

    public void setLeCreateAt(LocalDateTime leCreateAt) {
        this.leCreateAt = leCreateAt;
    }

    public LocalDateTime getGeCreateAt() {
        return geCreateAt;
    }

    public void setGeCreateAt(LocalDateTime geCreateAt) {
        this.geCreateAt = geCreateAt;
    }


	public boolean getQuick() {
		return quick;
	}

	public QueryInfo setQuick(boolean quick) {
		this.quick = quick;
		return this;
	}
}

使用

import java.util.Date;

public class CaCertInfoRequest extends QueryInfo {
    /**
     * 证书通用名
     */
    @QueryField(value = "entity_cn", op = QueryFieldOpType.EQ)
    private String cn;

    /**
     * 证书状态
     */
    @QueryField(value = "status", op = QueryFieldOpType.EQ)
    private String status;

    /**
     * 证书生效时间
     */
    @QueryField(value = "not_before", op = QueryFieldOpType.GE)
    private Date notBefore;

    /**
     * 证书失效时间
     */
    @QueryField(value = "not_after", op = QueryFieldOpType.LE)
    private Date notAfter;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值