6、关于SpringBoot 和 Spring data jpa 教你玩转Auditing监听事件

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事件生效了!
         */
    }
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值