Mybatis-plus工具类 自动填充QueryWrapper进行高级查询

20 篇文章 0 订阅
15 篇文章 0 订阅

现在只支持QueryWrapper的eq和like功能 后续拓展SqlAnnotation的注解值 可以进行其他匹配
先看实体类

public class EnrollmentRecord implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    @ApiModelProperty(value = "学校编号")
    private String schoolSn;

    @ApiModelProperty(value = "报名id")
    private Integer enrollmentId;

    @ApiModelProperty(value = "订单号(如果免费,订单号为空)")
    private String orderSn;

    @ApiModelProperty(value = "用户id")
    private Integer consumerId;
    
    @SqlAnnotation
    @ApiModelProperty(value = "家长名字")
    private String parentName;
 }

再看工具类

package com.cn.school.admin.util;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cn.school.admin.common.shiro.UserUtil;
import org.apache.commons.lang3.StringUtils;

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

/**
 * 此类主要面向高级查询
 * @author yiyanjia
 */
public class SqlConditionUtil {

    /**
     * 高级查询自动填充条件与值
     * @param tableName 表名 表有别名写别名
     * @param obj 类 值的类
     * @param queryWrapper 需要填充的queryWrapper
     * @return 泛型QueryWrapper
     * @throws Exception 反射异常
     */
    public static QueryWrapper<?> getQueryWrapper(String tableName,Object obj,QueryWrapper<?> queryWrapper) throws Exception {
        Class clz = obj.getClass();
        Field[] fields = clz.getDeclaredFields();
        fields = delElement(fields,0);
        for(int i=0;i<fields.length;i++){
            Method method = obj.getClass().getMethod("get"+getMethodName(fields[i].getName()));
            Object param = method.invoke(obj);
            Field field = fields[i];
            if(param!=null) {
                switch (fields[i].getGenericType().toString()) {
                    case "class java.lang.String":
                        if(StringUtils.isNotEmpty(param.toString())){
                            if (fields[i].isAnnotationPresent(SqlAnnotation.class)){
                                queryWrapper.like(tableFieldName(tableName,field.getName()),param);
                            }
                            else{
                                queryWrapper.eq(tableFieldName(tableName,field.getName()),param);
                            }
                        }
                        break;
                    case "class java.lang.Integer":
                        queryWrapper.eq(tableFieldName(tableName,field.getName()),param);
                        break;
                    case "int":
                        if(Integer.parseInt(param.toString())!=0){
                            System.out.println(Integer.parseInt(param.toString()));
                        }
                        break;
                    case "class java.math.BigDecimal":
                        queryWrapper.eq(tableFieldName(tableName,field.getName()),param);
                        break;
                    case "class java.time.LocalDateTime":
                        queryWrapper.eq(tableFieldName(tableName,field.getName()),param);
                        break;
                }
            }
        }
        if (UserUtil.getUser().getIdentity()!=1){
            queryWrapper.eq(tableFieldName(tableName,"schoolSn"),UserUtil.getUser().getSchoolSn());
        }
        return queryWrapper;
    };


    /**
     * 获取方法名
     * @param fildeName
     * @return
     * @throws Exception
     */
    private static String getMethodName(String fildeName) throws Exception{
        byte[] items = fildeName.getBytes();
        items[0] = (byte) ((char) items[0] - 'a' + 'A');
        return new String(items);
    }

    /**
     * 删除类字段集的不需要数据
     * @param arrays
     * @param index
     * @return
     */
    public static Field[] delElement(Object[] arrays, int index) {
        int length = arrays.length;
        //判断数据合理性
        if (index >= 0 && index < length) {
            Field[] arrays_result = new Field[arrays.length - 1];
            //将arrays数组在index前的元素都复制到新数组arrays_result中
            System.arraycopy(arrays, 0, arrays_result, 0, index);
            //判断index之后是否还有元素,有则将index后的元素从index位置复制到新数组中
            if (index < length - 1) {
                System.arraycopy(arrays, index + 1, arrays_result, index, arrays_result.length - index);
            }
            return arrays_result;
        } else {
            //不合理,抛越界异常
            throw new IndexOutOfBoundsException("index :" + index + ", length: " + length);
        }
    }

    /**
     * 字段名与表名
     * @param tableName
     * @param fieldName
     * @return
     */
    public static String tableFieldName(String tableName,String fieldName){
        StringBuffer tableField = new StringBuffer();
        tableField.append(tableName+".");
        for(int i =0;i<fieldName.length();i++){
            char c = fieldName.charAt(i);
            if(Character.isUpperCase(c)){
                tableField.append('_');
            }
            tableField.append(Character.toLowerCase(c));
        }
        return tableField.toString();
    }
}

注解类

package com.cn.school.admin.util;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)//记录在.class文件中,并且在运行时保留"注释"
@Target({ElementType.FIELD, ElementType.METHOD})
public @interface SqlAnnotation {
    String type() default "";
}

主要原理就是根据反射获取被填充了数据的字段 然后拼接表名和字段名放入QueryWrapper中
由于是初版 所以打了SqlAnnotation的字段会使用like

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值