javascript
什么是Spring Data?
(這與“學(xué)生計(jì)劃”有關(guān),稍后我將重新討論該主題。)
Spring Data在最近的幾次采訪中獲得通過。 什么是Spring Data ?
為了回答這個(gè)問題,讓我們考慮持久性的標(biāo)準(zhǔn)方法–所有訪問都是通過數(shù)據(jù)訪問對(duì)象 (DAO)進(jìn)行的。 這將系統(tǒng)的其余部分與持久性機(jī)制的特定細(xì)節(jié)完全隔離開來(lái)。 這聽起來(lái)很容易,但是任何曾經(jīng)做過一個(gè)不平凡的項(xiàng)目的人都知道這是一個(gè)很大的麻煩。
DAO代碼很無(wú)聊。
它是單調(diào)的,它具有很多非常相似的代碼,并且輕微的錯(cuò)誤可能會(huì)導(dǎo)致很多損壞。 更糟糕的是,它違反了“ 不要自己重復(fù)” (DRY)的原則,因?yàn)榇蠖鄶?shù)信息已在JPA批注中捕獲。
這是一個(gè)很大的問題,已經(jīng)有多年的代碼生成工具了。 從理論上講,他們解決了問題,但在實(shí)踐中,他們介紹了自己的問題。 例如,需要自定義配置文件或注釋。
將接口用作DRY合同
Java世界中最終的DRY合同是什么? 這很簡(jiǎn)單–它是一個(gè)接口。 給定一個(gè)接口和一個(gè)模板,我們可以使用CGLib在應(yīng)用程序啟動(dòng)過程中即時(shí)生成必要的類。 雖然性能略有下降,但與優(yōu)點(diǎn)相比還是比較適中的。
學(xué)生.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; } }我們的界面會(huì)是什么樣?
倉(cāng)庫(kù)/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個(gè)謂詞可以單獨(dú)使用或組合使用。
- 和
- 要么
- 之間
- 少于
- 比...更棒
- 一片空白
- IsNotNull
- 不為空
- 喜歡
- 不喜歡
- 按訂單
- 不
- 在
- 不在
- 忽略大小寫
注意,沒有必要實(shí)現(xiàn)此接口! CGLib為我們解決了這一問題。
定制方法
有時(shí)我們需要編寫我們自己的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) { ... } }自定義方法必須是特定的類(由于按約定進(jìn)行配置),但不受其他限制。
NoSQL
Spring Data還透明地支持NoSQL數(shù)據(jù)庫(kù):Mondo(文檔),Neo4j(圖形),Redis(鍵值),Hadoop(映射減少)和GemFire。
分頁(yè)
最后,我們有分頁(yè)的問題。 用戶界面通常僅查看可用信息的子集,例如25個(gè)項(xiàng)目的頁(yè)面。 分頁(yè)并不困難,只是無(wú)聊且容易出錯(cuò)。
Spring Data通過擴(kuò)展PagingAndSortingRepository接口而不是CrudRepository接口來(lái)支持分頁(yè)。
翻譯自: https://www.javacodegeeks.com/2013/12/what-is-spring-data.html
總結(jié)
以上是生活随笔為你收集整理的什么是Spring Data?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 减压阀的设置(减压阀的设置条件)
- 下一篇: 使用Spring RestTemplat