>  기사  >  Java  >  Spring Data JPA 적용 시나리오 소개(자세히)

Spring Data JPA 적용 시나리오 소개(자세히)

不言
不言원래의
2018-09-14 16:24:583585검색

이 글은 Spring Data JPA의 적용 시나리오를 소개합니다(상세). 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

JPA에 대해 간단히 이야기해 보겠습니다

개념: JPA(Java Persistence API)는 Sun에서 공식적으로 제안합니다. Java 지속성 사양. 이는 Java 개발자에게 Java 애플리케이션의 관계형 데이터를 관리할 수 있는 객체/연관 매핑 도구를 제공합니다.

Influence: 그의 등장은 주로 기존 지속성 개발 작업과 통합 ORM 기술을 단순화하기 위한 것입니다. Hibernate, TopLink, JDO 등의 ORM 프레임워크가 독립적으로 운영되고 있는 상황 JPA

1. 개념:

개발자가 최소한의 코드를 사용할 수 있도록 하는 ORM 프레임워크 및 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 쿼리 관련 메서드 집합을 구현합니다.

🎜#이 인터페이스는 매우 특별하며 리포지토리 시스템에 속하지 않으며 Spring 데이터 JPA는 이를 자동으로 스캔하고 식별하지 않으므로 해당 Bean이 Repository를 상속하는 하위 인터페이스를 상속하거나 Repository 인터페이스를 직접 상속하기만 하면 Spring 데이터 JPA가 이를 자동으로 스캔하고 식별하여 통합 관리합니다.

4 . 사용자 정의 방법: #🎜 🎜#

전제 조건: 위 인터페이스 중 하나 구현

 

 #🎜 🎜#4.1: @ Query Create query

  4.1.1: Usage

 @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

 

예:

으으으으으#🎜 🎜# 참고: # 🎜🎜#

1. @Query를 사용하여 로컬 쿼리를 지정하고, NativeQuery를 true로 설정하면 됩니다. 예:

@Query("select u from User u where u.name = :name")
User findUserByName(@Param("name") String name);

2. 현재 버전의 로컬 쿼리는 페이지 넘김 및 동적 정렬을 지원하지 않습니다

 Category(쿼리에서도 여러 쿼리로 구분됨)

  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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.