[インフラ]整理金英漢のスプリング入門[3]

5575 ワード


DBテストの使用

  • @SpringBootTest:スプリングコンテナとともにテスト
  • を実行
  • @Transactional:テストケースの後に他の説明がある場合は、テスト開始前にトランザクションが開始され、テスト終了後は常にロールバックされます.
  • しかしながら、@Transactionalは、試験例においてのみCommitを使用してロールバックされず、通常の構成要素@Componentにおいてロールバックされずに正常に動作する.

    集積テスト、ユニットテスト

  • 統合テスト:
  • は、実際の導入環境と同じです.
  • ユニットテスト:純メモリ環境でテスト
  • 統合テストでは、データベースの接続とスプリングコンテナの実行に時間がかかります.
    ユニットテストは純粋なJavaコードとメモリで作成されたテストなので、速度が速い.
    だから、できるだけ単位テストを使いましょう.

    JdbcTemplate




    使い方を簡単に理解してみましょう.
    @Repository
    public class JdbcMovieFinder implements MovieFinder {
    
        private JdbcTemplate jdbcTmple;
    
        @Autowired
        public JdbcMovieFinder(DataSource dataSource) {
            this.jdbcTemplate = new JdbcTemplate(dataSource);
        }
    
    }
    JdbcTemplateオブジェクトへのDIのために、関連関係を見つけ、スプリングコンテナから注入します.
    int rowCount = 
    this.jdbcTmple.queryForObject
    ("select count(*) from t_actor", Integer.class);
    (sql문, 리턴할 인스턴스의 형태 혹은 자료형, 혹은 RowMapper , ?에 들어갈 값)
    以前JDBCドライバを使用したことがありますか?あなたは何の価値があるか知っています.
    int countOfActorsNamedJoe =
    this.jdbcTemplate.queryForObject
    ("select count(*) from t_actor 
    where first_name = ?", Integer.class, "Joe");
    pstmt.setString(1,Joe)と同じ意味です.
    オブジェクトの場合は、このようにインポートできます.
    public Optional<Member> findById(Long id) {
    	List<Member> result =
        jdbcTemplate.query
        ("select * from member where id = ?", memberRowMapper(), id);
    	return result.stream().findAny();
    }
    RowMapperはJENICインタフェースなので、インプリメンテーションを作成する必要があります.
    TのmapRowの返却を実現すればよい.
    private RowMapper<Member> memberRowMapper(){ //
        return new RowMapper<Member>() {
            @Override
            public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
                Member member = new Member();
                member.setId(rs.getLong("id"));
                member.setName(rs.getString("name"));
                return member;
            }
        };
    }
    これによりRowMapperが生成され,Ramdaで生成されるとより簡潔になる.
    private RowMapper<Member> memberRowMapper(){ //
        return (rs, rowNum) -> {
            Member member = new Member();
            member.setId(rs.getLong("id"));
            member.setName(rs.getString("name"));
            return member;
        };
    }
    ソース

    JPA


    今簡単に説明しますが、本当によく整理されたビデオがあるので、後で見ましょう.
    JPA基本編整理(tmdgh 0221の開発)

    JPAとは?

  • JPA(Java Persistence API)は、Java陣営のORM標準技術である.
  • JPA動作の画面を見るとこんな感じ

    実際,開発者はJDBC APIを使用せず,値を渡す限りJPAは中間から操作し,クエリ文を生成してDBに渡す.

    ORMとは?(オブジェクトリレーションシップマッピング)

  • オブジェクトリレーションシップマッピングは、データベースとオブジェクト向けプログラミング言語との間の互換性のないデータを変換するプログラミング技術である.
  • オブジェクト関係マッピング技術により、オブジェクトとデータベースを資料構造のように使用することができる.
  • なぜJPAを使うのですか?

  • SQLとデータ中心の設計からオブジェクト中心の設計に移行できます.
  • の開発により、生産性が大幅に向上します.
  • SpringデータJPA


    JPAではEntityManagerインスタンスを使用して永続化します.
    JPQLゲートを作成して使用しました.
    Spring Data JPAで使いやすくする
    注意:Spring Data JPAは、JPAをより使いやすくする技術です.

    使用方法


    RepositoryコンポーネントインタフェースでJpa Repositoryを実装します.
    public interface SpringDataJpaMemberRepository extends 
    JpaRepository<Member, Long>, MemberRepository{
        // JPQL select m from Member m where m.name = ?
        Optional<Member> findByName(String name);
    }
    ここで,MemberRepositoryは我々が以前作成した実装方法を有するインタフェースであり,JpaRepositoryはSpringデータJPAインタフェースである.

    SpringデータJPAの提供

  • インタフェースを介した基本CRUD
  • findByName()、findByEmail、countなどはメソッド名のみを使用してクエリーを提供します.
  • 自動ページング機能
  • 注意:実際の操作では、SOAPとSpringデータJPAがデフォルトで使用され、複雑なダイナミッククエリではQuerydslというライブラリが使用されます.
    スプリングデータJPAを使っただけだと思います.
    この機会にJPAにもっと深く入り込んでNodeJsを勉強します