前言
通过MetaObjectHandler
接口,配置MyBatis-Plus的自动填充。
MyBatis-Plus版本:3.4.3.4
什么是自动填充
通常在建表时,会设置一些公共字段,例如创建人(creator)、更新人(uptater)、创建时间(create_time)、更新时间(update_time)等等。
每次将实体对象新增入库时,都要设置创建人和创建时间;每次更新实体对象时,都要设置更新人和更新时间;如果这些都放在业务代码中,很是繁琐,于是就需要配置自动填充来简化工作。
MetaObjectHandler
MetaObjectHandler
是 MyBatis-Plus 提供的一个接口类,通过实现该接口并重写其中的方法,可以在执行数据库操作(插入和更新)时自动填充某些字段的值。
MetaObjectHandler
中有若干默认方法(已实现)和两个接口方法(需实现),接口方法如下:
1 | // MetaObject 是 MyBatis 的一个反射工具类,用于操作 Java 对象的属性。它提供了一系列方法来获取、设置、判断和操作 Java 对象的属性,使得在不直接调用 JavaBean 的 getter 和 setter 方法的情况下进行属性操作变得更加方便和灵活。 |
下面是一个基础的自动填充配置示例
1 |
|
要想使用 MetaObjectHandler
,需要在其实现类上添加 @Component
注解,然后将其注册为 Spring 的一个 Bean,这样 MyBatis Plus 就会自动调用其中定义的方法来进行字段值的填充。
然后,在实体类上添加注解,告知Mybatis-Plus需要预留注入SQL字段:
1 |
|
填充策略包括:
1 | public enum FieldFill { |
注意
1、如果属性有值则不覆盖,如果sql中赋值了,自动填充又设置为其他值,则以sql中的值为准。
2、如果填充值为null则不填充,比如this.setFieldValByName(“update_time”, null, metaObject);
实际是不会更新为null的。
3、填充处理器(如MyMetaObjectHandler
)在 Spring Boot 中需要声明@Component
或@Bean
注入
4、最好不要在自定义mapper方法中使用填充,非要使用的话需要使用特定参数注解,如@Param("et")
等。
5、update(T t,Wrapper updateWrapper)
时t
不能为空,否则自动填充失效,如this.update(new User(), new UpdateWrapper<User>().set("name", "张三")));
不能省略new User()
。
后记
首发于 silencezheng.top,转载请注明出处。