目标:
懂得实现 Mybatis-Plus的自动填充
实现步骤:
1、新建一个handle类 实现元对象处理器接口2、实体类属性上 添加对应的注解(注解填充字段 @TableField)
一、如何理解MyBatis-Plus
的自动填充呢?
可以翻开之前的SMBMS
博客,里面关于数据库中的表属性
是否带了两个属性,即创建时间
和修改时间
,每当创建(插入)一条新数据时,会在 实体类对象创建时 赋予 new Date() 给创建时间属性
,同时在修改数据时也会使用 new Date() 重新赋予 修改时间的值,以确保同步。
那么,我们要如何使用MyBatis-Plus
进行自动填充呢?
1、首先修改数据库表的设计,新增两个字段
实体类也要修改对应属性
2、新建一个handle类 实现元对象处理器接口:
com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
@Component // 将处理器加入到IOC容器中
public class MyHandle implements MetaObjectHandler {
// 插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(),metaObject);
this.setFieldValByName("updateTime", new Date(),metaObject);
}
// 更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(),metaObject);
}
}
setFieldValByName方法具体参数
3、实体类属性上 添加对应的注解(注解填充字段 @TableField)
4、测试插入数据 和 更新数据
测试插入
@Test
void testInsert(){
User user = new User();
user.setName("CSNZ_WX");
user.setAge(21);
int res = userMapper.insert(user);
System.out.println(res);
}
测试更新
@Test
void testUpdate(){
User user = new User();
user.setId(1491710152594796547L);
user.setName("wx:CSNZ_WX");
int res = userMapper.updateById(user);
System.out.println(res);
}
二、到这里肯定又对 @TableField
注解 有疑惑了
看源码
生成器策略部分 --> @TableField(… fill = FieldFill.INSERT)
可以看到 FieldFill
也是一个枚举类,并且 fill
属性的值 默认为FieldFill
的默认不处理
值
我们上面那个案例用的是 插入填充字段
和 插入和更新填充字段
三、注意事项 🦌
- 填充原理是直接给
实体类
的属性设置值!!! - 注解则是指定该属性在对应情况下必有值,如果无值则入库会是null
MetaObjectHandler
提供的默认方法的策略均为 : 如果属性有值则不覆盖,如果填充值为null
则不填充字段必须声明TableField注解
, 属性fill
选择对应策略 , 该声明告知Mybatis-Plus
需要预留注入SQL
字段- 填充处理器
MyMetaObjectHandler
在Spring Boot
中需要声明@Component
或@Bean
注入 将处理器加入到IOC
容器中 - 要想根据注解
FieldFill.xxx
和字段名以及字段类型来区分必须使用父类的strictInsertFill或者strictUpdateFill方法 - 不需要根据任何来区分可以使用父类的fillStrategy方法
- update(T t , Wrapper updateWrapper)时
t
不能为空 , 否则自动填充失效
tips: 使用mybatis-plus配置日志
在application.properties
增加
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl