<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
抽象出Spring Data repository是因為在開發過程中,常常會為了實現不同持久化儲存的資料存取層而寫大量的大同小異的程式碼。
Spring Data repository的目的就是要大幅減少這些重複的程式碼。 Spring Data Elasticsearch為檔案的儲存,查詢,排序和統計提供了一個高度抽象的模板。
Spring Data repository抽象中最核心的介面就是Repository。該介面使用了泛型,需要提供兩個型別引數,
這個介面常被看做是一個標記型介面,用來獲取要操作的域物件型別和幫助開發者識別繼承這個類的介面。在Repository的基礎上,CrudRepository介面提供了針對實體類的複雜的CRUD(增刪改查)操作。
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> { <S extends T> S save(S entity); T findOne(ID primaryKey); Iterable<T> findAll(); Long count(); void delete(T entity); boolean exists(ID primaryKey); // … more functionality omitted. }
PagingAndSortingRepository介面在CrudRepository的基礎上增加了一些方法,使開發者可以方便的對實體類進行分頁和排序。
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort sort); Page<T> findAll(Pageable pageable); }
在分頁長度為20的基礎上,想要獲取第二頁的User資料,程式碼如下
PagingAndSortingRepository<User, Long> repository = // … get access to a bean Page<User> users = repository.findAll(new PageRequest(1, 20));
標準的CRUD(增刪改查)功能都要使用查詢語句來查詢資料庫。但通過使用Spring Data,只要五個步驟就可以實現。
@Entity @Document public class Person { … }
interface PersonRepository extends Repository<Person, Long> { … }
interface PersonRepository extends Repository<Person, Long> { List<Person> findByLastname(String lastname); }
使用JavaConfig的方式
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @EnableJpaRepositories class Config {}
使用xml設定的方式
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> <jpa:repositories base-package="com.acme.repositories"/> </beans>
注入repository範例,並使用
public class SomeClient { @Autowired private PersonRepository repository; public void doSomething() { List<Person> persons = repository.findByLastname("Matthews"); } }
Spring Data repository自帶了一個非常有用的查詢構造器。它會從方法名中去掉類似find..By,read...By,query...By,count...By之類的字首,然後解析剩餘的名字。我們也可以在方法名中加入更多的表示式,比如查詢時需要distinct約束,那麼在方法名中加入Distinct即可。方法名中的第一個By是一個分解符,代表著查詢語句的開始,我們可以用And或Or來將多個查詢條件關聯起來。
public interface PersonRepository extends Repository<User, Long> { List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname); // Enables the distinct flag for the query List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname); List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname); // Enabling ignoring case for an individual property List<Person> findByLastnameIgnoreCase(String lastname); // Enabling ignoring case for all suitable properties List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname); // Enabling static ORDER BY for a query List<Person> findByLastnameOrderByFirstnameAsc(String lastname); List<Person> findByLastnameOrderByFirstnameDesc(String lastname); }
除此之外,我們還可以為方法新增某些特定型別的引數(如:Pageable和Sort)來動態的在查詢中新增分頁和排序。
Page<User> findByLastname(String lastname, Pageable pageable); Slice<User> findByLastname(String lastname, Pageable pageable); List<User> findByLastname(String lastname, Sort sort); List<User> findByLastname(String lastname, Pageable pageable);
如果方法通過 @Query 指定了查詢語句,則使用該語句建立Query;如果沒有,則查詢是否定義了符合條件的Named Query,如果找到,則使用該命名查詢;如果兩者都沒有找到,則丟擲異常。使用@Query宣告查詢語句的例子如下:
//使用Query註解 @Query("select a from AccountInfo a where a.accountId = ?1") public AccountInfo findByAccountId(Long accountId);
結合了CREATE和USE_DECLARED_QUERY 兩種策略,會先嚐試查詢宣告好的查詢,如果沒有找到,就按照解析方法名的方式構建查詢。這是預設的查詢策略,如果不更改設定,會一直使用這種策略構建查詢。這種策略支援通過方法名快速定義一個查詢,也允許引入宣告好的查詢。
DomainClassConverter 允許開發者在SpringMVC控制層的方法中直接使用域物件型別(Domain types),而無需通過repository手動查詢這個範例。
@Controller @RequestMapping("/users") public class UserController { @RequestMapping("/{id}") public String showUserForm(@PathVariable("id") User user, Model model) { model.addAttribute("user", user); return "userForm"; } }
上面的方法直接接收了一個User物件,開發者不需要做任何的搜尋操作,轉換器會自動將路徑變數id轉為User物件的id,並且呼叫了findOne()方法查詢出User實體。 注意:當前的Repository 必須實現CrudRepository
HandlerMethodArgumentResolver使開發者可以在controller的方法中使用Pageable和Sort作為引數。
@Controller @RequestMapping("/users") public class UserController { @Autowired UserRepository repository; @RequestMapping public String showUsers(Model model, Pageable pageable) { model.addAttribute("users", repository.findAll(pageable)); return "users"; } }
通過上面的方法定義,Spring MVC會使用下面的預設設定嘗試從請求引數中得到一個Pageable的範例。
引數名 | 作用 |
---|---|
page | 想要獲取的頁數,預設為0 |
size | 獲取頁的大小,預設為20 |
page | 需要排序的屬性,格式為property,property(,ASC/DESC),預設升序排序。支援多個欄位排序,比如?sort=firstname&sort=lastname,asc |
開發者也可以針對多個表定義多個Pageable或Sort範例,需要使用Spring的@Qualifier註解來區分它們。並且請求引數名要帶有${qualifier}_的字首。例子如下:
public String showUsers(Model model, @Qualifier("foo") Pageable first, @Qualifier("bar") Pageable second) { … }
請求中需要帶有foo_page和bar_page等引數。
到此這篇關於使用Spring Data repository進行資料層的存取的文章就介紹到這了,更多相關Spring Data repository資料層存取內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45