SpringBootでのJPA統合PostgreSql(詳細)

23818 ワード

SpringBootでのJPA統合PostgreSql(詳細)
JPA(Java Persistence API)とは
Spring Data JPA, part of the larger Spring Data family, makes it easy to easily implement JPA based repositories. This module deals with enhanced support for JPA based data access layers. It makes it easier to build Spring-powered applications that use data access technologies.
Implementing a data access layer of an application has been cumbersome for quite a while. Too much boilerplate code has to be written to execute simple queries as well as perform pagination, and auditing. Spring Data JPA aims to significantly improve the implementation of data access layers by reducing the effort to the amount that’s actually needed. As a developer you write your repository interfaces, including custom finder methods, and Spring will provide the implementation automatically.
Features
  • Sophisticated support to build repositories based on Spring and JPA
  • Support for Querydsl predicates and thus type-safe JPA queries
  • Transparent auditing of domain class
  • Pagination support, dynamic query execution, ability to integrate custom data access code
  • Validation of @Query annotated queries at bootstrap time
  • Support for XML based entity mapping
  • JavaConfig based repository configuration by introducing @EnableJpaRepositories .

  • 国内説
    JPAとは、Java Persistence API、すなわちJavaの永続化仕様を指し、当初はJSR-220の一部として扱われていた.JPAの提案は、主にJava EEとJava SEの応用開発を簡略化し、当時のいくつかの異なるORM技術を統一するためである.一般的に、仕様は動作のルール、すなわちインタフェースを定義しているだけで、私たちがよく知っているHibernateはJPAの実装(Provider)です.
    JPAは何を定義していますか.大体次のようなものがあります.
  • ORMマッピングメタデータは、オブジェクトをテーブル、フィールドに関連付けるための
  • である.
  • はAPIを操作し、すなわち、追加削除調査を完了する一連のインタフェース
  • である.
  • JPQLクエリー言語は、移植可能なオブジェクト向けクエリー式
  • を実現する.
    PostgreSQLの概要
    PostGreSQLは強力なオープンソースオブジェクト関係データベース管理システム(ORDBMS)であり、世界で最も先進的なオープンソース関係型データベースと称され、15年以上にわたる積極的な開発と絶えず改善を経て、PostGreSQLは信頼性、安定性、データ整合性などで大きな向上を遂げた.現在最も流行しているMySQLと比較して、PostGreSQLはより柔軟で、より高度な互換性のある標準的な特性を持っています.また、PostGreSQLはMITオープンソースプロトコルに基づいており、その開放性が極めて高く、これも各クラウドコンピューティングの大きなTの主なRDSデータベースとなっている根本的な原因である.
    JPAでのPostgreSQLの使用
    一、依存パッケージの追加
    Spring Boot MavnプロジェクトPom.xmlファイルに依存パッケージを追加
    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-data-jpaartifactId>
    dependency>
    <dependency>
        <groupId>org.postgresqlgroupId>
        <artifactId>postgresqlartifactId>
        
    dependency>
    

    二、PostgreSQLとjpaの配置
    アプリケーションでpropertiesファイルには、次のように追加されます.
    #         
    spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/yourdatabase
    spring.datasource.username=yourusername
    spring.datasource.password=yourpassword
    spring.jpa.show-sql=true
    #JPA    
    spring.jpa.database=postgresql
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect
    spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false
    

    注意:
  • yourdatabase,yourusername,yourpasswordなどの情報が正しく構成されているかどうか.
  • spring.jpa.hibernate.ddl-autoはupdateとして指定され、フレームワークがテーブル構造
  • を自動的に作成または更新します.
    三、Entityの定義
    package com.book.entity;
    
    import lombok.Data;
    
    import javax.persistence.*;
    
    @Data
    @Entity
    @Table(name = "bookshelf")
    public class BookshelfItem {
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Long id;
    
        @Column(name = "bookName",nullable = false)
        private String bookName;
        @Column(name = "describe")
        private String describe;
        @Column(name = "detail")
        private String detail;
    
        public  String  ToString()
        {
            return bookName + "-" + describe;
        }
    
    }
    

    注意:
  • データベースに独自に作成したネストschemaがある場合は、Tableプロパティに@Table(name=「bookshelf」、schema=「yourschema」)
  • を明記します.
  • bookNameという書き方は、データベースにこのデータ要素がない場合、book_として作成されます.name

  • 四、repositoryの定義
    package com.book.repository;
    
    import com.book.entity.BookshelfItem;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.Query;
    import org.springframework.data.repository.query.Param;
    import org.springframework.stereotype.Repository;
    
    import java.util.List;
    
    @Repository
    public interface BookshelfRepository extends JpaRepository<BookshelfItem,Integer> {
        @Query(value = "select * from bookshelf",nativeQuery = true)
        List<BookshelfItem> GetAllBookData();
        @Query(value = "select * from bookshelf where book_name = :bookName",nativeQuery = true)
        List<BookshelfItem> GetBooksByName(@Param("bookName") String bookName);
    }
    
    

    注意:
  • **@Queryに*号**がある場合は、末尾にnativeQuery=true
  • を付ける
    五、サービスの定義
    package com.book.service;
    
    import com.book.entity.BookshelfItem;
    import com.book.repository.BookshelfRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    @Service
    public class BookshelfService {
        @Autowired
        private BookshelfRepository bookshelfRepository;
        public List<BookshelfItem> GetAll()
        {
            return  bookshelfRepository.GetAllBookData();
        }
        public List<BookshelfItem> GetNyBookname(String bookName)
        {
            return  bookshelfRepository.GetBooksByName(bookName);
        }
    
    }
    
    

    ユニットテスト
    package com.book;
    
    import com.book.entity.BookshelfItem;
    import com.book.service.BookshelfService;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.List;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class BookApplicationTests {
        @Autowired
        BookshelfService bookshelfService;
        @Test
        public void contextLoads() {
    
            System.out.println("Get book All");
            List<BookshelfItem> temp = bookshelfService.GetAll();
            for (int i = 0; i < temp.size(); i++) {
                BookshelfItem item = temp.get(i);
                System.out.println(item.toString());
            }
            System.out.println("Get book by Name");
            temp = bookshelfService.GetNyBookname("boo1");
            for (int i = 0; i < temp.size(); i++) {
                BookshelfItem item = temp.get(i);
                System.out.println(item.toString());
            }
        }
    
    }
    

    本人のテスト結果は以下の通りです(データは自分がデータベースに追加した2つのデータです):
    2019-10-08 17:01:07.646  INFO 4276 --- [           main] com.book.BookApplicationTests            : Started BookApplicationTests in 4.878 seconds (JVM running for 5.5)
    Get book All
    Hibernate: select * from bookshelf
    BookshelfItem(id=1, bookName=boo1, describe=sdfsad, detail=sdfgdg)
    BookshelfItem(id=2, bookName=boo2, describe=jkjkjk, detail=aaaaaa)
    Get book by Name
    Hibernate: select * from bookshelf where book_name = ?
    BookshelfItem(id=1, bookName=boo1, describe=sdfsad, detail=sdfgdg)
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 5.406 s - in com.book.BookApplicationTests