Spring Data是什麼?
DAO是標準的持久方法 - 所有的訪問是通過數據訪問對象(DAO)完成。這完全將與持久性機制的具體細節與系統的其餘部分隔離。聽起來很容易,但任何曾經做過一個不是很簡單項目的人都大傷腦筋,因為 DAO代碼很無聊,它有很多非常相似的代碼,稍微有輕微錯誤可能會造成大的錯誤。更糟糕的是它違反了不要重複自己(DRY)的原則,因為大部分的信息在JPA註解實現。
什麼是Java世界的終極DRY實現?其實很簡單 - 就是一個介面。給定一個介面和一個模板,我們可以使用CGLIB在應用程序啟動時生成必要的類。雖然有輕微的性能損失,但相比它的好處還是值得的。
比如有一個實體Student:
@Entity
public class Student {
private Integer id;
private String uuid;
private String name;
private String emailAddress;
private Integer creditHours;
@Id
public 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; }
@Column
public 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; }
@Column
public Integer getCreditHours() { return creditHours; }
public void setCreditHours(Integer creditHours) { this.creditHours = creditHours; }
}
它的介面如下:
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 recognized
Student 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();
}
除了find以外,還可以使用以下謂語:
- And
- Or
- Between
- LessThan
- GreaterThan
- IsNull
- IsNotNull
- NotNull
- Like
- NotLike
- OrderBy
- Not
- In
- NotIn
- IgnoreCase
注意的是,不必要我們實現這個介面,CGLIB會自動產生實現類。 我們直接使用就可以了。
public interface StudentExtras {
Student flogStudent(Student student);
}
@Repository
public interface StudentRepository extends CrudRepository<Student, Integer>, <em>StudentExtras</em> { }
// 這個類並沒有實現 StudentRepository!
public class StudentRepositoryImpl implements StudentExtras {
public Student flogStudent(Student student) { ... }
}
Spring Data還透明支持NoSQL資料庫: MongoDB (documents), Neo4j (graph), Redis (key-value), Hadoop (map-reduce) 和 GemFire.
Spring Data 還支持分頁,通過繼承PagingAndSortingRepository介面,不是繼承CrudRepository interface.。
打開今日頭條,查看更多圖片※std::vector::push_back和std::vector::emplace_back的區別
TAG:程序員小新人學習 |