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


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

Spring DBアクセス技術(1)

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


    1-1)h 2データベースツールピストル(1.4.200版)


    H 2は、Web画面を提供する開発またはテストのための簡単で使いやすいデータベースです.
  • パーミッションサイクル:chmod 755 h2.sh(ウィンドウユーザーはx)
  • 実行:./h2.sh(ウィンドウユーザーはh2.bat)
  • データベース・ファイルの作成方法
    -jdbc:h2:~/test(初回)
    -~/test.mv.db検証ファイルの作成
    -この接続からjdbc:h2:tcp://localhost/~/test
  • 1-2)テーブルの作成


    H 2データベースへのアクセスmemberテーブルの作成
    プロジェクトルートディレクトリにsql/ddl.sqlファイルを作成してテーブルを管理
    drop table if exists member CASCADE;
    create table member
    (
     id bigint generated by default as identity,
     name varchar(255),
     primary key (id)
    );

    H 2データベース作成が正常でない場合


    次のエラーメッセージが表示され、H 2データベースが正常に作成されない可能性があります。


    解決策は以下の通りです。

  • H 2データベースを終了し、再起動します.
  • Webブラウザが自動的に実行される場合、アドレスウィンドウは以下のようになります.(100.1.2.3ではなく任意の数字が表示されます)
  • 前のセクションのみを100.1.2.3->localhostに変更し、Enterを入力します.残りの部分は絶対に変更できません.(特に後のセッション部分は変更できません.)
  • データベースファイルを作成すると(jdbc:h2:~/test)、データベースは正常に作成されます.
  • 2.純JDBCでデータベースを接続する


    2-1)優先パラメータ


    build.jdbc、h 2データベース関連ライブラリをgradeファイルに追加

    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    runtimeOnly 'com.h2database:h2'

    スプリングの追加データベース接続設定の開始

    resources/application.properties
    spring.datasource.url=jdbc:h2:tcp://localhost/~/test
    spring.datasource.driver-class-name=org.h2.Driver
    spring.datasource.username=sa
    注意!スプリング起動2.4から、spring.datasource.username=saを追加する必要があります.Wrong usernameまたはpasswordエラーが発生します.最後にスペースがある場合は、同じエラーが発生することに注意してください.spring.datasource.username=sa スペースに注意してください.スペースはすべて削除します.

    2-2)Jdbcリポジトリ実装



    以前の記憶実現体と何が違いますか?MemoryMemberRepository:MemberRepositoryメモリにインタフェースを実装JdbcMemberRepository:DBを接続しJdbcで実現

    ex.メンバーを保存するsave()メソッド

    public class JdbcMemberRepository implements MemberRepository {
    
       private final DataSource dataSource;
     
       // 생성자가 하나이면 @Autowired 생략 가능
       public JdbcMemberRepository(DataSource dataSource) {
         this.dataSource = dataSource;
       }
     
       @Override
       public Member save(Member member) {
       
         String sql = "insert into member(name) values(?)";
         Connection conn = null;
         PreparedStatement pstmt = null;
         ResultSet rs = null;
         
         try {
         
           conn = getConnection();
           pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
           pstmt.setString(1, member.getName());
           pstmt.executeUpdate();
           rs = pstmt.getGeneratedKeys();
           
           if (rs.next()) {
             member.setId(rs.getLong(1));
           } else {
             throw new SQLException("id 조회 실패");
           }
           
           return member;
           
         } catch (Exception e) {
           throw new IllegalStateException(e);
         } finally {
           close(conn, pstmt, rs);
         }
       }
       ...
    }

    スプリング設定の変更

         @Bean
         public MemberRepository memberRepository() {
    //      return new MemoryMemberRepository();
            return new JdbcMemberRepository(dataSource);
         }
  • DataSourceは、データベース接続を取得するオブジェクトです.Spring Bootは、データベース接続情報に基づいてデータソースを作成し、Spring VINに設定します.従ってDIを取得することができる.
  • オープンクローズ原則(OCP,Open-Closed Principle):拡張、修正、または変更にオープンします.
  • SpringのDependencies Injectionでは、既存のコードを変更せずに設定変更のみでクラスを実装できます.
  • 会員登録し、DBに正しい結果が入力されているかどうかを確認します.
  • データはデータベースに格納されているので、スプリングサーバを再実行してデータを安全に格納することができる.
  • 3.スプリング集積テスト


    SpringコンテナとDBに接続する統合テストを行います.

    会員サービススプリング統合テスト

    @SpringBootTest
    @Transactional
    class MemberServiceIntegrationTest {
    
       @Autowired MemberService memberService;
       @Autowired MemberRepository memberRepository;
     
       @Test
       public void 회원가입() throws Exception {...}
     
       @Test
       public void 중복_회원_예외() throws Exception {...}
     
    }
  • @SpringBootTest:スプリング容器とともに試験を実行
  • @Transactional:テストケースにこのプレゼンテーションがある場合は、テストの開始前にトランザクションを開始し、テストが完了した後もロールバックします.データベースにデータが保持されないため、次のテストには影響しません.
  • @Rollback:テストが完了した後にデータベースにデータがあるかどうかを確認するには、実行するテストクラスまたはメソッドに@Rollback(org.springframe.test.annotation.rollback)コメントを追加し、valueでfalse値を入力します.( @Rollback(false) )
  • 4.Spring JdbcTemplateを使用してデータベースに接続する


    4-1)純Jdbcと同じ環境を設定する。


    Spring JdbcTemplateやMyBasisのようなライブラリは、JDBC APIから見た重複コードの大部分を削除できます.しかし、SQLは自分で書く必要があります.

    4-2)JdbcTemplateリポジトリ実装


    ex.メンバーを保存するsave()メソッド

    public class JdbcTemplateMemberRepository implements MemberRepository {
    
       private final JdbcTemplate jdbcTemplate;
     
       public JdbcTemplateMemberRepository(DataSource dataSource) {
         jdbcTemplate = new JdbcTemplate(dataSource);
       }
     
       @Override
       public Member save(Member member) {
       
         SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
         jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");
         Map<String, Object> parameters = new HashMap<>();
         parameters.put("name", member.getName());
         
         Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
         member.setId(key.longValue());
         
         return member;
         
       }
    }

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

         @Bean
         public MemberRepository memberRepository() {
    //      return new MemoryMemberRepository();
    //      return new JdbcMemberRepository(dataSource);
            return new JdbcTemplateMemberRepository(dataSource);
         }