利用java反射机制对对象属性进行判断

项目使用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;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值