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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

通过投影增强数据模型

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

介紹

數(shù)據(jù)模型可能很棘手。 建??赡軙永щy。 有時候,應(yīng)該放入數(shù)據(jù)庫表中的信息不一定是我們要在每段代碼中使用的信息。

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

在本文中,我們將看到一個如何使用投影的簡單示例。

基礎(chǔ)

好的,讓我們設(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; }

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

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

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

對,所以,我們有一個很好的實體。 怎么了

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

讓我們看一下這個存儲庫:

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

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

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

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

退還最低要求

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

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

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

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

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

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

結(jié)論

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

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

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

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

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

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