MyBatisPlus系列十:公共字段自动填充

博客介绍了Mybatis元数据处理器接口中的元对象,它可方便访问和设置对象属性,支持多种对象包装,本质上通过Reflector获取属性对应方法的Invoker。还讲述了给实体添加注解填充字段、自定义公共字段填充处理器及MyBatisPlus全局注入该处理器的操作,并进行了测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

元数据处理器接口:

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]
### MyBatis Plus 配置公共字段自动填充 为了实现 PostgreSQL 中的公共字段自动插入与修改,可以利用 MyBatis Plus 提供的功能来简化开发工作。通过配置 `MetaObjectHandler` 接口并重写相应的方法,能够轻松完成创建时间和更新时间等公共字段自动化处理[^1]。 #### 实现 MetaObjectHandler 开发者可以通过继承 `BaseMapper<T>` 并自定义 Mapper 来增强功能。对于公共字段的操作,则需编写一个类去实现 `MetaObjectHandler` 接口中定义的方法: ```java import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; public class CommonFieldFiller implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, "createBy", String.class, getLoginUser()); // 假设有一个方法获取当前登录用户ID } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); this.strictUpdateFill(metaObject, "updateBy", String.class, getLoginUser()); // 同上假设 } } ``` 上述代码展示了如何设置实体对象中的 `createTime`, `createBy`, `updateTime`, 和 `updateBy` 字段,在执行新增操作前会调用 `insertFill()` 方法;而在更新记录之前则触发 `updateFill()` 函数。 #### 注册处理器到 Spring 容器 为了让应用程序识别这个处理器,还需要将其注册至 Spring 上下文中作为 Bean 组件: ```yaml spring: main: allow-bean-definition-overriding: true # 如果存在同名bean覆盖问题可开启此选项 mybatis-plus: global-config: db-config: id-type: auto configuration: map-underscore-to-camel-case: false meta-object-handler: com.example.demo.CommonFieldFiller # 替换成实际路径下的类名称 ``` 以上 YAML 文件片段说明了怎样在项目启动时加载指定的元数据对象处理器实例。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值