🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解 MyBatis-Plus 逻辑删除请看: MyBatis-Plus 逻辑删除:让数据“消失”却不真正删除的秘密!
其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等
如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning
一、什么是 MyBatis-Plus 自动填充? 🤔
MyBatis-Plus 自动填充是指在执行 insert
或 update
操作时,自动为某些字段设置值,而无需手动在代码中进行赋值。 这对于一些通用字段(如创建时间、更新时间、创建人、修改人等)非常有用,可以减少重复代码,提高开发效率,并保证数据的一致性。 🚀
二、自动填充的原理 ⚙️
MyBatis-Plus 通过拦截器机制,在执行 SQL 语句之前,根据配置的规则,自动为指定的字段设置值。
自动填充的实现步骤 📝
- 定义实体类字段: 在实体类中定义需要自动填充的字段,并使用 MyBatis-Plus 提供的注解进行标记。
- 编写填充处理器: 创建一个类,实现 MyBatis-Plus 提供的
MetaObjectHandler
接口,并在该类中编写填充逻辑。 - 配置 MyBatis-Plus: 在 MyBatis-Plus 的配置中,注册填充处理器。
三、实际例子:创建时间和更新时间字段自动填充 ⏰
假设我们有一个 User
实体类,其中包含 createTime
和 updateTime
两个字段,分别表示创建时间和更新时间。
1. 定义实体类字段
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("user")
public class User extends Model<User> {
private static final long serialVersionUID = 1L;
@TableId
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT) // 插入时填充字段
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE) // 插入和更新时填充字段
private LocalDateTime updateTime;
@Override
protected Serializable pkVal() {
return this.id;
}
}
解释:
@TableField(fill = FieldFill.INSERT)
:表示该字段在执行insert
操作时进行填充。@TableField(fill = FieldFill.INSERT_UPDATE)
:表示该字段在执行insert
和update
操作时进行填充。LocalDateTime
:这里使用LocalDateTime
作为时间类型,也可以使用Date
或Instant
等。
2. 编写填充处理器
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Slf4j
@Component // 不要忘记加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.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
}
}
解释:
MyMetaObjectHandler
类实现了MetaObjectHandler
接口。insertFill
方法:在执行insert
操作时,会调用该方法。 我们在这里为createTime
和updateTime
字段设置当前时间。updateFill
方法:在执行update
操作时,会调用该方法。 我们在这里为updateTime
字段设置当前时间。strictInsertFill
和strictUpdateFill
方法:是 MyBatis-Plus 3.3.0 版本之后推荐使用的填充方法,更加安全和严格。 它们会检查字段是否存在,类型是否匹配,以及是否已经有值,避免覆盖已有值。@Component
:将该类注册为 Spring Bean,以便 MyBatis-Plus 可以自动发现它。
3. 配置 MyBatis-Plus
在 Spring Boot 的配置文件(例如 application.yml
或 application.properties
)中,不需要显式配置 MyBatis-Plus 的自动填充功能。 只要你的填充处理器类被 Spring 管理(例如通过 @Component
注解),MyBatis-Plus 就会自动识别并使用它。 🎉
使用示例 🚀
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testInsert() {
User user = new User();
user.setName("testUser");
user.setAge(25);
user.setEmail("test@example.com");
int result = userMapper.insert(user);
System.out.println("影响行数:" + result);
System.out.println("插入后的用户ID:" + user.getId());
System.out.println("插入后的用户创建时间:" + user.getCreateTime());
System.out.println("插入后的用户更新时间:" + user.getUpdateTime());
}
@Test
public void testUpdate() {
User user = userMapper.selectById(1L); // 假设ID为1的用户存在
user.setName("updatedUser");
int result = userMapper.updateById(user);
System.out.println("影响行数:" + result);
System.out.println("更新后的用户更新时间:" + user.getUpdateTime());
}
}
解释:
- 在
testInsert
方法中,我们创建了一个User
对象,并设置了name
、age
和email
字段。createTime
和updateTime
字段没有手动设置。 - 执行
userMapper.insert(user)
后,MyBatis-Plus 会自动调用MyMetaObjectHandler
的insertFill
方法,为createTime
和updateTime
字段设置当前时间。 - 在
testUpdate
方法中,我们先查询出一个User
对象,然后修改了name
字段。updateTime
字段没有手动设置。 - 执行
userMapper.updateById(user)
后,MyBatis-Plus 会自动调用MyMetaObjectHandler
的updateFill
方法,为updateTime
字段设置当前时间。
四、注意事项 ⚠️
- 确保你的填充处理器类被 Spring 管理(例如通过
@Component
注解)。 - 使用
strictInsertFill
和strictUpdateFill
方法可以避免覆盖已有值。 - 如果你的字段类型不是
LocalDateTime
,需要根据实际类型进行调整。 - 如果你的字段名不是
createTime
和updateTime
,需要在填充处理器中修改字段名。 - 如果你的数据库字段类型是
TIMESTAMP
,建议使用LocalDateTime
或Instant
作为 Java 类型,并配置相应的类型处理器。 - 如果你的数据库字段类型是
DATE
,建议使用LocalDate
作为 Java 类型。
五、总结 🎉
MyBatis-Plus 的自动填充功能可以极大地简化开发,提高效率,并保证数据的一致性。 通过定义实体类字段、编写填充处理器和配置 MyBatis-Plus,可以轻松实现创建时间和更新时间字段的自动填充。 希望篇文章能够帮助你理解和使用 MyBatis-Plus 的自动填充功能。 🥳