ホームページ 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 は、基本的にすべての 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 中的 "<",比如 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 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

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

多くのアプリケーションシナリオでソートを実装するために名前を数値に変換するソリューションでは、ユーザーはグループ、特に1つでソートする必要がある場合があります...

Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Apr 19, 2025 pm 11:45 PM

intellijideaultimatiateバージョンを使用してスプリングを開始します...

Javaオブジェクトを配列に安全に変換する方法は? Javaオブジェクトを配列に安全に変換する方法は? Apr 19, 2025 pm 11:33 PM

Javaオブジェクトと配列の変換:リスクの詳細な議論と鋳造タイプ変換の正しい方法多くのJava初心者は、オブジェクトのアレイへの変換に遭遇します...

データベースクエリにTKMYBATISを使用するときに、エンティティクラスの変数名の構築クエリ条件をエレガントに取得する方法は? データベースクエリにTKMYBATISを使用するときに、エンティティクラスの変数名の構築クエリ条件をエレガントに取得する方法は? Apr 19, 2025 pm 09:51 PM

データベースクエリにTKMYBATISを使用する場合、クエリ条件を構築するためにエンティティクラスの変数名を優雅に取得する方法は一般的な問題です。この記事はピン留めします...

eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? Apr 19, 2025 pm 11:27 PM

eコマースプラットフォーム上のSKUおよびSPUテーブルの設計の詳細な説明この記事では、eコマースプラットフォームでのSKUとSPUのデータベース設計の問題、特にユーザー定義の販売を扱う方法について説明します。

See all articles