Spring]Spring入門-Spring DBアクセス技術(2)


Spring入門-コード学習を用いたSpring Boot、Web MVC、DBアクセス技術by金英漢

Spring DBアクセス技術(2)

  • H 2データベースインストール
  • 純Jdbc
  • ばね集積試験
  • SpringJdbcTemplate
  • JPA
  • SpringデータJPA
  • 5. JPA

  • JPAは、既存の重複コードを実行するだけでなく、JPA自身で基本的なSQLを作成して実行することもできます.
  • JPAを使用すると、SQLとデータ中心の設計からオブジェクト中心の設計に移行できます.
  • JPAは開発効率を大幅に向上させることができる.
  • build.JPAライブラリをgradeファイルに追加

    dependencies {
    //  implementation 'org.springframework.boot:spring-boot-starter-jdbc'
        implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    }
    Spring-boot-start-data-jpa内部にはjdbc関連ライブラリが含まれています.したがって、jdbcを削除できます.

    JPA設定をスプリングガイドに追加

    resources/application.properties
    ...
    spring.jpa.show-sql=true
    spring.jpa.hibernate.ddl-auto=none
  • show-sql:JPA生成SQLを出力します.
  • ddl-auto:JPAはテーブルを自動的に作成する機能を提供し、Noneはこの機能をオフにします.H 2 DBをインストールして直接テーブルを作成したのでnoneに設定します.
  • createエンティティ情報に基づいて直接テーブルを作成
  • JPAエンティティのマッピング

    @Entity
    public class Member {
    
       @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
       private Long id;
       ...
    }
  • @GeneratedValue(strategy = GenerationType.IDENTITY):プリファレンス
  • JPA会員庫

    package hello.hellospring.repository;
    
    import hello.hellospring.domain.Member;
    
    import javax.persistence.EntityManager;
    import java.util.List;
    import java.util.Optional;
    
    public class JpaMemberRepository implements MemberRepository {
    
       private final EntityManager em;
     
       public JpaMemberRepository(EntityManager em) {
         this.em = em;
       }
     
       public Member save(Member member) {
         em.persist(member);
         return member;
       }
     
       public Optional<Member> findById(Long id) {
         Member member = em.find(Member.class, id);
         return Optional.ofNullable(member);
       }
     
       public List<Member> findAll() {
         return em.createQuery("select m from Member m", Member.class)
               .getResultList();
     }
     
       public Optional<Member> findByName(String name) {
         List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class)
               .setParameter("name", name)
               .getResultList();
         return result.stream().findAny();
       }
     
    }

    サービス・レベルへのトランザクションの追加

    import org.springframework.transaction.annotation.Transactional
    
    @Transactional
    public class MemberService {...}
  • org.springframework.transaction.annotation.Transactional
  • springは、クラスメソッドの実行時にトランザクションを開始し、メソッドが正常に終了したときにトランザクションをコミットします.実行時に異常が発生した場合は、ロールバックします.
  • 注意!JPAによるすべてのデータ変更は、トランザクションで実行する必要があります.

    スプリング設定を変更してJPAを使用

    @Configuration
    public class SpringConfig {
    
       private final DataSource dataSource;
       private final EntityManager em;
     
       public SpringConfig(DataSource dataSource, EntityManager em) {
         this.dataSource = dataSource;
         this.em = em;
       }
     
       @Bean
       public MemberRepository memberRepository() {
    //   return new MemoryMemberRepository();
    //   return new JdbcMemberRepository(dataSource);
    //   return new JdbcTemplateMemberRepository(dataSource);
         return new JpaMemberRepository(em);
       }
    }

    6.SpringデータJPA

  • SpringデータJPAを使用すると、リポジトリに実装クラスを設定することなく、インタフェースだけで開発が完了します.
  • 繰り返し開発された基本CRUD機能もSpring Data JPAから提供されている.
  • SpringデータJPAの提供

  • ベーシックCRUD
  • findByName(),findByEmail()メソッド名のみを使用したクエリー機能を提供
  • 自動ページング
    注意:実際の操作では、基本的にJPAとSpringデータJPAが使用されますが、複雑なダイナミッククエリではQuerydslというライブラリが使用されます.Querydslを使用するとjavaコードを安全に使用してクエリーを記述したり、動的クエリーを容易に記述したりすることができます.JPAが提供するネイティブクエリーまたは以前に学習したSpring JdbcTemplateを使用すると、この組み合わせでは解決しにくいクエリーを解決できます.
  • スプリングデータJPA設定は、上記のJPA設定を使用します.

    Spring Data JPAメンバーライブラリ

    package hello.hellospring.repository;
    
    import hello.hellospring.domain.Member;
    import org.springframework.data.jpa.repository.JpaRepository;
    import java.util.Optional;
    
    public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
       Optional<Member> findByName(String name);
    }

    スプリングデータJPAメンバーライブラリを使用するためのスプリング設定の変更

    package hello.hellospring;
    
    import hello.hellospring.repository.*;
    import hello.hellospring.service.MemberService;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class SpringConfig {
    
       private final MemberRepository memberRepository;
       
       public SpringConfig(MemberRepository memberRepository) {
         this.memberRepository = memberRepository;
       }
       
       @Bean
       public MemberService memberService() {
         return new MemberService(memberRepository);
       }
    }
  • SpringData JPAは、SpringDataJpaMemberRepositorySpring VINを自動的に登録します.
  • Spring Data JPA提供クラス