MybatisPlus下,用反射生成一个全为like或and的条件构造器QueryWrapper

不想写重复的QueryWrapper,干脆用反射写了一个通用的,但用之前,要做判空,加异常会增加导入该类的成本,就用null处理了

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

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 构造QueryWrapper
 * <p>缺陷1:不会构造包含父类属性的eq或者like</p>
 *
 * @Author: zxSu
 * @Date: 2022/9/28 17:23
 **/
public class ConstructorQueryWrapper {


    /**
     * 驼峰转下划线
     *
     * @param filedName 字段名称
     * @return {@link String}
     */
    public static String humpToUnderline(String filedName) {
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < filedName.length(); i++) {
            char c = filedName.charAt(i);
            if (c >= 'A' && c <= 'Z') {
                str.append('_').append((char) (c - 'A' + 'a'));
            } else {
                str.append(c);
            }
        }
        return str.toString();
    }

    /**
     * 获取字段get方法名称
     *
     * @param filedName 属性名称,且要符合bean命名;
     * @return {@link String}
     */
    public static String getTheGetMethodName(String filedName) {
        StringBuilder str = new StringBuilder();
        str.append("get");
        for (int i = 0; i < filedName.length(); i++) {
            char c = filedName.charAt(i);
            if (i == 0) {
                if (c >= 'a' && c <= 'z') {
                    str.append((char) (c - 'a' + 'A'));
                    continue;
                }
            }
            str.append(c);
        }
        return str.toString();
    }

    /**
     * 得到查询的QueryWrapper
     * <p>1.如果类的属性和get方法命名不符合JavaBean的驼峰命名,只会得到一个null的QueryWrapper</p>
     * <p>2.数据库字段命名要规范,Java驼峰命名映射数据库字段的下划线命名,否则会得到一个错误的QueryWrapper</p>
     *
     * @param entity 实体类对象
     * @param type   QueryWrapper类型,全为eq则为1,全为like则为2
     * @param isAnd  是否是and拼接,true是,false非
     * @return {@link QueryWrapper}<{@link T}>
     */
    public static <T> QueryWrapper<T> getQuery(T entity, int type, boolean isAnd) {
        Field[] fields = entity.getClass().getDeclaredFields();
        QueryWrapper<T> queryWrapper = new QueryWrapper<>();
        for (Field field : fields) {
            /*
            filedName:实体类属性名
            dataBaseName:数据库表字段名
            methodName:实体类的get方法名
            filedValue:实体类的属性值
             */
            String filedName = field.getName();
            String dataBaseName = humpToUnderline(filedName);
            String methodName = getTheGetMethodName(filedName);
            Method method;
            Object filedValue;
            try {
                method = entity.getClass().getMethod(methodName);
                filedValue = method.invoke(entity);
            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
                return null;
            }
            //不为空,方使用
            if (filedValue != null) {
                if (type == 1) {
                    queryWrapper.eq(dataBaseName, filedValue);
                } else {
                    queryWrapper.like(dataBaseName, filedValue);
                }
                if(!isAnd){
                    queryWrapper.or();
                }
            }

        }
        return queryWrapper;
    }
    
    public static <T> QueryWrapper<T> getQuery(T entity, int type) {
        return getQuery(entity, type, true);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值