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审计功能暂时未进行验证。