首頁 Java java教程 spring data jpa的應用場景介紹(詳細)

spring data jpa的應用場景介紹(詳細)

Sep 14, 2018 pm 04:24 PM
spring data jpa

這篇文章帶給大家的內容是關於spring data jpa的應用場景介紹(詳細) ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

先說簡單JPA

概念:JPA(Java Persistence API)是Sun官方提出的Java持久化規格。它為Java開發人員提供了一種物件/關聯映射工具來管理Java應用中的關係資料。

影響他的出現主要是為了簡化現有的持久化開發工作和整合ORM技術,結束現在Hibernate,TopLink ,JDO等ORM框架各自為營的局面

進入正題

#Spring DATA JPA

  1、概念:它是基於ORM框架、JPA規範封裝的一套JPA應用框架可使開發者用極簡的程式碼即可實現對資料的存取和操作,它提供了包括增刪改查等在內的常用功能,且易於擴充!學習並使用Spring Data JPA可以大大提高開發效率。

  2、好處:spring data jpa讓我們解脫了DAO層的操作,基本上所有CRUD都可以依賴它來實現

  3、實作:

 maven引入:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
登入後複製

 gradle引入:

compile(&#39;org.springframework.boot:spring-boot-starter-data-jpa&#39;)
登入後複製

  實作:建立一個介面實作下面的任何一個介面都可以

  3.1:Repository

#  概述:僅僅是一個標識,表示任何繼承它的均為倉庫介面類,方便Spring自動掃描識別。這個接口是最基礎的接口,只是一個標誌性的接口,沒有定義任何的方法。

  它是最頂層的接口,是一個空接口,目的是為了統一所有的Repository的類型,且能讓組件掃描的時候自動識別。

  好處:例如,我們有一部分方法是不想對外提供的,例如我們只想提供增加和修改方法,不提供刪除方法,那麼下面介紹的幾個介面都是做不到的,這個時候,我們就可以繼承這個接口,然後將CrudRepository接口裡面對應的方法拷貝到Repository接口就可以了。

 3.2:CrudRepository

#   概述:Repository的子接口,提供CRUD相關的方法 

  #主要方法:

保存
    <S extends T> S save(S entity);
批量保存
    <S extends T> Iterable<S> save(Iterable<S> entities);
根据id查询一个对象
    T findOne(ID id)
判断对象是否存在
    boolean exists(ID id)
查询所有的对象
    Iterable<T> findAll()
根据id列表查询所有的对象
    Iterable<T> findAll(Iterable<ID> ids)
计算对象的总个数
    long count()
根据id删除
    void delete(ID id)
删除对象
    void delete(T entity);
批量删除
    void delete(Iterable<? extends T> entities);
删除所有
    void deleteAll()
登入後複製

 3.3:PagingAndSortingRepository

  概述:CrudRepository的子接口,新增一組分頁排序相關的方法

主要方法:

不带分页的排序
    Iterable<T> findAll(Sort sort)
带分页的排序
    Page<T> findAll(Pageable pageable)
登入後複製

 3.4:JpaRepository

  概述:PagingAndSortingRepository的子接口,增加一組JPA規範相關的方法 

 主要方法:

查询所有对象,不排序
    List<T> findAll()
查询所有对象,并排序
    List<T> findAll(Sort sort)
批量保存
    <S extends T> List<S> save(Iterable<S> entities);
强制缓存与数据库同步
    void flush()
保存并强制同步
    T saveAndFlush(T entity)
批量删除
    void deleteInBatch(Iterable<T> entities)
删除所有
    void deleteAllInBatch();
登入後複製

    3.5:JpaSpecificationExecutor

        這個比較特殊,不屬於Repository體系,它實作一組JPA Criteria查詢相關的方法,主要是用來做複雜的查詢的介面(輔助介面)。

      注意事項:這個介面很特殊,不屬於Repository體系,而Spring data JPA不會自動掃描識別,所以會報找不到對應的Bean,我們只需要繼承任意一個繼承了Repository的子介面或直接繼承Repository接口,Spring data JPA就會自動掃描識別,進行統一的管理

  4、自訂方法:

  前提:實作上面的任何一個介面

  4.1:使用@Query 建立查詢

   

4.1. 1:用法

   @Query 註解的使用非常簡單,只需在宣告的方法上面標註該註解,同時提供一個JP QL 查詢語句即可

 例如:

@Query("select u from User u where u.name = :name")
User findUserByName(@Param("name") String name);
登入後複製
登入後複製
登入後複製
登入後複製

 

4.1.2:參數

 

4.1.2.1:命名參數

描述:建議使用這種方法,可以不用管路參數的位置

@Query("select u from User u where u.name = :name")
User findUserByName(@Param("name") String name);
登入後複製
登入後複製
登入後複製
登入後複製

 4.1.2.2:索引參數## 描述:使用?佔位符

@Query("select u from User u where u.email = ?1")// 1表示第一个参数User findUserByEmail(String email);
登入後複製

 4.1.2.3: SPEL表達式(這裡只是簡單的寫了一下,有興趣可以去文檔看一下)

   描述:從Spring Data JPA版本1.4開始,我們支援透過手動定義的查詢來使用受限的SpEL模板表達式@Query 

@Query("select u from User u where u.name = :name")
User findUserByName(@Param("name") String name);
登入後複製
登入後複製
登入後複製
登入後複製

  基於SpEL的查詢模板中支援的變數

变量
    entityName
用法
    select x from #{#entityName} x
描述
    插入entityName与给定存储库关联的域类型。该entityName解决如下:如果域类型已设置的name属性@Entity注解那么它将被使用。否则,将使用域类型的简单类名称。
注意
    该entityName可以通过自定义@Entity的注释。orm.xmlSpEL表达式不支持自定义。
    引用#entityName将会把用户类的潜在的未来重映射转换成一个不同的实体名称(例如通过使用@Entity(name = "MyUser")
登入後複製

 4.1.3:分類

 

4.1.3.1:QUERY

 

例如:

@Query("select u from User u where u.name = :name")
User findUserByName(@Param("name") String name);
登入後複製
登入後複製
登入後複製
登入後複製

 

注意:

  1、使用@Query來指定本機查詢,只要設定nativeQuery為true,例如:

@Query(value="select * from tbl_user where name like %?1" ,nativeQuery=true)public List<UserModel> findByUuidOrAge(String name);
登入後複製

  2、目前版本的本地查詢不支援翻頁和動態的排序

 

分類(在Query中也分很多中查詢)

  1、使用@Query在查询方法中声明查询

 @Query("select u from User u where u.emailAddress = ?1")
  User findByEmailAddress(String emailAddress);
登入後複製

  2、使用高级LIKE表达式

@Query("select u from User u where u.firstname like %?1")
  List<User> findByFirstnameEndsWith(String firstname);
登入後複製

  3、使用@Query在查询方法中声明本地计数查询以进行分页

 @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
    countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
    nativeQuery = true)
  Page<User> findByLastname(String lastname, Pageable pageable);
登入後複製

4.1.3.1:修改查询

  比如:

@Modifying
@Query(value="update UserModel o set o.name=:newName where o.name like %:nn")public int findByUuidOrAge(@Param("nn") String name,@Param("newName") String newName)
登入後複製

  注意:可以通过使用 @Query 来执行一个更新操作,为此,我们需要在使用 @Query 的同时,* 用 @Modifying 来将该操作标识为修改查询,这样框架最终会生成一个更新的操作,而非查询操作。

  4.2:@NamedQueries创建查询

  概念:命名查询是 JPA 提供的一种将查询语句从方法体中独立出来,以供多个方法共用的功能

  用法:用户只需要按照 JPA 规范在 orm.xml 文件或者在代码中使用 @NamedQuery(或 @NamedNativeQuery)定义好查询语句,唯一要做的就是为该语句命名时,需要满足”DomainClass.methodName()”的 命名规则

  比如:

编写接口:
public interface FindUserByNamedQueryRepository extends JpaRepository<User, Integer> {
User findUserWithName(@Param("name") String name);
}
编写类:
@Entity
@NamedQueries(value={
@NamedQuery(name="User.findUserWithName",query="select u from User u where u.name = :name")
})
以下是实体类
......
登入後複製

  注意:

  1、@NamedQuery中的name属性的值要和接口中的方法名称一样。

  2、此处如果是多个方法,那么需要使用@NamedQueries,如果只有一个方法,则可以使用@NamedQuery,写法如下:

@NamedQuery(name="User.findUserWithName",query="select u from User u where u.name = :name")
登入後複製

  4.3:通过解析方法名创建查询

  概念:顾名思义,就是根据方法的名字,就能创建查询

  定义规则:

   说明:按照Spring data 定义的规则,查询方法以find|read|get开头涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性首字母需大写(参数名大写,条件名首字母大写,并且接口名中参数出现的顺序必须和参数列表中的参数顺序一致)

   例如:

//参数名大写,条件名首字母大写,并且接口名中参数出现的顺序必须和参数列表中的参数顺序一致
User findByNameAndEmail(String name, String email);  //相当于发送了一条SQL:select u from User u where u.name = :name and u.email = :email
  
List<User> findByNameOrPassword(String name, String password);  //相当于发送了一条SQL:select u from User u where u.name = ?1 or u.password = ?2

List<User> findByNameOrPassword(String name, String password);  //相当于发送了一条SQL:select u from User u where u.name = ?1 or u.password = ?2

List<User> findByIdBetween(Integer start, Integer end);  //相当于发送了一条SQL:select u from User u where u.id between ?1 and ?2

List<User> findByIdLessThan(Integer end);  //相当于发送了一条SQL:select u from User u where u.id < ?1
...
登入後複製

解析:框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。并且如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询。在创建查询时,我们通过在方法名中使用属性名称来表达,比如 findByIdIn()。框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析

一些条件查询的关键字:

框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。
并且如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询。在创建查询时,我们通过在方法名中使用属性名称来表达
,比如 findByIdIn()。框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析

And --- 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd)

Or --- 等价于 SQL 中的 or 关键字,比如 findByUsernameOrAddress(String user, String addr)

Between --- 等价于 SQL 中的 between 关键字,比如 findBySalaryBetween(int max, int min)

LessThan --- 等价于 SQL 中的 "<",比如 findBySalaryLessThan(int max)

GreaterThan --- 等价于 SQL 中的">",比如 findBySalaryGreaterThan(int min)

IsNull --- 等价于 SQL 中的 "is null",比如 findByUsernameIsNull()

IsNotNull --- 等价于 SQL 中的 "is not null",比如 findByUsernameIsNotNull()

NotNull --- 与 IsNotNull 等价

Like --- 等价于 SQL 中的 "like",比如 findByUsernameLike(String user)

NotLike --- 等价于 SQL 中的 "not like",比如 findByUsernameNotLike(String user)

OrderBy ---等价于 SQL 中的 "order by",比如 findByUsernameOrderBySalaryAsc(String user)

Not --- 等价于 SQL 中的 "! =",比如 findByUsernameNot(String user)

In --- 等价于 SQL 中的 "in",比如 findByUsernameIn(Collection userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数

NotIn --- 等价于 SQL 中的 "not in",比如 findByUsernameNotIn(Collection userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数

以上是spring data jpa的應用場景介紹(詳細)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? 使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? Apr 19, 2025 pm 09:51 PM

在使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名以構建查詢條件,是一個常見的難題。本文將針...

See all articles