最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解使用Spring?Data?repository進(jìn)行數(shù)據(jù)層的訪問問題

 更新時(shí)間:2022年06月13日 15:39:04   作者:你呀不牛  
這篇文章主要介紹了使用Spring?Data?repository進(jìn)行數(shù)據(jù)層的訪問,抽象出Spring Data repository是因?yàn)樵陂_發(fā)過程中,常常會(huì)為了實(shí)現(xiàn)不同持久化存儲的數(shù)據(jù)訪問層而寫大量的大同小異的代碼,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧

使用Spring Data repository進(jìn)行數(shù)據(jù)層的訪問

抽象出Spring Data repository是因?yàn)樵陂_發(fā)過程中,常常會(huì)為了實(shí)現(xiàn)不同持久化存儲的數(shù)據(jù)訪問層而寫大量的大同小異的代碼。

Spring Data repository的目的就是要大幅減少這些重復(fù)的代碼。 Spring Data Elasticsearch為文檔的存儲,查詢,排序和統(tǒng)計(jì)提供了一個(gè)高度抽象的模板。

核心概念

Spring Data repository抽象中最核心的接口就是Repository。該接口使用了泛型,需要提供兩個(gè)類型參數(shù),

  • 第一個(gè)是接口處理的域?qū)ο箢愋?/li>
  • 第二個(gè)是域?qū)ο蟮闹麈I類型。

這個(gè)接口常被看做是一個(gè)標(biāo)記型接口,用來獲取要操作的域?qū)ο箢愋秃蛶椭_發(fā)者識別繼承這個(gè)類的接口。在Repository的基礎(chǔ)上,CrudRepository接口提供了針對實(shí)體類的復(fù)雜的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的基礎(chǔ)上增加了一些方法,使開發(fā)者可以方便的對實(shí)體類進(jìn)行分頁和排序。

public interface PagingAndSortingRepository<T, ID extends Serializable>
  extends CrudRepository<T, ID> {
  Iterable<T> findAll(Sort sort);
  Page<T> findAll(Pageable pageable);
}

在分頁長度為20的基礎(chǔ)上,想要獲取第二頁的User數(shù)據(jù),代碼如下

PagingAndSortingRepository<User, Long> repository = // … get access to a bean
Page<User> users = repository.findAll(new PageRequest(1, 20));

查詢方法

標(biāo)準(zhǔn)的CRUD(增刪改查)功能都要使用查詢語句來查詢數(shù)據(jù)庫。但通過使用Spring Data,只要五個(gè)步驟就可以實(shí)現(xiàn)。

  • 創(chuàng)建一個(gè)Domain類
@Entity
@Document
public class Person {
  …
}
  • 聲明一個(gè)繼承Repository接口或其子接口的持久層接口。并標(biāo)明要處理的域?qū)ο箢愋图捌渲麈I的類型(在下面的例子中,要處理的域?qū)ο笫荘erson,其主鍵類型是Long)
interface PersonRepository extends Repository<Person, Long> { … }
  • 在接口中聲明查詢方法(spring會(huì)為其生成實(shí)現(xiàn)代碼)
interface PersonRepository extends Repository<Person, Long> {
  List<Person> findByLastname(String lastname);
}
  • 讓Spring創(chuàng)建對這些接口的代理實(shí)例。

使用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實(shí)例,并使用

public class SomeClient {
  @Autowired
  private PersonRepository repository;
  public void doSomething() {
    List<Person> persons = repository.findByLastname("Matthews");
  }
}

定義查詢方法

CREATE

Spring Data repository自帶了一個(gè)非常有用的查詢構(gòu)造器。它會(huì)從方法名中去掉類似find..By,read...By,query...By,count...By之類的前綴,然后解析剩余的名字。我們也可以在方法名中加入更多的表達(dá)式,比如查詢時(shí)需要distinct約束,那么在方法名中加入Distinct即可。方法名中的第一個(gè)By是一個(gè)分解符,代表著查詢語句的開始,我們可以用And或Or來將多個(gè)查詢條件關(guān)聯(lián)起來。

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);
}

除此之外,我們還可以為方法添加某些特定類型的參數(shù)(如:Pageable和Sort)來動(dòng)態(tài)的在查詢中添加分頁和排序。

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);

USE_DECLARED_QUERY

如果方法通過 @Query 指定了查詢語句,則使用該語句創(chuàng)建Query;如果沒有,則查找是否定義了符合條件的Named Query,如果找到,則使用該命名查詢;如果兩者都沒有找到,則拋出異常。使用@Query聲明查詢語句的例子如下:

//使用Query注解
@Query("select a from AccountInfo a where a.accountId = ?1")
public AccountInfo findByAccountId(Long accountId);

CREATE_IF_NOT_FOUND

結(jié)合了CREATE和USE_DECLARED_QUERY 兩種策略,會(huì)先嘗試查找聲明好的查詢,如果沒有找到,就按照解析方法名的方式構(gòu)建查詢。這是默認(rèn)的查詢策略,如果不更改配置,會(huì)一直使用這種策略構(gòu)建查詢。這種策略支持通過方法名快速定義一個(gè)查詢,也允許引入聲明好的查詢。

WEB支持

DomainClassConverter 允許開發(fā)者在SpringMVC控制層的方法中直接使用域?qū)ο箢愋?Domain types),而無需通過repository手動(dòng)查找這個(gè)實(shí)例。

@Controller
@RequestMapping("/users")
public class UserController {
  @RequestMapping("/{id}")
  public String showUserForm(@PathVariable("id") User user, Model model) {
    model.addAttribute("user", user);
    return "userForm";
  }
}

上面的方法直接接收了一個(gè)User對象,開發(fā)者不需要做任何的搜索操作,轉(zhuǎn)換器會(huì)自動(dòng)將路徑變量id轉(zhuǎn)為User對象的id,并且調(diào)用了findOne()方法查詢出User實(shí)體。 注意:當(dāng)前的Repository 必須實(shí)現(xiàn)CrudRepository

HandlerMethodArgumentResolver使開發(fā)者可以在controller的方法中使用Pageable和Sort作為參數(shù)。

@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會(huì)使用下面的默認(rèn)配置嘗試從請求參數(shù)中得到一個(gè)Pageable的實(shí)例。

參數(shù)名作用
page想要獲取的頁數(shù),默認(rèn)為0
size獲取頁的大小,默認(rèn)為20
page需要排序的屬性,格式為property,property(,ASC/DESC),默認(rèn)升序排序。支持多個(gè)字段排序,比如?sort=firstname&sort=lastname,asc

開發(fā)者也可以針對多個(gè)表定義多個(gè)Pageable或Sort實(shí)例,需要使用Spring的@Qualifier注解來區(qū)分它們。并且請求參數(shù)名要帶有${qualifier}_的前綴。例子如下:

public String showUsers(Model model,
      @Qualifier("foo") Pageable first,
      @Qualifier("bar") Pageable second) { … }

請求中需要帶有foo_page和bar_page等參數(shù)。

到此這篇關(guān)于使用Spring Data repository進(jìn)行數(shù)據(jù)層的訪問的文章就介紹到這了,更多相關(guān)Spring Data repository數(shù)據(jù)層訪問內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java序列化機(jī)制詳解

    Java序列化機(jī)制詳解

    Java 序列化機(jī)制是一種將對象轉(zhuǎn)換為字節(jié)流的過程,以便在網(wǎng)絡(luò)上傳輸或保存到文件中,并能在需要時(shí)將字節(jié)流還原為對象,這一機(jī)制通過實(shí)現(xiàn) java.io.Serializable 接口來實(shí)現(xiàn),同時(shí)涉及到一些關(guān)鍵概念和注意事項(xiàng),需要的朋友可以參考下
    2023-12-12
  • java數(shù)據(jù)類型與二進(jìn)制詳細(xì)介紹

    java數(shù)據(jù)類型與二進(jìn)制詳細(xì)介紹

    這篇文章主要介紹了java數(shù)據(jù)類型與二進(jìn)制詳細(xì)介紹的相關(guān)資料,這里對數(shù)據(jù)類型進(jìn)行了一一介紹分析,并說明自動(dòng)轉(zhuǎn)換和強(qiáng)制轉(zhuǎn)換,需要的朋友可以參考下
    2017-07-07
  • Mybatis中Mapper映射文件使用詳解

    Mybatis中Mapper映射文件使用詳解

    這篇文章主要介紹了Mybatis中Mapper映射文件使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • java必學(xué)必會(huì)之GUI編程

    java必學(xué)必會(huì)之GUI編程

    這篇文章主要為大家詳細(xì)介紹了java GUI編程,對于GUI編程小編也不是很了解,通過這篇文章和大家一起學(xué)習(xí)GUI編程,感興趣的小伙伴們可以參考一下
    2015-12-12
  • Java實(shí)現(xiàn)文字滾動(dòng)廣告字幕效果

    Java實(shí)現(xiàn)文字滾動(dòng)廣告字幕效果

    文字滾動(dòng)廣告字幕是一種常見的動(dòng)態(tài)文本展示效果,通常用于展示新聞、廣告或其他動(dòng)態(tài)信息,在本項(xiàng)目中,我們將使用Java的Swing庫來實(shí)現(xiàn)一個(gè)簡單的文字滾動(dòng)廣告字幕效果,通過定時(shí)更新文本的位置來模擬文字的滾動(dòng),需要的朋友可以參考下
    2025-02-02
  • java基于servlet使用組件smartUpload實(shí)現(xiàn)文件上傳

    java基于servlet使用組件smartUpload實(shí)現(xiàn)文件上傳

    這篇文章主要介紹了java基于servlet使用組件smartUpload實(shí)現(xiàn)文件上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • java多線程返回值使用示例(callable與futuretask)

    java多線程返回值使用示例(callable與futuretask)

    這篇文章主要介紹了多線程返回值使用示例(callable與futuretask),需要的朋友可以參考下
    2014-04-04
  • 詳解hbase與hive數(shù)據(jù)同步

    詳解hbase與hive數(shù)據(jù)同步

    這篇文章主要介紹了詳解hbase與hive數(shù)據(jù)同步的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • SpringBoo項(xiàng)目打war包的多種方式

    SpringBoo項(xiàng)目打war包的多種方式

    在idea中,經(jīng)常會(huì)對web項(xiàng)目進(jìn)行打jar包或者war包,jar包在Java環(huán)境中運(yùn)行,war包在Tomcat服務(wù)器中跑,對于打war包有多種方式,一下介紹3鐘方式,需要的朋友可以參考下
    2024-06-06
  • 詳解ElasticSearch6.4.0集群搭建

    詳解ElasticSearch6.4.0集群搭建

    這篇文章主要介紹了詳解ElasticSearch6.4.0集群搭建,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09

最新評論

上高县| 江北区| 富蕴县| 永登县| 景德镇市| 溆浦县| 田东县| 达日县| 东丽区| 南木林县| 射阳县| 秦皇岛市| 建宁县| 万载县| 汾阳市| 杨浦区| 如皋市| 祥云县| 宣汉县| 越西县| 巴彦淖尔市| 盐城市| 工布江达县| 万宁市| 龙胜| 灵武市| 桦川县| 东港市| 邓州市| 普兰店市| 长寿区| 特克斯县| 灵山县| 庆元县| 三亚市| 军事| 汾西县| 荥阳市| 姜堰市| 肇庆市| 贵定县|