MyBatis-Plus自动填充字段的详细教程

 更新时间:2024年08月16日 08:40:29   作者:IT小辉同学  
今天编写一个详细的教程来介绍如何在 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,从而自动获得 createTimeupdateTime 字段的自动填充功能。

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. 验证自动填充功能

通过简单的单元测试或集成测试,验证 createTimeupdateTime 字段在插入和更新时是否正确自动填充。

7. 其他注意事项

  • 字段类型: 确保数据库中的 createTimeupdateTime 字段类型与 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 是否正确注册,字段类型是否匹配,以及数据库配置是否正确。

以上就是MyBatis-Plus自动填充字段的详细教程的详细内容,更多关于MyBatis-Plus自动填充字段的资料请关注脚本之家其它相关文章!

相关文章

  • java新人基础入门之递归调用

    java新人基础入门之递归调用

    这篇文章主要给大家介绍了关于java新人基础入门之递归调用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Spring AOP 实现自定义注解的示例

    Spring AOP 实现自定义注解的示例

    这篇文章主要介绍了Spring AOP 实现自定义注解的示例,帮助大家更好的理解和学习使用spring框架,感兴趣的朋友可以了解下
    2021-03-03
  • Java实现冒泡排序算法

    Java实现冒泡排序算法

    这篇文章主要为大家详细介绍了java实现冒泡排序算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Java NIO写大文件对比(win7和mac)

    Java NIO写大文件对比(win7和mac)

    这篇文章主要介绍了Java NIO写大文件对比(win7和mac),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 深入了解Java中Volatile关键字

    深入了解Java中Volatile关键字

    这篇文章主要介绍了Java中Volatile关键字的相关知识,文章讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • java.net.ConnectException: Connection refused问题解决办法

    java.net.ConnectException: Connection refused问题解决办法

    这篇文章主要介绍了java.net.ConnectException: Connection refused问题解决办法的相关资料,需要的朋友可以参考下
    2016-12-12
  • 浅析如何在SpringBoot中实现数据脱敏

    浅析如何在SpringBoot中实现数据脱敏

    脱敏是指在不改变原数据结构的前提下,通过某种方式处理数据,使数据不能直接暴露用户的真实信息,下面我们就来看看SpringBoot中实现数据脱敏的具体方法吧
    2024-03-03
  • JAVA自定义注解详情

    JAVA自定义注解详情

    这篇文章主要介绍了Java自定义注解,结合实例形式总结分析了java常见的自定义注解类型、功能、用法及操作注意事项,需要的朋友可以参考下
    2021-10-10
  • 详解Java多线程tryLock()方法使用

    详解Java多线程tryLock()方法使用

    本文主要介绍了Java多线程tryLock()方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • SpringBoot整合SpringSecurityOauth2实现鉴权动态权限问题

    SpringBoot整合SpringSecurityOauth2实现鉴权动态权限问题

    这篇文章主要介绍了SpringBoot整合SpringSecurityOauth2实现鉴权-动态权限,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06

最新评论