项目使用mybatis实现dao层,但存在一些问题。例:当更新或插入某个对象时,mybatis对对象中的属性进行判空,更新或插入对象中不为空的字段,但当对象属性全为空或某些必填字段为空时,仍会执行数据库语句,导致异常出现
因此写了一个工具类对实体对象中的必填字段进行判空,防止插入或更新数据库时出现异常
public class ParamsUtils {
private static Logger logger = LoggerFactory.getLogger(ParamsUtils.class);
/**
* 判断对象中是否包含该字段 用于排序字段是否正确判断
*
* @param object
* @param fieldName 字段名
* @return
*/
public static boolean checkClassIsHaveFeild(@SuppressWarnings("rawtypes") Class clazz, String fieldName) {
Field[] fields = clazz.getDeclaredFields();
if (fields != null && fields.length > 0) {
for (Field field : fields) {
try {
if (field.getName().equals(fieldName)) {
return true;
}
} catch (Exception e) {
logger.error("判断对象中是否存在该字段异常->ParamsUtils.checkObjectFieldIsHave:class->" + clazz.getName()
+ "|fieldName->" + fieldName, e);
}
}
}
return false;
}
/**
* 判断对象中字段是否全为空值(除可为空字段外) 若对象除可为空字段外,其余字段全为空,返回true 用于更新数据库对象之前判空
*
* @param object
* @param fieldNames 可为空字段数组
* @return
*/
public static boolean checkObjectFieldIsAllNull(Object object, String[] fieldNames) {
Class<? extends Object> clazz = object.getClass();
Field[] fields = clazz.getDeclaredFields();
if (fields != null && fields.length > 0) {
for (Field field : fields) {
field.setAccessible(true);
try {
if (!checkFiledIsNull(field, object) && !checkFieldNamesIsContainField(field, fieldNames)) {
return false;
}
} catch (Exception e) {
logger.error("判断对象字段是否为空异常->ParamsUtils.checkObjectFiledIsAllNull:" + JSONUtils.toJson(object), e);
}
}
}
return true;
}
/**
* 判断对象中字段是否有空值(除可为空字段外) 如果有空值 返回map对象中 isNull为true fieldName为该空值字段名
* 此方法只会返回第一个空值字段 不会返回全部空值字段 用于插入数据库对象之前判空
*
* @param object
* @return
*/
public static Map<String, Object> checkObjectFieldIsNull(Object object, String[] fieldNames) {
Map<String, Object> obMap = new HashMap<>();
obMap.put("isNull", false);
Class<? extends Object> clazz = object.getClass();
Field[] fields = clazz.getDeclaredFields();
if (fields != null && fields.length > 0) {
for (Field field : fields) {
field.setAccessible(true);
try {
if (checkFiledIsNull(field, object) && !checkFieldNamesIsContainField(field, fieldNames)) {
obMap.put("isNull", true);
obMap.put("fieldName", field.getName());
return obMap;
}
} catch (Exception e) {
logger.error("判断对象字段是否为空异常->ParamsUtils.checkObjectFiledIsNull:" + JSONUtils.toJson(object), e);
}
}
}
return obMap;
}
/**
* 检测对象字段是否为空
*
* @param field
* @param object
* @return
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
private static boolean checkFiledIsNull(Field field, Object object)
throws IllegalArgumentException, IllegalAccessException {
if (field.getType() == String.class && field.get(object) != null) {
return StringUtils.isEmpty(field.get(object).toString());
} else {
return field.get(object) == null;
}
}
/**
* 判断数组中是否包含该字段名
*
* @param field
* @param fieldNames
* @return
*/
private static boolean checkFieldNamesIsContainField(Field field, String[] fieldNames) {
if (fieldNames != null && fieldNames.length > 0 && field != null) {
for (String string : fieldNames) {
if (string.equals(field.getName())) {
return true;
}
}
}
return false;
}
}