Auditing翻译过来是审计和审核;Spring的优秀之处在于帮我们想到了很多我们平时烦琐事情的解决方案,我们在实际的业务系统中,针对一张表的操作大部分是需要记录谁什么时间创建的,谁什么时间修改的,并且能让我们方便地记录操作日志。Spring Data JPA为我们提供了审计功能的架构实现,提供了4个注解专门解决这件事情:
- 1、@CreatedDate 创建的时间
- 2、@CreatedBy 创建的用户
- 3、@LastModifiedBy 最后修改的用户
- 4、@LastModifiedDate 最后修改的时间
Maven 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.28</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
配置文件
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql:///jpa-study-extension?useUnicode=true&characterEncoding=UTF-8
#控制台显示SQL
spring.jpa.show-sql=true
#JPA配置
spring.jpa.database=mysql
#数据库平台
spring.jpa.database-platform=mysql
#每次启动项目时,数据库初始化策略
spring.jpa.hibernate.ddl-auto=update
#指定默认的存储引擎为InnoDB
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
玩转Auditing
import lombok.Builder;
import lombok.Data;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
/**
* @author cheng-qiang
* @date 2020年07月12日 13:03
* @参考资料: 第一步: 在实体类中配置Auditing事件
* 1、@EntityListeners(AuditingEntityListener.class)
* 2、@CreatedDate 创建的时间
* 3、@CreatedBy 创建的用户
* 4、@LastModifiedBy 最后修改的用户
* 5、@LastModifiedDate 最后修改的时间
* @Description:
*/
@Builder
@Data
@Entity
@Table(name = "cheng_qiang",schema = "test",catalog = "")
@EntityListeners(AuditingEntityListener.class)
public class ChengQiang{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id",nullable = false)
private Integer id;
@CreatedDate
@Column(name = "create_time",nullable = true)
private Date createTime;
@CreatedBy
@Column(name = "create_user_id",nullable = true)
private Integer createUserId;
@LastModifiedBy
@Column(name = "last_modified_user_id",nullable = true)
private Integer lastModifiedUserId;
@LastModifiedDate
@Column(name = "last_modified_time",nullable = true)
private Date lastModifiedTime;
@Column(name = "huang_name",nullable = true,length = 50)
private String huangName;
@Column(name = "huang_email",nullable = true,length = 50)
private String huangEmail;
}
import org.springframework.data.domain.AuditorAware;
import java.util.Optional;
/**
* @author cheng-qiang
* @date 2020年07月12日 13:27
* @参考资料: 第二步:实现AuditorAware接口告诉JPA当前的用户是谁,返回当前用户Id
* @Description:
*/
public class MyAuditorAware implements AuditorAware<Integer> {
@Override
public Optional<Integer> getCurrentAuditor() {
/**
* 通过实现AuditorAware接口的getCurrentAuditor()方法告诉JPA当前的用户是谁。里面实现方法千差万别,作者列举了两种最常见的方法:
* 1、通过Security取
* 2、通过Request取
* 3、解析token获取当前用户Id
*/
return Optional.empty();
}
}
import com.chen.repository.MyAuditorAware;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@SpringBootApplication
@EnableJpaAuditing //开启JPA的Auditing功能
public class SpringDataJpaExtensionApplication {
public static void main(String[] args) {
SpringApplication.run(SpringDataJpaExtensionApplication.class, args);
}
/**
* 告诉应用AuditorAware的实现类是谁
* @return
*/
@Bean
public AuditorAware<Integer> auditorProvider(){
return new MyAuditorAware();
}
}
import com.chen.pojo.ChengQiang;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @author cheng-qiang
* @date 2020年07月12日 13:38
* @参考资料:
* @Description:
*/
public interface ChengQiangRepository extends JpaRepository<ChengQiang,Long>, JpaSpecificationExecutor<ChengQiang> {
}
测试:
import com.chen.pojo.ChengQiang;
import com.chen.repository.ChengQiangRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @author cheng-qiang
* @date 2020年07月12日 13:39
* @参考资料:
* @Description:
*/
@SpringBootTest
public class ChengQiangRepositoryTest {
@Autowired
private ChengQiangRepository chengQiangRepository ;
@Test
public void testSaveHuangLin(){
ChengQiang chengQiang= ChengQiang.builder().huangEmail("2661254959@qq.com").huangName("言少钱").build();
chengQiangRepository.save(chengQiang);
/**
* 观察数据库发现:
* 创建的时间和最后修改的时间值已经保存起来了 如: 2020-07-12 13:46:49.569000
* 但是我们在保存操作的时候并没有给这两个属性赋值!说明我们配置Auditing事件生效了!
*/
}
}