今天编写一个详细的教程来介绍如何在 Spring Boot 项目中使用 MyBatis-Plus 实现自动填充时间字段(如创建时间 createTime
和更新时间 updateTime
),可以分为以下几个部分。这个教程将涵盖从项目配置到自动填充的完整过程。
1. 项目环境配置
首先,需要确保项目中已经集成了 Spring Boot 和 MyBatis-Plus。下面是一些基本的配置步骤:
1.1 引入必要的依赖
在 pom.xml
中添加 MyBatis-Plus 的依赖:
<dependencies> <!-- MyBatis-Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> <!-- 其他必要依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MySQL 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies>
1.2 配置数据源
在 application.yml
或 application.properties
文件中配置数据库连接:
spring: datasource: url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC username: your_username password: your_password driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: mapper-locations: classpath:/mapper/*.xml type-aliases-package: com.example.entity global-config: db-config: id-type: auto
2. 创建基础实体类
为数据库中的表创建一个基础实体类 BaseEntity
,在该类中定义创建时间和更新时间字段,并使用 MyBatis-Plus 的注解配置自动填充。
package com.example.utils; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import java.io.Serializable; import java.util.Date; import java.util.HashMap; import java.util.Map; @Data public class BaseEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 搜索值(暂时忽略) */ @JsonIgnore @TableField(exist = false) private String searchValue; /** * 创建者 */ @TableField(fill = FieldFill.INSERT) private String createBy; /** * 创建时间 */ @TableField(fill = FieldFill.INSERT) private Date createTime; /** * 更新者 */ @TableField(fill = FieldFill.INSERT_UPDATE) private String updateBy; /** * 更新时间 */ @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; /** * 请求参数(暂时忽略) */ @JsonInclude(JsonInclude.Include.NON_EMPTY) @TableField(exist = false) private Map<String, Object> params = new HashMap<>(); }
3. 实现 MetaObjectHandler
接口
为了使 BaseEntity
中的自动填充注解生效,我们需要实现 MetaObjectHandler
接口,并将其配置为 Spring 的一个 Bean。
3.1 创建 MyMetaObjectHandler
类
package com.example.config; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.util.Date; @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { // 填充创建时间和更新时间 this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); this.strictInsertFill(metaObject, "updateTime", Date.class, new Date()); // 可以根据业务需求获取当前用户,填充创建者和更新者 this.strictInsertFill(metaObject, "createBy", String.class, getCurrentUser()); this.strictInsertFill(metaObject, "updateBy", String.class, getCurrentUser()); } @Override public void updateFill(MetaObject metaObject) { // 更新时只填充更新时间和更新者 this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); this.strictUpdateFill(metaObject, "updateBy", String.class, getCurrentUser()); } // 示例方法:获取当前用户信息 private String getCurrentUser() { // 这里可以集成 Spring Security 或其他上下文获取实际的当前用户 return "system"; // 这是一个占位符,实际应用中会替换为真实用户信息 } }
3.2 配置生效
通过在 MyMetaObjectHandler
类上使用 @Component
注解,Spring 会自动管理这个类,并在实体插入和更新时调用它来填充字段。
4. 实体类继承 BaseEntity
现在,你的具体实体类可以继承 BaseEntity
,从而自动获得 createTime
和 updateTime
字段的自动填充功能。
package com.example.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.example.utils.BaseEntity; import lombok.Data; @Data @TableName("your_table") public class YourEntity extends BaseEntity { // 其他字段 private String name; private Integer age; }
5. 处理数据插入与更新
在 Service 或 Mapper 层,执行插入或更新操作时,createTime
和 updateTime
字段会自动填充。
5.1 Service 层示例
@Service public class YourEntityService { @Autowired private YourEntityMapper yourEntityMapper; public void saveEntity(YourEntity entity) { yourEntityMapper.insert(entity); } public void updateEntity(YourEntity entity) { yourEntityMapper.updateById(entity); } }
6. 验证自动填充功能
通过简单的单元测试或集成测试,验证 createTime
和 updateTime
字段在插入和更新时是否正确自动填充。
7. 其他注意事项
字段类型: 确保数据库中的
createTime
和updateTime
字段类型与 Java 实体类中的类型相匹配(通常是DATETIME
类型)。时间格式: 如果需要统一时间格式,可以在配置文件中设置 Spring Boot 的全局时间格式,或使用
@JsonFormat
注解指定序列化时的格式。
spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8
总结
通过本文的教程,你可以轻松地在 Spring Boot 项目中使用 MyBatis-Plus 自动填充创建时间和更新时间字段。该方法充分利用了 MyBatis-Plus 的自动填充机制,并结合 Spring Boot 的优势,使开发过程更加简洁高效。如果遇到问题,务必检查 MetaObjectHandler
是否正确注册,字段类型是否匹配,以及数据库配置是否正确。