元数据处理器接口:
com.baomidou.mybatisplus.mapper.MetaObjectHandler
insertFill(MetaObject metaObject)
updateFill(MetaObject metaObject)
metaobject: 元对象。是 Mybatis 提供的一个用于更加方便,更加优雅的访问对象的属性,给对象的属性设置值 的一个对象。还会用于包装对象.。支持对 Object 、Map、Collection 等对象进行包装。
本质上 metaObject 获取对象的属性值或者是给对象的属性设置值,最终是要 通过 Reflector 获取到属性的对应方法的 Invoker,最终 invoke。
1、 给实体添加注解填充字段 @TableFile(fill = FieldFill.INSERT) 。
@TableField(fill = FieldFill.INSERT_UPDATE)
private String name ;
FieldFill类:
public enum FieldFill {
DEFAULT(0, "默认不处理"),
INSERT(1, "插入填充字段"),
UPDATE(2, "更新填充字段"),
INSERT_UPDATE(3, "插入和更新填充字段");
private final int key;
private final String desc;
private FieldFill(int key, String desc) {
this.key = key;
this.desc = desc;
}
public static FieldFill getIgnore(int key) {
FieldFill[] fis = values();
FieldFill[] arr$ = fis;
int len$ = fis.length;
for(int i$ = 0; i$ < len$; ++i$) {
FieldFill fi = arr$[i$];
if (fi.getKey() == key) {
return fi;
}
}
return DEFAULT;
}
public int getKey() {
return this.key;
}
public String getDesc() {
return this.desc;
}
}
2、自定义公共字段填充处理器。
/**
* 自定义公共字段填充处理器
*/
public class MyMetaObjectHandler extends MetaObjectHandler {
/**
* 插入操作自动填充
*/
@Override
public void insertFill(MetaObject metaObject) {
//获取到需要被填充的字段的值
Object fieldValue = getFieldValByName("name", metaObject);
if(fieldValue == null) {
System.out.println("*******插入操作 满足填充条件*********");
setFieldValByName("name", "weiyunhui", metaObject);
}
}
/**
* 修改操作自动填充
*/
@Override
public void updateFill(MetaObject metaObject) {
Object fieldValue = getFieldValByName("name", metaObject);
if(fieldValue == null) {
System.out.println("*******修改操作 满足填充条件*********");
setFieldValByName("name", "weiyh", metaObject);
}
}
}
3、MyBatisPlus全局注入自定义公共字段填充处理器。
<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!-- 注入公共字段填充处理器 -->
<property name="metaObjectHandler" ref="myMetaObjectHandler"></property>
</bean>
<!-- 公共字段填充处理器 -->
<bean id="myMetaObjectHandler" class="com.atguigu.mp.metaObjectHandler.MyMetaObjectHandler"> </bean>
测试:
@Test
public void testMetaObjectHandler() {
User user = new User();
user.setId(5);
user.setLogicFlag(1);
userMapper.updateById(user);
}
控制台输出:
Preparing: UPDATE tbl_user SET `name`=?, logic_flag=? WHERE id=?
Parameters: weiyh(String), 1(Integer), 5(Integer)
Updates: 1
Time:97 ms - ID:com.atguigu.mp.mapper.UserMapper.updateById
Execute SQL:
UPDATE
tbl_user
SET
`name`='weiyh',
logic_flag=1
WHERE
id=5]