日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

弱投影模型_通过投影增强数据模型

發(fā)布時(shí)間:2023/12/3 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 弱投影模型_通过投影增强数据模型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

弱投影模型

介紹

數(shù)據(jù)模型可能很棘手。 建模可能會(huì)更加困難。 有時(shí)候,應(yīng)該放入數(shù)據(jù)庫表中的信息不一定是我們要在每段代碼中使用的信息。

和其他許多次一樣,Spring來了。 一個(gè)稱為投影的小功能可以幫助我們在普通界面中僅用幾行數(shù)據(jù)映射數(shù)據(jù)。

在本文中,我們將看到一個(gè)有關(guān)如何使用投影的簡單示例。

基礎(chǔ)

好的,讓我們設(shè)置場景。 假設(shè)我們有以下實(shí)體:

@Builder @Data @NoArgsConstructor @AllArgsConstructor @Entity @Table @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class User implements Serializable {@Id@SequenceGenerator(name = "user_seq", sequenceName = "user_seq")@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "user_seq")private Long id;@Basicprivate String username;@Basicprivate String salt;@Basicprivate String password;@Basicprivate String firstName;@Basicprivate String lastName; }

此處的一些解釋可能會(huì)有所幫助:讓我們看一下注釋。 老實(shí)說,我很懶,所以Lombok就在我的小巷旁。 Lombok為我們提供了一種很好的聲明方式,表明我們需要:

  • 一個(gè)不錯(cuò)的生成器接口來創(chuàng)建bean( @Builder )
  • 獲取器和設(shè)置器( @Data )
  • 默認(rèn)構(gòu)造函數(shù)( @NoArgsConstructor )
  • 一個(gè)帶有所有字段參數(shù)的構(gòu)造函數(shù)( @AllArgsConstructor )
  • equals()和hashCode() ,但是請使用字段,而不是getters( @EqualsAndHashCode(doNotUseGetters = true) )
  • toString() ; 再次使用字段( @ToString(doNotUseGetter = true) )

其余的注釋( @Entity和@Table )是舊的JPA。

是的,所以,我們有一個(gè)很好的實(shí)體。 怎么了

以傳統(tǒng)方式獲取數(shù)據(jù)

讓我們看一下這個(gè)存儲(chǔ)庫:

@Repository public interface UserRepository extends JpaRepository<User, Long> {}

上面的代碼為我們提供了最少的CRUD方法集。 一個(gè)是getOne(Long id) 。 好,不是嗎?

好吧,正確的答案必須是:這取決于! 為什么? 因?yàn)檫@將返回整個(gè)實(shí)體,包括鹽和哈希密碼。 這是非常敏感的信息。 特別是鹽永遠(yuǎn)不應(yīng)該被外界吸收。

為了從生成的實(shí)體中獲取此信息,我們將不得不做大量的手工工作。 只是從我的頭開始,我們應(yīng)該:*創(chuàng)建一個(gè)新bean *實(shí)現(xiàn)一個(gè)映射器以從我們的實(shí)體獲取到該新bean *確保每次我們處理該實(shí)體時(shí),我們都將其映射*在實(shí)現(xiàn)該實(shí)體時(shí)會(huì)感到頭疼也可能有多種結(jié)果。

退還最低要求

值得慶幸的是,Spring可以確保這一天的安全。 一個(gè)叫做Projections的小功能讓我們以聲明的方式定義映射。 這樣的接口看起來像這樣:

public interface UserProjection {@Value("#{target.getUsername()}")String getUsername();@Value("#{target.getFirstName()}")String getFirstName();@Value("#{target.getLastName()}")String getLastName(); }

Spring將用我們當(dāng)前正在處理的實(shí)體替換target 。 換句話說, target將是User的實(shí)例。

我們現(xiàn)在要做的唯一的事情是這樣的:

@Repository public interface UserRepository extends JpaRepository<User, Long> {UserProjection findById(Long id);List<UserProjection> findAllUser(); }

現(xiàn)在,每次調(diào)用findById() ,我們都會(huì)獲得UserProjection的實(shí)例。 我們的鹽或密碼哈希不能泄漏! 更好的是,我們可以對具有多個(gè)結(jié)果的方法使用相同的過程。

結(jié)論

使用Spring Projections,我們可以節(jié)省很多代碼和麻煩。 @Value()定義可以根據(jù)需要變得復(fù)雜。 例如,在我當(dāng)前的項(xiàng)目中,當(dāng)我們將“有趣的”舊數(shù)據(jù)庫設(shè)計(jì)映射到更簡單的數(shù)據(jù)模型中時(shí),這為我的團(tuán)隊(duì)節(jié)省了很多樣板代碼。

如果您想嘗試一下,可以在GitHub上找到一個(gè)簡單的示例應(yīng)用程序。

翻譯自: https://www.javacodegeeks.com/2018/01/power-data-model-projections.html

弱投影模型

總結(jié)

以上是生活随笔為你收集整理的弱投影模型_通过投影增强数据模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。