インフラストラクチャ層の実装
================================================================================
.. only:: html
.. contents:: 目次
:depth: 3
:local:
インフラストラクチャ層では、\ :ref:`repository-class-label`\ を行う。
RepositoryImplは、Repositoryインタフェースで定義したメソッドの実装を行う。
|
.. _repository-class-label:
RepositoryImplの実装
--------------------------------------------------------------------------------
以下に、MyBatis3とJPAを使って、リレーショナルデータベース用のRepositoryを作成する方法を紹介する。
* \ :ref:`repository-mybatis3-label`\
* \ :ref:`repository-jpa-label`\
|
.. _repository-mybatis3-label:
MyBatis3を使ってRepositoryを実装
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
リレーショナルデータベースとの永続APIとしてMyBatis3を使う場合、MyBatis3から提供されている「\ :ref:`DataAccessMyBatis3AppendixAboutMapperMechanism`\ 」を利用してRepositoryインタフェースを作成すると、基本的にはRepositoryImplを実装する必要はない。
これは、MyBatis3が、Mapperインタフェースのメソッドと呼び出すステートメント(SQL)のマッピングを自動で行う仕組みになっているためである。
MyBatis3を使用する場合、アプリケーション開発者は、
* Repositoryインタフェース(メソッドの定義)
* マッピングファイル(SQLとO/Rマッピングの定義)
の作成を行う。
| 以下に、Repositoryインタフェースとマッピングファイルの作成例を示す。
| MyBatis3の使用方法の詳細は、\ :doc:`../ArchitectureInDetail/DataAccessDetail/DataAccessMyBatis3`\ を参照されたい。
- Repositoryインタフェース(Mapperインタフェース)の作成例
.. code-block:: java
package com.example.domain.repository.todo;
import com.example.domain.model.Todo;
// (1)
public interface TodoRepository {
// (2)
Todo findByTodoId(String todoId);
}
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- POJOのインタフェースとして作成する。
MyBatis3のインタフェースやアノテーションなどを指定する必要はない。
* - | (2)
- Repositoryのメソッドを定義する。
基本的には、MyBatis3のアノテーションを付与する必要はないが、一部のケースでアノテーションを指定する事もある。
- マッピングファイルの作成例
.. code-block:: xml
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (3)
- Repositoryインタフェース毎にマッピングファイルを作成する。
マッピングファイルのネームスペース(\ ``mapper``\ 要素の\ ``namespace``\ 属性)には、RepositoryインタフェースのFQCN(Fully Qualified Class Name)を指定する。
* - | (4)
- Repositoryインタフェースに定義したメソッド毎に実行するステートメント(SQL)の定義を行う。
ステートメントID(各ステートメント要素(\ ``select``\ /\ ``insert``\ /\ ``update``\ /\ ``delete``\ 要素の\ ``id``\ 属性)には、Repositoryインタフェースのメソッド名を指定する。
* - | (5)
- クエリを発行する場合は、必要に応じてO/Rマッピングの定義を行う。
シンプルなO/Rマッピングであれば自動マッピングを利用する事ができるが、複雑なO/Rマッピングを行う場合は、個別にマッピングの定義が必要となる。
上記例のマッピング定義は、シンプルなO/Rマッピングなので自動マッピングを利用する事もできる。
|
.. _repository-jpa-label:
JPAを使ってRepositoryを実装
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| リレーショナルデータベースとの永続APIとして、JPAを使う場合、Spring Data JPAの\ ``org.springframework.data.jpa.repository.JpaRepository``\ を使用すると、非常に簡単にRepositoryを作成することが出来る。
| Spring Data JPAの使用方法の詳細は、\ :doc:`../ArchitectureInDetail/DataAccessDetail/DataAccessJpa`\ を参照されたい。
| Spring Data JPAを使った場合、基本的なCRUD操作は、JpaRepositoryを継承したインタフェースを作成するだけでよい。つまり、基本的には、RepositoryImplは不要である。
| ただし、動的なクエリ(JPQL)を発行する必要がある場合は、RepositoryImplが必要となる。
| Spring Data JPA使用時のRepositoryImplの実装については、\ :doc:`../ArchitectureInDetail/DataAccessDetail/DataAccessJpa`\ を参照されたい。
- TodoRepository.java
.. code-block:: java
:emphasize-lines: 1
public interface TodoRepository extends JpaRepository { // (1)
// omitted
}
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- JpaRepositoryを継承したインタフェースを定義するだけで、Todoエンティティに対する基本的なCRUD操作を実装なしで実現できる。
| JpaRepositoryから提供されていない操作を追加する場合について説明する。
| Spring Data JPAを使った場合、静的なクエリであればインタフェースにメソッドを追加し、そのメソッドが呼び出された時に実行するクエリ(JPQL)をアノテーションで指定すればよい。
- TodoRepository.java
.. code-block:: java
:emphasize-lines: 2
public interface TodoRepository extends JpaRepository {
@Query("SELECT COUNT(t) FROM Todo t WHERE finished = :finished") // (1)
long countByFinished(@Param("finished") boolean finished);
// omitted
}
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- \ ``@Query``\ アノテーションで、クエリ(JPQL)を指定する。
.. raw:: latex
\newpage