MyBatis-Plus公共字段自动填充

10 篇文章 0 订阅
6 篇文章 0 订阅

MyBatis-Plus公共字段自动填充

一、准备工作

  1. 在SpringBoot项目中导入必要的依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <!--mysql连接驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- mybatis-plus启动器 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.3.0</version>
    </dependency>
</dependencies>
  1. 配置yml文件
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/metaobjecthandler?serverTimezone=GMT%2B8
    username: root
    password: root
  1. 创建数据库和表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` varchar(19) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '主键ID',
  `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '姓名',
  `age` int(0) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '邮箱',
  `gmt_create` datetime(0) DEFAULT NULL COMMENT '创建时间',
  `gmt_modified` datetime(0) DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
  1. 使用MyBatisX插件生成实体类,mapper和server

image-20221020155254229

image-20221020155304227

image-20221020155314823

箭头指向的是生成的代码
image-20221020155348514

在SpringBoot启动类上加上MapperScan注解指定Mapper扫描

image-20221020155930320

  1. 在User类的公共自动上加入注解
// @TableField(fill = FieldFill.INSERT) 为插入是自动填充
// @TableField(fill = FieldFill.INSERT_UPDATE) 为插入和更新时自动填充

/**
 * 创建时间
 */
@TableField(fill = FieldFill.INSERT)
private Date gmtCreate;

/**
 * 更新时间
 */
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;

二、编写自动填充规则

创建MyMetaObjectHandler类实现MetaObjectHandler接口,重写insertFill和updateFill方法

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        // 方法1:在3.3.0+版本可以使用strictInsertFill()、strictUpdateFill()方法
        this.strictInsertFill(metaObject, "gmtCreate", Date.class, new Date());
        this.strictUpdateFill(metaObject, "gmtModified", Date.class, new Date());
        // 方法2:通用的自动填充方法
        // this.setFieldValByName("gmtCreate", new Date(), metaObject);
        // this.setFieldValByName("gmtModified", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        // 这里只有为空才会填充数据 所以修改一下
        // 方法1:在3.3.0+版本可以使用strictUpdateFill()方法
        try {
            if(metaObject.hasSetter("gmtModified")){
                metaObject.setValue("gmtModified", null);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        this.strictUpdateFill(metaObject, "gmtModified", Date.class, new Date());
        // 方法2:通用的自动填充方法
        // this.setFieldValByName("gmtModified", new Date(), metaObject);
    }
}

注意点:

  • 重写的insertFill()和updateFill()方法分别是在插入和更新时执行的
  • strictInsertFill()和strictUpdateFill()方法是在3.3.0+版本中可使用
  • 选择填充的字段是实体类的属性,不是数据库字段名
  • MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充,所以在updateFill()方法中,要先将原先字段设为空,再进行自动填充,否则在该字段有值时执行更新也不能修改该字段的值;方法2通用自动填充方法没有这个问题

三、编写测试类

@SpringBootTest
class MetaobjecthandlerApplicationTests {

    @Autowired
    private UserService userService;

    @Test
    public void testInsert() {
        User user = new User();
        user.setName("张三");
        user.setAge(24);
        user.setEmail("110@qq.com");
        userService.save(user);
        User byId = userService.getById(user.getId());
        System.out.println(user);
        // User [Hash = 453031036, id=1583009524883664898, name=张三, age=24, email=110@qq.com, gmtCreate=Thu Oct 20 16:17:36 CST 2022, gmtModified=Thu Oct 20 16:17:36 CST 2022, serialVersionUID=1]
    }

    @Test
    public void testUpdate() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("name","张三");
        User user1 = userService.getOne(wrapper);
        user1.setAge(36);
        userService.updateById(user1);
        User user2 = userService.getOne(wrapper);
        System.out.println(user2);
        // User [Hash = 453445056, id=1583009524883664898, name=张三, age=36, email=110@qq.com, gmtCreate=Thu Oct 20 16:17:36 CST 2022, gmtModified=Thu Oct 20 16:18:58 CST 2022, serialVersionUID=1]
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Mybatis-Plus提供了公共字段填充的功能,可以在插入和更新操作时自动填充公共字段,减少代码重复和出错的可能性。下面是Java代码实现公共字段填充的示例: 1. 创建公共字段填充器类 ```java @Component public class MyMetaObjectHandler implements MetaObjectHandler { // 插入时填充字段 private static final String CREATE_TIME = "createTime"; private static final String UPDATE_TIME = "updateTime"; private static final String CREATE_BY = "createBy"; private static final String UPDATE_BY = "updateBy"; @Override public void insertFill(MetaObject metaObject) { // 填充创建时间和更新时间 this.strictInsertFill(metaObject, CREATE_TIME, LocalDateTime::now, LocalDateTime.class); this.strictInsertFill(metaObject, UPDATE_TIME, LocalDateTime::now, LocalDateTime.class); // 填充创建人和更新人 this.strictInsertFill(metaObject, CREATE_BY, "system", String.class); this.strictInsertFill(metaObject, UPDATE_BY, "system", String.class); } @Override public void updateFill(MetaObject metaObject) { // 填充更新时间 this.strictUpdateFill(metaObject, UPDATE_TIME, LocalDateTime::now, LocalDateTime.class); // 填充更新人 this.strictUpdateFill(metaObject, UPDATE_BY, "system", String.class); } } ``` 2. 配置公共字段填充器 ```java @Configuration public class MybatisPlusConfig { @Autowired private MyMetaObjectHandler metaObjectHandler; @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加公共字段填充器 List<MetaObjectHandler> metaObjectHandlers = new ArrayList<>(); metaObjectHandlers.add(metaObjectHandler); interceptor.setMetaObjectHandlers(metaObjectHandlers); return interceptor; } } ``` 在以上示例中,我们创建了一个名为MyMetaObjectHandler的公共字段填充器类,实现了MetaObjectHandler接口,并在insertFill和updateFill方法中分别填充了创建时间、更新时间、创建人和更新人等公共字段。然后在MybatisPlusConfig中将MyMetaObjectHandler配置到MybatisPlusInterceptor中,作为公共字段填充器。这样,在执行插入和更新操作时,就会自动填充公共字段,无需手动设置,大大提高了开发效率和数据准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oneMoe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值