一、代码实战
1、注解填充字段
@TableField(.. fill = FieldFill.INSERT) 生成器策略部分也可以配置!
//创建时间 @TableField(fill = FieldFill.INSERT) private Date createTime; //更新时间 @TableField(fill = FieldFill.UPDATE) private Date updateTime;
2、自定义实现类 MyMetaObjectHandler
@Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { System.out.println("start insert fill ...."); setInsertFieldValByName("createTime", new Date(), metaObject); } @Override public void updateFill(MetaObject metaObject) { System.out.println("start update fill ...."); setUpdateFieldValByName("updateTime", new Date(), metaObject); } }
注意官网最新的示例修改了方法
@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.strictUpdateFill(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) } }
3、测试代码
@Test public void insert() { User user = new User(); user.setName("张山"); user.setAge(48); user.setEmail("zhangshan@baomidou.com"); user.setManagerId(1087982257332887553L); int rows = userMapper.insert(user); System.out.println("rows===" + rows); } @Test public void update() { User user = new User(); user.setId(1088248166370832385L); user.setAge(27); int rows = userMapper.updateById(user); System.out.println("rows===" + rows); }
日志输出
start insert fill .... DEBUG==> Preparing: INSERT INTO user ( id, name, age, email, manager_id, create_time ) VALUES ( ?, ?, ?, ?, ?, ? ) DEBUG==> Parameters: 1371302252912959490(Long), 张山(String), 48(Integer), zhangshan@baomidou.com(String), 1087982257332887553(Long), 2021-03-15 11:28:29.316(Timestamp) DEBUG<== Updates: 1 rows===1 start update fill .... DEBUG==> Preparing: UPDATE user SET age=?, update_time=? WHERE id=? AND deleted='0' DEBUG==> Parameters: 27(Integer), 2021-03-15 11:32:41.799(Timestamp), 1088248166370832385(Long) DEBUG<== Updates: 1 rows===1
二、自动填充优化
这个自定义实现类是针对所有类的增改操作,但并不是所有表都有对应的字段,也不是所有对应的字段都需要MP赋值,有些需要程序处理后赋值。这就需要对 MyMetaObjectHandler 进行改造。
@Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { // 判断是否有此属性,如果有再进行处理 boolean hasSetter = metaObject.hasSetter("createTime"); if (hasSetter) { System.out.println("start insert fill ...."); setInsertFieldValByName("createTime", new Date(), metaObject); } } @Override public void updateFill(MetaObject metaObject) { // 判断属性是否为空,如果为空则进行处理 Object object = getFieldValByName("updateTime", metaObject); if (object == null) { System.out.println("start update fill ...."); setUpdateFieldValByName("updateTime", new Date(), metaObject); } } }