以此做法为例,如果需要多条件匹配,可以自行添加方法处理
// 继承原来的公共mapper
// java8 interface可以写方法的实现逻辑,直接在这里写好,
// 其他地方调用时直接继承自定义的 mapper
public interface CustomBaseMapper<T> extends BaseMapper<T> {
/**
* 目前仅支持主键/属性为 id的更新
* @param dirtyFields: 指定更新的属性
*/
default int updateById(@Param("et") T entity, List<String> dirtyFields) {
Class<?> tClass = entity.getClass();
UpdateWrapper<T> wrapper = new UpdateWrapper<>();
try {
Object id = ObjectUtils.getAttrVal(entity, "id"); // 获取对象的主键值
wrapper.eq("id", id);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException("对象主键未找到,请确认"); // 自定义异常
}
for (String dirtyField : dirtyFields) {
try {
Field classField = tClass.getDeclaredField(dirtyField);
classField.setAccessible(true);
// 对象属性,转成数据库字段
wrapper.set(StringUtils.toColumn(dirtyField), classField.get(entity));
} catch (Exception ignored) {
}
}
return update(null, wrapper);
}
}