mybatis-plus实现时间自动填充
1、引入mybatis相关的依赖
<!-- mybatis-plus包-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!-- 代码生成器的模板引擎-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
<!-- 代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
2、数据库表
/*
Navicat Premium Data Transfer
Source Server : Mysql
Source Server Type : MySQL
Source Server Version : 80023
Source Host : localhost:3306
Target Server Type : MySQL
Target Server Version : 80023
File Encoding : 65001
Date: 13/01/2022 17:49:11
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
`create_time` datetime(6) NULL DEFAULT NULL,
`update_time` datetime(6) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
注意:如果数据库字段采用下划线的命名方式,要在springboot中开启驼峰命名映射,否则会出现字段找不到的错误。
mybatis-plus:
configuration:
map-underscore-to-camel-case: true #开启驼峰命名映射
3、生成相应的后端代码
4、自动填充 官网文档
实体类
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_UUID)
private String id;
/**
* 姓名
*/
private String name;
@TableField(value ="create_time", fill = FieldFill.INSERT) // 新增的时候填充数据
private LocalDateTime createTime;
@TableField( value = "update_time" ,fill= FieldFill.INSERT_UPDATE) // 新增或修改的时候填充数据
private LocalDateTime updateTime;
注意:此处的value值是数据库的字段名,实体的数据类型应和数据库保持一致。
填充属性
public enum FieldFill {
/**
* 默认不处理
/
DEFAULT,
/*
* 插入填充字段
/
INSERT,
/*
* 更新填充字段
/
UPDATE,
/*
* 插入和更新填充字段
*/
INSERT_UPDATE
}
5、自定义实现类 MyMetaObjectHandler
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
// 会对字段进行判空处理,如果createTime为null时才会插入
// this.setFieldValByName("createTime",new Date(),metaObject);
// 强制插入,不会判空
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class,LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
}
}
注意:此处的第二个属性值应和实体类的属性名保持一致。
另外附上官网的注意事项
- 填充原理是直接给entity的属性设置值!!! 注解则是指定该属性在对应情况下必有值,如果无值则入库会是null
- MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充
- 字段必须声明TableField注解,属性fill选择对应策略,该声明告知Mybatis-Plus需要预留注入SQL字段
- 填充处理器MyMetaObjectHandler在 Spring Boot 中需要声明@Component或@Bean注入
- 要想根据注解FieldFill.xxx和字段名以及字段类型来区分必须使用父类的strictInsertFill或者strictUpdateFill方法
- 不需要根据任何来区分可以使用父类的fillStrategy方法
如果有什么不对的地方欢迎各位大神指正!!!