自动填充功能
示例工程:
👉 mybatis-plus-sample-auto-fill-metainfo (opens new window)
原理:
实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
注解填充字段
@TableField(.. fill = FieldFill.INSERT)
生成器策略部分也可以配置!
public class User {
// 注意!这里需要标记为填充字段
@TableField(.. fill = FieldFill.INSERT)
private String fillField;
....
}
2
3
4
5
6
7
8
- 自定义实现类 MyMetaObjectHandler
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
// 或者
this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
// 或者
this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
// 或者
this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
// 或者
this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
注意事项:
填充原理是直接给
entity
的属性设置值!!!注解则是指定该属性在对应情况下必有值,如果无值则入库会是
null
MetaObjectHandler
提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null
则不填充字段必须声明
TableField
注解,属性fill
选择对应策略,该声明告知Mybatis-Plus
需要预留注入SQL
字段填充处理器
MyMetaObjectHandler
在 Spring Boot 中需要声明@Component
或@Bean
注入要想根据注解
FieldFill.xxx
和字段名
以及字段类型
来区分必须使用父类的strictInsertFill
或者strictUpdateFill
方法不需要根据任何来区分可以使用父类的
fillStrategy
方法update(T t,Wrapper
updateWrapper)时t不能为空,否则自动填充失效 当自定义mapper方法需要走填充时,建议按下列注解方式添加参数注解(如果使用编译参数保留的情况下,变量名字与注解名字保持一致也行) (自3.5.4版本开始不限制参数注解,下面所有方法都支持自动填充,不限制别名,包括无法填充的示例)
数据类型 注解 示例 Collection @Param("collection") 或 @Param("coll")saveXxx(@Param("collection") Collection h2Users) List @Param("list") saveXxx(@Param("list") List h2Users) Array @Param("array") saveXxx(@Param("array") H2User[] h2Users) 实体 @Param("et") saveXxx(@Param("et") H2User h2Users) 参数填充示例:
insertFillByCustomMethod1(H2User h2User); insertFillByCustomMethod8(H2User[] h2Users); insertFillByCustomMethod4(Collection<H2User> h2User); insertFillByCustomMethod6(@Param("coll") Collection<H2User> h2User); insertFillByCustomMethod5(@Param("collection") Collection<H2User> h2User); insertFillByCustomMethod7(@Param("list") List<H2User> h2User); insertFillByCustomMethod9(@Param("array") H2User[] h2Users); //et标记的会填充,coll虽然是特殊的key值,但不属于实体,所以不会处理 updateFillByCustomMethod2(@Param("coll") Collection<Long> ids, @Param("et") H2User h2User); updateFillByCustomMethod4(@Param("colls") Collection<Long> ids, @Param("et") H2User h2User);
1
2
3
4
5
6
7
8
9
10
11
12
13无法填充示例:
//方法虽然与上面方法一致,但key值不满足填充条件,需要将user换成et才能正确填充 updateFillByCustomMethod3(@Param("coll") Collection<Long> ids, @Param("user") H2User h2User);
1
2
注意: 3.5.3.3-SNAPSHOT版本之前有未处理类型不匹配情况,当参数名称与上表一致但类型不一致的话会导致强转错误. 传送门 (opens new window)
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入填充字段
*/
INSERT,
/**
* 更新填充字段
*/
UPDATE,
/**
* 插入和更新填充字段
*/
INSERT_UPDATE
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18