ホームページ  >  記事  >  Java  >  Spring Data jpaの活用シナリオのご紹介(詳細)

Spring Data jpaの活用シナリオのご紹介(詳細)

不言
不言オリジナル
2018-09-14 16:24:583590ブラウズ

この記事では 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 は、基本的にすべての CRUD を DAO レイヤーの操作から解放します##。

# 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: リポジトリ

概要:

Itこれは、それを継承するものがウェアハウス インターフェイス クラスであることを示す単なる識別子であり、Spring が自動的にスキャンして識別するのに便利です。このインターフェイスは最も基本的なインターフェイスであり、単なる象徴的なインターフェイスであり、メソッドは定義されていません。 これはトップレベルのインターフェイスであり、空のインターフェイスです。目的は、すべてのリポジトリ タイプを統合し、スキャン時にコンポーネントを自動的に認識できるようにすることです。

利点:

たとえば、追加メソッドと変更メソッドだけを提供したいが、削除メソッドは提供したくないなど、外部には提供したくないメソッドがいくつかあります。これが不可能な場合は、この時点でこのインターフェイスを継承し、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 仕様関連メソッドのセットを追加します

Main メソッド:

查询所有对象,不排序
    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: JpaSpecificExecutor

概要:

これは特別であり、リポジトリ システムに属しません。これは、主に複雑なクエリを作成するために使用されるインターフェイス (補助インターフェイス) である、JPA 基準クエリ関連のメソッドのセットを実装します。

このインターフェースは非常に特殊であり、Spring データ JPA は自動的にスキャンして識別しないため、対応する Bean が見つからないことを報告します。 Repositoryを継承するAサブインターフェース、またはRepositoryインターフェースを直接継承するだけでSpringデータ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("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 Query in にも多数のカテゴリがあります)

  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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。