這篇文章帶給大家的內容是關於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('org.springframework.boot:spring-boot-starter-data-jpa')
實作:建立一個介面實作下面的任何一個介面都可以
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 中的 "0fe0deaecdfcb2dd07d644e7e62c96a4",比如 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(Collectionf7e83be87db5cd2d9a8a0b8117b38cd4 userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数
NotIn --- 等价于 SQL 中的 "not in",比如 findByUsernameNotIn(Collectionf7e83be87db5cd2d9a8a0b8117b38cd4 userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数
以上是spring data jpa的應用場景介紹(詳細)的詳細內容。更多資訊請關注PHP中文網其他相關文章!