不想写重复的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);
}
}