当前位置: 首页 > news >正文

Java-实现公有字段自动注入(创建人、创建时间、修改人、修改时间)

文章目录

  • Mybatis-plus实现自动注入
    • 定义 MetaObjectHandler
    • 配置 MyBatis-Plus 使用 MetaObjectHandler
    • 实体类字段注解
    • 使用服务类进行操作测试
  • Jpa启用审计功能实现自动注入
    • 添加依赖
    • 启动类启用审计功能
    • 实现AuditorAware接口
    • 实体类中使用审计注解
  • 总结

自动注入创建人、创建时间、修改人、修改时间需要根据使用的技术栈进行区别处理,本文介绍Jpa和Mybatis-plus两种方式进行自动注入

Mybatis-plus实现自动注入

在使用 MyBatis-Plus 进行数据库操作时,我们经常需要自动处理一些字段,比如创建人、创建时间、修改人、修改时间等。MyBatis-Plus 提供了多种方式来自动填充这些字段,主要通过 MetaObjectHandler 接口实现。

定义 MetaObjectHandler

首先,你需要定义一个实现了 MetaObjectHandler 接口的类,并重写 insertFill 和 updateFill 方法,用于设置默认的创建人和修改人、创建时间和修改时间。

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.setFieldValByName("createBy", "admin", metaObject);
        // 创建时间
        this.setFieldValByName("createTime", new Date(), metaObject);
        // 修改人
        this.setFieldValByName("updateBy", "admin", metaObject);
        // 修改时间
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
 
    @Override
    public void updateFill(MetaObject metaObject) {
        // 修改人
        this.setFieldValByName("updateBy", "admin", metaObject);
        // 修改时间
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

配置 MyBatis-Plus 使用 MetaObjectHandler

确保你的 Spring Boot 应用中已经包含了 MyBatis-Plus 的自动配置,通常在你的 Spring Boot 启动类或者配置类中添加如下配置:

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
@MapperScan("com.yourpackage.mapper") // 确保扫描到你的 Mapper 接口包路径
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

实体类字段注解

在你的实体类中,使用 @TableField 注解标记需要自动填充的字段。例如:

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.util.Date;
 
@TableName("your_table")
public class YourEntity {
    @TableId
    private Long id;
    private String name;
    @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;
    // getters and setters...
}

使用服务类进行操作测试

现在,当你使用 MyBatis-Plus 的 Service 类进行数据的插入或更新操作时,MyMetaObjectHandler 中的逻辑会自动触发,填充相应的字段。例如:

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.yourpackage.mapper.YourEntityMapper; // 确保这是你的 Mapper 接口全名路径
import com.yourpackage.entity.YourEntity; // 确保这是你的实体类全名路径
import org.springframework.transaction.annotation.Transactional;
 
@Service
public class YourEntityService extends ServiceImpl<YourEntityMapper, YourEntity> {
    @Transactional // 确保操作在事务中执行,以便自动填充字段正确工作。
    public void createEntity(YourEntity entity) {
        this.save(entity); 
     }

Jpa启用审计功能实现自动注入

添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-jpa</artifactId>
 </dependency>
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-security</artifactId>
 </dependency>

启动类启用审计功能

@SpringBootApplication
@EnableJpaAuditing
public class ManageApplication {

    public static void main(String[] args) {
        SpringApplication.run(ManageApplication.class, args);
    }

}

实现AuditorAware接口

@Component
public class SpringSecurityAuditorAware implements AuditorAware<String> {
    @Override
    public Optional<String> getCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null && authentication.isAuthenticated()) {
            // 获取当前登录用户名
            String username = authentication.getName();
            return Optional.of(username);
        }
        return Optional.of(authentication.getPrincipal().toString());
    }
}

实体类中使用审计注解

使用 @CreatedBy、@CreatedDate、@LastModifiedBy 和 @LastModifiedDate 注解来自动记录和更新创建和修改信息。

public class BaseEntity {

    @TableId(type = IdType.ASSIGN_ID)
    String id;

    @CreatedBy
    String createId;

    @CreatedDate
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    Date createDate;

    @LastModifiedBy
    String modifyId;

    @LastModifiedDate
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    Date modifyDate;
    }

总结

Mybatis-plus经过验证可以实现自动注入,Jpa审计功能暂时未进行验证。

相关文章:

  • 神经网络之损失函数
  • Linux主要开发工具之gcc、gdb与make
  • 模型压缩技术从零到一
  • NO.67十六届蓝桥杯备战|基础算法-倍增思想|快速幂|快速乘法(C++)
  • nacos的地址应该配置在项目的哪个文件中
  • 【网安】处理项目中的一些常见漏洞bug(java相关)
  • 换脸视频FaceFusion3.1.0-附整合包
  • Lua语言的边缘计算
  • 蓝桥杯 web 展开你的扇子(css3)
  • Linux : 内核中的信号捕捉
  • 15分钟完成Odoo18.0安装与基本配置
  • OpenSceneGraph 中的 LOD详解
  • USB3.0走线注意事项和其中的协议
  • 音视频学习(三十二):VP8和VP9
  • MCP项目开发-一个简单的RAG示例
  • 第15届蓝桥杯java-c组省赛真题
  • 其他 vector 操作详解(四十)
  • 如何做到一个项目的高可用保障
  • 美国mlb与韩国mlb的关系·棒球9号位
  • 第五章 定积分 第二节 微积分基本公式
  • 网站建设毕业设计目录/在哪里可以做百度推广
  • 手机做网站软件/微信怎么推广自己的产品
  • 网页制作软件英文名字/杭州网站seo优化
  • 百度网站域名费一年多少钱/淘宝优化
  • 厦门网站做的比较好/舆情视频
  • 个人备案后做淘客网站/什么都不懂能去干运营吗