Home
img of docs

介绍如何在MyBatis-Plus框架中自动处理实体对象的创建人和更新人的字段,以便在执行插入和更新操作时自动填充这些字段。

chou403

/ Mybaits

/ c:

/ u:

/ 4 min read


Mybatis-Plus 如何操作更新创建人这些东西具体实现方法类

在使用 MyBatis-Plus 时,可以通过插件,拦截器和注解来自动处理字段的填充,例如更新和创建人,创建时间和更新时间等。MyBatis-Plus 提供了自动填充功能,通过实现MetaObjectHandler接口来实现自动填充功能。

以下是具体实现步骤:

1. MyBatis-Plus 引入依赖

确保你的项目中已经引入了 MyBatis-Plus 依赖。以下是 Maven 依赖配置:

   <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3.4</version>
</dependency>

2. 配置自动填充处理器

创建一个类实现 MetaObjectHandler 接口,重写 insertFillupdateFill 方法来处理自动填充逻辑。

MetaObjectHandler 示例代码
   import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        // 自动填充创建时间和创建人
        this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
        this.setFieldValByName("createBy", getCurrentUser(), metaObject);
        // 如果更新人和更新时间也需要在插入时填充
        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
        this.setFieldValByName("updateBy", getCurrentUser(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        // 自动填充更新时间和更新人
        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
        this.setFieldValByName("updateBy", getCurrentUser(), metaObject);
    }

    // 获取当前用户的方法(需要自行实现)
    private String getCurrentUser() {
        // 示例: 从安全上下文中获取当前用户名
        // return SecurityContextHolder.getContext().getAuthentication().getName();
        return "system"; // 示例返回固定值
    }
}

3. 在实体类中使用注解

在需要自动填充的字段上使用 @TableField 注解的 fill 属性来指定自动填充策略。

@TableField 示例代码
   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 java.time.LocalDateTime;

@TableName("your_table_name")
public class YourEntity {

    @TableId
    private Long id;

    @TableField(fill = FieldFill.INSERT)
    private String createBy;

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    // getters and setters
}

4. 配置 Spring Boot 配置类

确保你的 Spring Boot 配置类中扫描到 MyMetaObjectHandler 类。

扫描 @MyMetaObjectHandler 示例代码
   import org.springframework.context.annotation.Configuration;
import org.mybatis.spring.annotation.MapperScan;

@Configuration
@MapperScan("com.yourpackage.mapper") // 替换为你的 Mapper 包路径
public class MyBatisPlusConfig {
    // 其他配置
}

5. 验证自动填充功能

现在,当你使用 MyBatis-Plus 执行插入或更新操作时,createBy,createTime,updateByupdateTime 字段会自动填充,无需手动设置。

示例测试代码

   import com.yourpackage.entity.YourEntity;
import com.yourpackage.mapper.YourEntityMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class YourController {

    @Autowired
    private YourEntityMapper yourEntityMapper;

    @PostMapping("/testInsert")
    public void testInsert() {
        YourEntity entity = new YourEntity();
        // entity.setCreateBy("user1"); // 不需要手动设置
        // entity.setCreateTime(LocalDateTime.now()); // 不需要手动设置
        yourEntityMapper.insert(entity);
    }

    @PostMapping("/testUpdate")
    public void testUpdate() {
        YourEntity entity = yourEntityMapper.selectById(1L);
        entity.setSomeField("newValue");
        yourEntityMapper.updateById(entity);
    }
}

通过上述步骤,你可以在使用 MyBatis-Plus 时自动填充创建人和更新人等字段,简化开发并提高代码的可维护性。