欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Data JPA的Audit功能審計(jì)數(shù)據(jù)庫(kù)的變更

 更新時(shí)間:2021年06月26日 09:48:03   作者:南瓜慢說(shuō)  
數(shù)據(jù)庫(kù)審計(jì)是指當(dāng)數(shù)據(jù)庫(kù)有記錄變更時(shí),可以記錄數(shù)據(jù)庫(kù)的變更時(shí)間和變更人等,這樣以后出問(wèn)題回溯問(wèn)責(zé)也比較方便,本文討論Spring Data JPA審計(jì)數(shù)據(jù)庫(kù)變更問(wèn)題,感興趣的朋友一起看看吧

我最新最全的文章都在 南瓜慢說(shuō) www.pkslow.com ,歡迎大家來(lái)喝茶!

1 數(shù)據(jù)庫(kù)審計(jì)

數(shù)據(jù)庫(kù)審計(jì)是指當(dāng)數(shù)據(jù)庫(kù)有記錄變更時(shí),可以記錄數(shù)據(jù)庫(kù)的變更時(shí)間和變更人等,這樣以后出問(wèn)題回溯問(wèn)責(zé)也比較方便。對(duì)于審計(jì)表記錄的變更可以?xún)煞N方式,一種是建立一張審計(jì)表專(zhuān)門(mén)用于記錄,另一種是在數(shù)據(jù)庫(kù)增加字段。本文所討論的是第二種方案。

那如何在新增、修改、刪除的時(shí)候同時(shí)增加記錄呢?如果每張表都單獨(dú)記錄,代碼就會(huì)顯得很冗余。更好的方式應(yīng)該是做切面或者事件監(jiān)聽(tīng),當(dāng)數(shù)據(jù)有變更時(shí)統(tǒng)一進(jìn)行記錄。

2 Spring Data JPA審計(jì)

Spring Data JPA為我們提供了方便的Audit功能,通過(guò)四個(gè)注解來(lái)標(biāo)記字段:

(1) @CreatedBy: 創(chuàng)建人

(2) @CreatedDate: 創(chuàng)建時(shí)間

(3) @LastModifiedBy: 最后修改人

(4) @LastModifiedDate: 最后修改時(shí)間

接下來(lái)我們來(lái)看看怎么使用。

2.1 項(xiàng)目準(zhǔn)備

通過(guò)Docker啟動(dòng)PostgreSQL數(shù)據(jù)庫(kù):

docker run -itd \
    --name pkslow-postgres \
    -e POSTGRES_DB=pkslow \
    -e POSTGRES_USER=pkslow \
    -e POSTGRES_PASSWORD=pkslow \
    -e PGDATA=/var/lib/postgresql/data/pgdata \
    -p 5432:5432 \
    postgres:10

引入相關(guān)依賴(lài):

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

Spring Security不是必須的,這里使用它來(lái)獲取用戶(hù)名。配置的用戶(hù)為:

spring.security.user.name=pkslow
spring.security.user.password=123456

2.2 創(chuàng)建實(shí)體父類(lèi)

其實(shí)父類(lèi)不是必須的,你可以在每個(gè)想Audit的實(shí)體類(lèi)進(jìn)行配置,但比較麻煩,不如創(chuàng)建一個(gè)父類(lèi),再讓想審計(jì)的子類(lèi)都繼承它:

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class Auditable<U> {
    @CreatedBy
    @Column(name = "created_by")
    private U createdBy;

    @CreatedDate
    @Column(name = "created_date")
    private Date createdDate;

    @LastModifiedBy
    @Column(name = "last_modified_by")
    private U lastModifiedBy;

    @LastModifiedDate
    @Column(name = "last_modified_date")
    private Date lastModifiedDate;
  // getter
  //setter
}

@MappedSuperclass可以讓其它子實(shí)體類(lèi)繼承相關(guān)的字段和屬性;

@EntityListeners設(shè)置監(jiān)聽(tīng)類(lèi),會(huì)對(duì)新增修改進(jìn)行回調(diào)處理。

有了父類(lèi)之后,子類(lèi)就簡(jiǎn)單了:

@Entity
@Table(name = "pkslow_users")
public class User extends Auditable<String> {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long userId;
    private String name;
    private String email;
    private String country;
    private String website;
  //getter setter
}

2.3 如何獲取名字

數(shù)據(jù)總是被修改的,我們要提供一個(gè)獲取修改人名字的接口,配置如下:

@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
public class JpaAuditingConfiguration {

    @Bean
    public AuditorAware<String> auditorProvider() {
        return () -> {
            String username = "system";
            SecurityContext context = SecurityContextHolder.getContext();
            if (context != null) {
                Authentication authentication = context.getAuthentication();
                if (authentication != null) {
                    username = authentication.getName();
                }
            }

            String result = username;
            return Optional.ofNullable(result);
        };
    }
}

這里配置的是通過(guò)Spring SecurityContext來(lái)獲取登陸用戶(hù)的名字,當(dāng)然可以有其它方案,如獲取請(qǐng)求頭的某個(gè)字段等。

注意注解@EnableJpaAuditing開(kāi)啟了審計(jì)功能。

2.4 測(cè)試

我們通過(guò)一個(gè)Controller來(lái)新增數(shù)據(jù),看看會(huì)有什么效果:

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserRepository userRepository;
    @PostMapping
    public User save(@RequestBody User user) {
        return userRepository.save(user);
    }
}

通過(guò)curl命令來(lái)測(cè)試如下:

$ curl 'http://localhost:8088/user' -X POST \
> -H 'Content-Type: application/json' \
> -H 'Authorization:Basic cGtzbG93OjEyMzQ1Ng==' \
> -d '{
>     "name":"larry",
>     "email":"admin@pkslow.com",
>     "country":"China",
>     "website":"www.pkslow.com"
> }'
{"createdBy":"pkslow","createdDate":"2021-01-15T15:08:47.035+0000","lastModifiedBy":"pkslow","lastModifiedDate":"2021-01-15T15:08:47.035+0000","userId":7,"name":"larry","email":"admin@pkslow.com","country":"China","website":www.pkslow.com}

查看數(shù)據(jù)庫(kù),已經(jīng)生成了審計(jì)記錄:

3 總結(jié)

代碼請(qǐng)查看:https://github.com/LarryDpk/pkslow-samples

到此這篇關(guān)于Spring Data JPA的Audit功能審計(jì)數(shù)據(jù)庫(kù)的變更的文章就介紹到這了,更多相關(guān)Spring Data JPA審計(jì)數(shù)據(jù)庫(kù)變更內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)二維碼生成的幾個(gè)方法(推薦)

    java實(shí)現(xiàn)二維碼生成的幾個(gè)方法(推薦)

    本篇文章主要介紹了java實(shí)現(xiàn)二維碼生成的幾個(gè)方法(推薦),具有一定的參考價(jià)值,有興趣的可以了解一下。
    2016-12-12
  • 學(xué)習(xí)JVM之java內(nèi)存區(qū)域與異常

    學(xué)習(xí)JVM之java內(nèi)存區(qū)域與異常

    關(guān)于JVM內(nèi)存區(qū)域的知識(shí)對(duì)于初學(xué)者來(lái)說(shuō)其實(shí)是很重要的,了解Java內(nèi)存分配的原理,這對(duì)于以后JAVA的學(xué)習(xí)會(huì)有更深刻的理解。下面來(lái)看看詳細(xì)介紹。
    2016-07-07
  • Java動(dòng)態(tài)加載類(lèi)示例詳解

    Java動(dòng)態(tài)加載類(lèi)示例詳解

    這篇文章主要給大家介紹了關(guān)于Java動(dòng)態(tài)加載類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • String.intern()作用與常量池關(guān)系示例解析

    String.intern()作用與常量池關(guān)系示例解析

    這篇文章主要為大家介紹了String.intern()作用與常量池關(guān)系示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • servlet之cookie簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    servlet之cookie簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Cookie技術(shù)誕生以來(lái),它就成了廣大網(wǎng)絡(luò)用戶(hù)和Web開(kāi)發(fā)人員爭(zhēng)論的一個(gè)焦點(diǎn)。下面這篇文章主要給大家介紹了關(guān)于servlet之cookie簡(jiǎn)介的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-07-07
  • java數(shù)據(jù)結(jié)構(gòu)與算法之插入算法實(shí)現(xiàn)數(shù)值排序示例

    java數(shù)據(jù)結(jié)構(gòu)與算法之插入算法實(shí)現(xiàn)數(shù)值排序示例

    這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)與算法之插入算法實(shí)現(xiàn)數(shù)值排序的方法,結(jié)合簡(jiǎn)單實(shí)例形式分析了插入算法的節(jié)點(diǎn)操作與排序相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-08-08
  • Mybatis-Spring源碼分析圖解

    Mybatis-Spring源碼分析圖解

    這篇文章主要介紹了Mybatis-Spring源碼分析,本文通過(guò)實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • Java對(duì)類(lèi)私有變量的暴力反射技術(shù)講解

    Java對(duì)類(lèi)私有變量的暴力反射技術(shù)講解

    今天小編就為大家分享一篇關(guān)于Java對(duì)類(lèi)私有變量的暴力反射技術(shù)講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • Spring源碼學(xué)習(xí)之動(dòng)態(tài)代理實(shí)現(xiàn)流程

    Spring源碼學(xué)習(xí)之動(dòng)態(tài)代理實(shí)現(xiàn)流程

    這篇文章主要給大家介紹了關(guān)于Spring源碼學(xué)習(xí)之動(dòng)態(tài)代理實(shí)現(xiàn)流程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 基于java實(shí)現(xiàn)租車(chē)管理系統(tǒng)

    基于java實(shí)現(xiàn)租車(chē)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于java實(shí)現(xiàn)租車(chē)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12

最新評(píng)論