javascript
什么是Spring Data?
(這與“學生計劃”有關,稍后我將重新討論該主題。)
Spring Data在最近的幾次采訪中獲得通過。 什么是Spring Data ?
為了回答這個問題,讓我們考慮持久性的標準方法–所有訪問都是通過數據訪問對象 (DAO)進行的。 這將系統的其余部分與持久性機制的特定細節完全隔離開來。 這聽起來很容易,但是任何曾經做過一個不平凡的項目的人都知道這是一個很大的麻煩。
DAO代碼很無聊。
它是單調的,它具有很多非常相似的代碼,并且輕微的錯誤可能會導致很多損壞。 更糟糕的是,它違反了“ 不要自己重復” (DRY)的原則,因為大多數信息已在JPA批注中捕獲。
這是一個很大的問題,已經有多年的代碼生成工具了。 從理論上講,他們解決了問題,但在實踐中,他們介紹了自己的問題。 例如,需要自定義配置文件或注釋。
將接口用作DRY合同
Java世界中最終的DRY合同是什么? 這很簡單–它是一個接口。 給定一個接口和一個模板,我們可以使用CGLib在應用程序啟動過程中即時生成必要的類。 雖然性能略有下降,但與優點相比還是比較適中的。
學生.java
@Entity public class Student {private Integer id;private String uuid;private String name;private String emailAddress;private Integer creditHours;@Idpublic Integer getId() { return id; }public void setId(Integer id) { this.id = id; }@Column(unique=true)public String getUuid() { return uuid; }public void setUuid(String uuid) { this.uuid = uuid; }@Columnpublic String getName() { return name; }public void setName(String name) { this.name = name; }@Column(unique=true)public String getEmailAddress() { return emailAddress; }public void setEmailAddress(String emailAddress) { this.emailAddress; }@Columnpublic Integer getCreditHours() { return creditHours; }public void setCreditHours(Integer creditHours) { this.creditHours = creditHours; } }我們的界面會是什么樣?
倉庫/StudentRepository.java
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository;@Repository public interface StudentRepository extends CrudRepository<Student, Integer> {// this could also be getByUuid() or fetchByUuid() - all are recognizedStudent findStudentByUuid(String uuid);Student findStudentByEmailAddress(String emailAddress);List<Student> findStudentsByNameLike(String pattern);// we can use a custom query@Query("select s from Student s where s.creditHours < 15")List<Student> findFreshmen(); }等等。 總共有15個謂詞可以單獨使用或組合使用。
- 和
- 要么
- 之間
- 少于
- 比...更棒
- 一片空白
- IsNotNull
- 不為空
- 喜歡
- 不喜歡
- 按訂單
- 不
- 在
- 不在
- 忽略大小寫
注意,沒有必要實現此接口! CGLib為我們解決了這一問題。
定制方法
有時我們需要編寫我們自己的DAO方法。 它們很容易集成到生成的代碼中。
public interface StudentExtras {Student flogStudent(Student student); }@Repository public interface StudentRepository extends CrudRepository<Student, Integer>, <em>StudentExtras</em> { }// this class does NOT implement StudentRepository! public class StudentRepositoryImpl implements StudentExtras {public Student flogStudent(Student student) { ... } }自定義方法必須是特定的類(由于按約定進行配置),但不受其他限制。
NoSQL
Spring Data還透明地支持NoSQL數據庫:Mondo(文檔),Neo4j(圖形),Redis(鍵值),Hadoop(映射減少)和GemFire。
分頁
最后,我們有分頁的問題。 用戶界面通常僅查看可用信息的子集,例如25個項目的頁面。 分頁并不困難,只是無聊且容易出錯。
Spring Data通過擴展PagingAndSortingRepository接口而不是CrudRepository接口來支持分頁。
翻譯自: https://www.javacodegeeks.com/2013/12/what-is-spring-data.html
總結
以上是生活随笔為你收集整理的什么是Spring Data?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 减压阀的设置(减压阀的设置条件)
- 下一篇: 使用Spring RestTemplat