是否好奇 为何一些mybatis可以动态帮我们插入 创建时间 修改时间 登陆人 等等信息
其实很简单 mybatis替我们准备好了做插件的拦截功能 针对mybatis四大对象都可以做拦截
应为mybatis拦截过于理论 就不再这里展开讲了
下面代码为 针对拦截到的对象 怎么进行动态注入
/**
* 思路?
* 通过获取对象 能得到对象及其父类的所有字段
* 能通过反射修改私有字段
* 实现动态更改字段 也就是数据运行时的自动填充功能
*
* 通过mybatis拦截器 我们可以通过对四大对象的触发拦截 获取数据对象 然后利用如下方法进行注入名称
* (拦截器的设置不过多解释 根据需求自己上网查找配置即可)
*/
public class Test {
public static void main(String[] args) throws IllegalAccessException {
A target = new A();
Class<?> aClass = target.getClass();
// 获取A 和 A的父类 所有的字段 Declared私有字段也能获取
List<Field> list = new ArrayList<>();
while (aClass != null){
list.addAll(new ArrayList<>(Arrays.asList(aClass.getDeclaredFields())));
aClass = aClass.getSuperclass();
}
// 字段数组转换为列表
Field[] fields = new Field[list.size()];
list.toArray(fields);
for (Field field : fields) {
String name = field.getName();
if (StrUtil.equals(name, "name")){
field.setAccessible(true);
// get() 获取当前字段对象 在参数对象 匹配字段的值
Object localFieldVal = field.get(target);
field.setAccessible(false);
// 证明对象该字段此时并没有值
if (ObjectUtil.isEmpty(localFieldVal) || "".equals(localFieldVal)){
field.setAccessible(true);
field.set(target, "测试注入名称成功");
field.setAccessible(false);
}
}
}
System.out.println(target);
}
}
@Data
@ToString
class A extends B {
private String name;
private String age;
}
@Data
class B {
private String helen;
}
版权声明:本文为m0_46202521原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。