目标:
懂得实现 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 {// 插入时的填充策略@Overridepublic void insertFill(MetaObject metaObject) {this.setFieldValByName("createTime", new Date(),metaObject);this.setFieldValByName("updateTime", new Date(),metaObject);}// 更新时的填充策略@Overridepublic void updateFill(MetaObject metaObject) {this.setFieldValByName("updateTime", new Date(),metaObject);}}
setFieldValByName方法具体参数
3、实体类属性上 添加对应的注解(注解填充字段 @TableField)
4、测试插入数据 和 更新数据
测试插入
@Testvoid testInsert(){User user = new User();user.setName("CSNZ_WX");user.setAge(21);int res = userMapper.insert(user);System.out.println(res);}
测试更新
@Testvoid 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
的默认不处理
值
我们上面那个案例用的是插入填充字段
和插入和更新填充字段
三、注意事项 🦌
填充原理是直接给实体类
的属性设置值!!!注解则是指定该属性在对应情况下必有值,如果无值则入库会是nullMetaObjectHandler
提供的默认方法的策略均为 : 如果属性有值则不覆盖,如果填充值为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