データベースアクセス(MyBatis3編)
================================================================================
.. only:: html
.. contents:: 目次
:local:
:depth: 3
|
.. _DataAccessMyBatis3Overview:
Overview
--------------------------------------------------------------------------------
本節では、\ `MyBatis3 `_\ を使用してデータベースにアクセスする方法について説明する。
| 本ガイドラインでは、MyBatis3のMapperインタフェースをRepositoryインタフェースとして使用することを前提としている。
| Repositoryインタフェースについては、「\ :ref:`repository-label`\ 」を参照されたい。
| Overviewでは、MyBatis3とMyBatis-Springを使用してデータベースアクセスする際のアーキテクチャについて説明を行う。
| 実際の使用方法については、「\ :ref:`DataAccessMyBatis3HowToUse`\ 」を参照されたい。
.. figure:: images_DataAccessMyBatis3/DataAccessMyBatis3Scope.png
:alt: Scope of description
:width: 100%
:align: center
\ **Picture - Scope of description**\
|
.. _DataAccessMyBatis3OverviewAboutMyBatis3:
MyBatis3について
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| MyBatis3は、O/R Mapperの一つだが、データベースで管理されているレコードとオブジェクトをマッピングするという考え方ではなく、SQLとオブジェクトをマッピングするという考え方で開発されたO/R Mapperである。
| そのため、正規化されていないデータベースへアクセスする場合や、発行するSQLをO/R Mapperに任せずに、アプリケーション側で完全に制御したい場合に有効なO/R Mapperである。
| 本ガイドラインでは、MyBatis3から追加されたMapperインタフェースを使用して、EntityのCRUD操作を行う。
| Mapperインタフェースの詳細については、「\ :ref:`DataAccessMyBatis3AppendixAboutMapperMechanism`\ 」を参照されたい。
| 本ガイドラインでは、MyBatis3の全ての機能の使用方法について説明を行うわけではないため、「\ `MyBatis 3 REFERENCE DOCUMENTATION `_\ 」も合わせて参照して頂きたい。
|
.. _DataAccessMyBatis3OverviewAboutComponentConstitutionOfMyBatis3:
MyBatis3のコンポーネント構成について
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
| MyBatis3の主要なコンポーネント(設定ファイル)について説明する。
| MyBatis3では、設定ファイルの定義に基づき、以下のコンポーネントが互いに連携する事によって、SQLの実行及びO/Rマッピングを実現している。
.. tabularcolumns:: |p{0.1\linewidth}|p{0.2\linewidth}|p{0.6\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 20 60
* - 項番
- コンポーネント/設定ファイル
- 説明
* - (1)
- MyBatis設定ファイル
- MyBatis3の動作設定を記載するXMLファイル。
データベースの接続先、マッピングファイルのパス、MyBatisの動作設定などを記載するファイルである。
Springと連携して使用する場合は、データベースの接続先やマッピングファイルのパスの設定を本設定ファイルに指定する必要がないため、
MyBatis3のデフォルトの動作を変更又は拡張する際に、設定を行う事になる。
* - (2)
- \ ``org.apache.ibatis.session.SqlSessionFactoryBuilder``\
- MyBatis設定ファイルを読込み、\ ``SqlSessionFactory``\ を生成するためのコンポーネント。
Springと連携して使用する場合は、アプリケーションのクラスから本コンポーネントを直接扱うことはない。
* - (3)
- \ ``org.apache.ibatis.session.SqlSessionFactory``\
- \ ``SqlSession``\ を生成するためのコンポーネント。
Springと連携して使用する場合は、アプリケーションのクラスから本コンポーネントを直接扱うことはない。
* - (4)
- \ ``org.apache.ibatis.session.SqlSession``\
- SQLの発行やトランザクション制御のAPIを提供するコンポーネント。
MyBatis3を使ってデータベースにアクセスする際に、もっとも重要な役割を果たすコンポーネントである。
Springと連携して使用する場合は、アプリケーションのクラスから本コンポーネントを直接扱うことは、基本的にはない。
* - (5)
- Mapperインタフェース
- マッピングファイルに定義したSQLをタイプセーフに呼び出すためのインタフェース。
Mapperインターフェースに対する実装クラスは、MyBatis3が自動で生成するため、開発者はインターフェースのみ作成すればよい。
* - (6)
- マッピングファイル
- SQLとO/Rマッピングの設定を記載するXMLファイル。
|
| 以下に、MyBatis3の主要コンポーネントが、どのような流れでデータベースにアクセスしているのかを説明する。
| データベースにアクセスするための処理は、大きく2つにわける事ができる。
* アプリケーションの起動時に行う処理。下記(1)~(3)の処理が、これに該当する。
* クライアントからのリクエスト毎に行う処理。下記(4)~(10)の処理が、これに該当する。
.. figure:: images_DataAccessMyBatis3/DataAccessMyBatis3RelationshipOfComponents.png
:alt: Relationship of MyBatis3 components
:width: 100%
:align: center
\ **Picture - Relationship of MyBatis3 components**\
| アプリケーションの起動時に行う処理は、以下の流れで実行する。
| Springと連携時の流れについては、「\ :ref:`DataAccessMyBatis3OverviewAboutComponentConstitutionOfMyBatisSpring`\ 」を参照されたい。
.. tabularcolumns:: |p{0.1\linewidth}|p{0.80\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 80
* - 項番
- 説明
* - (1)
- アプリケーションは、\ ``SqlSessionFactoryBuilder``\ に対して \ ``SqlSessionFactory``\ の構築を依頼する。
* - (2)
- \ ``SqlSessionFactoryBuilder``\ は、 \ ``SqlSessionFactory``\ を生成するためにMyBatis設定ファイルを読込む。
* - (3)
- \ ``SqlSessionFactoryBuilder``\ は、MyBatis設定ファイルの定義に基づき \ ``SqlSessionFactory``\ を生成する。
|
| クライアントからのリクエスト毎に行う処理は、以下の流れで実行する。
| Springと連携時の流れについては、「\ :ref:`DataAccessMyBatis3OverviewAboutComponentConstitutionOfMyBatisSpring`\ 」を参照されたい。
.. tabularcolumns:: |p{0.1\linewidth}|p{0.80\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 80
* - 項番
- 説明
* - (4)
- クライアントは、アプリケーションに対して処理を依頼する。
* - (5)
- アプリケーションは、\ ``SqlSessionFactoryBuilder``\ によって構築された \ ``SqlSessionFactory``\ から \ ``SqlSession``\ を取得する。
* - (6)
- \ ``SqlSessionFactory``\ は、\ ``SqlSession``\ を生成しアプリケーションに返却する。
* - (7)
- アプリケーションは、\ ``SqlSession``\ からMapperインタフェースの実装オブジェクトを取得する。
* - (8)
- アプリケーションは、Mapperインタフェースのメソッドを呼び出す。
Mapperインタフェースの仕組みについては、「\ :ref:`DataAccessMyBatis3AppendixAboutMapperMechanism`\ 」を参照されたい。
* - (9)
- Mapperインタフェースの実装オブジェクトは、\ ``SqlSession``\ のメソッドを呼び出して、SQLの実行を依頼する。
* - (10)
- \ ``SqlSession``\ は、マッピングファイルから実行するSQLを取得し、SQLを実行する。
.. tip:: \ **トランザクション制御について**\
上記フローには記載していないが、トランザクションのコミット及びロールバックは、アプリケーションのコードから\ ``SqlSession``\ のAPIを直接呼び出して行う。
ただし、Springと連携する場合は、Springのトランザクション管理機能がコミット及びロールバックを行うため、アプリケーションのクラスから\ ``SqlSession``\ のトランザクションを制御するためのAPIを直接呼び出すことはない。
|
.. _DataAccessMyBatis3OverviewAboutMyBatisSpring:
MyBatis3とSpringの連携について
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| MyBatis3とSpringを連携させるライブラリとして、MyBatisから\ `MyBatis-Spring `_ \ というライブラリが提供されている。
| このライブラリを使用することで、MyBatis3のコンポーネントをSpringのDIコンテナ上で管理する事ができる。
MyBatis-Springを使用すると、
* MyBatis3のSQLの実行をSpringが管理しているトランザクション内で行う事ができるため、MyBatis3のAPIに依存したトランザクション制御を行う必要がない。
* MyBatis3の例外は、Springが用意している汎用的な例外(\ ``org.springframework.dao.DataAccessException``\ )へ変換されるため、MyBatis3のAPIに依存しない例外処理を実装する事ができる。
* MyBatis3を使用するための初期化処理は、すべてMyBatis-SpringのAPIが行ってくれるため、基本的にはMyBatis3のAPIを直接使用する必要がない。
* スレッドセーフなMapperオブジェクトの生成が行えるため、シングルトンのServiceクラスにMapperオブジェクトを注入する事ができる。
等のメリットがある。
本ガイドラインでは、MyBatis-Springを使用することを前提とする。
本ガイドラインでは、MyBatis-Springの全ての機能の使用方法について説明を行うわけではないため、
「\ `Mybatis-Spring REFERENCE DOCUMENTATION `_ \ 」も合わせて参照して頂きたい。
|
.. _DataAccessMyBatis3OverviewAboutComponentConstitutionOfMyBatisSpring:
MyBatis-Springのコンポーネント構成について
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
| MyBatis-Springの主要なコンポーネントについて説明する。
| MyBatis-Springでは、以下のコンポーネントが連携する事によって、MyBatis3とSpringの連携を実現している。
.. tabularcolumns:: |p{0.1\linewidth}|p{0.2\linewidth}|p{0.6\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 20 60
* - 項番
- コンポーネント/設定ファイル
- 説明
* - (1)
- \ ``org.mybatis.spring.SqlSessionFactoryBean``\
- \ ``SqlSessionFactory``\ を構築し、SpringのDIコンテナ上にオブジェクトを格納するためのコンポーネント。
| MyBatis3標準では、MyBatis設定ファイルに定義されている情報を基に\ ``SqlSessionFactory``\ を構築するが、\ ``SqlSessionFactoryBean``\ を使用すると、MyBatis設定ファイルがなくても\ ``SqlSessionFactory``\ を構築することができる。
| もちろん、併用することも可能である。
* - (2)
- \ ``org.mybatis.spring.mapper.MapperFactoryBean``\
- シングルトンのMapperオブジェクトを構築し、SpringのDIコンテナ上にオブジェクトを格納するためのコンポーネント。
| MyBatis3標準の仕組みで生成されるMapperオブジェクトはスレッドセーフではないため、スレッド毎にインスタンスを割り当てる必要があった。
| MyBatis-Springのコンポーネントで作成されたMapperオブジェクトは、スレッドセーフなMapperオブジェクトを生成する事ができるため、ServiceなどのシングルトンのコンポーネントにDIすることが可能となる。
* - (3)
- \ ``org.mybatis.spring.SqlSessionTemplate``\
- \ ``SqlSession``\ インターフェースを実装したシングルトン版の\ ``SqlSession``\ コンポーネント。
| MyBatis3標準の仕組みで生成される\ ``SqlSession``\ オブジェクトはスレッドセーフではないため、スレッド毎にインスタンスを割り当てる必要があった。
| MyBatis-Springのコンポーネントで作成された\ ``SqlSession``\ オブジェクトは、スレッドセーフな\ ``SqlSession``\ オブジェクトが生成されるため、ServiceなどのシングルトンのコンポーネントにDIすることが可能になる。
| ただし、本ガイドラインでは、\ ``SqlSession``\ を直接扱う事は想定していない。
|
以下に、MyBatis-Springの主要コンポーネントが、どのような流れでデータベースにアクセスしているのかを説明する。
データベースにアクセスするための処理は、大きく2つにわける事ができる。
* アプリケーションの起動時に行う処理。下記(1)~(4)の処理が、これに該当する。
* クライアントからのリクエスト毎に行う処理。下記(5)~(11)の処理が、これに該当する。
.. figure:: images_DataAccessMyBatis3/DataAccessMyBatisSpringRelationshipOfComponents.png
:alt: Relationship of MyBatis-Spring components
:width: 100%
:align: center
\ **Picture - Relationship of MyBatis-Spring components**\
アプリケーションの起動時に行う処理は、以下の流れで実行される。
.. tabularcolumns:: |p{0.1\linewidth}|p{0.80\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 80
* - 項番
- 説明
* - (1)
- \ ``SqlSessionFactoryBean``\ は、\ ``SqlSessionFactoryBuilder``\ に対して \ ``SqlSessionFactory``\ の構築を依頼する。
* - (2)
- \ ``SqlSessionFactoryBuilder``\ は、 \ ``SqlSessionFactory``\ を生成するためにMyBatis設定ファイルを読込む。
* - (3)
- \ ``SqlSessionFactoryBuilder``\ は、MyBatis設定ファイルの定義に基づき\ ``SqlSessionFactory``\ を生成する。
生成された\ ``SqlSessionFactory``\ は、SpringのDIコンテナによって管理される。
* - (4)
- \ ``MapperFactoryBean``\ は、スレッドセーフな\ ``SqlSession``\ (\ ``SqlSessionTemplate``\ )と、スレッドセーフなMapperオブジェクト(MapperインタフェースのProxyオブジェクト)を生成する。
| 生成されたMapperオブジェクトは、SpringのDIコンテナによって管理され、ServiceクラスなどにDIされる。
| Mapperオブジェクトは、スレッドセーフな\ ``SqlSession``\ (\ ``SqlSessionTemplate``\ )を利用することで、スレッドセーフな実装を提供している。
|
クライアントからのリクエスト毎に行う処理は、以下の流れで実行される。
.. tabularcolumns:: |p{0.1\linewidth}|p{0.80\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 80
* - 項番
- 説明
* - (5)
- クライアントは、アプリケーションに対して処理を依頼する。
* - (6)
- アプリケーション(Service)は、 DIコンテナによって注入されたMapperオブジェクト(Mapperインターフェースを実装したProxyオブジェクト)のメソッドを呼び出す。
Mapperインタフェースの仕組みについては、 「\ :ref:`DataAccessMyBatis3AppendixAboutMapperMechanism`\ 」を参照されたい。
* - (7)
- Mapperオブジェクトは、呼び出されたメソッドに対応する\ ``SqlSession``\ (\ ``SqlSessionTemplate``\ )のメソッドを呼び出す。
* - (8)
- \ ``SqlSession``\ (\ ``SqlSessionTemplate``\ )は、Proxy化されたスレッドセーフな\ ``SqlSession``\ のメソッドを呼び出す。
* - (9)
- Proxy化されたスレッドセーフな\ ``SqlSession``\ は、トランザクションに割り当てられているMyBatis3標準の\ ``SqlSession``\ を使用する。
トランザクションに割り当てられている\ ``SqlSession``\ が存在しない場合は、MyBatis3標準の\ ``SqlSession``\ を取得するために、\ ``SqlSessionFactory``\ のメソッドを呼び出す。
* - (10)
- \ ``SqlSessionFactory``\ は、MyBatis3標準の\ ``SqlSession``\ を返却する。
返却されたMyBatis3標準の\ ``SqlSession``\ はトランザクションに割り当てられるため、同一トランザクション内であれば、新たに生成されることはなく、同じ\ ``SqlSession``\ が使用される仕組みになっている。
* - (11)
- MyBatis3標準の\ ``SqlSession``\ は、マッピングファイルから実行するSQLを取得し、SQLを実行する。
.. tip:: \ **トランザクション制御について**\
上記フローには記載していないが、トランザクションのコミット及びロールバックは、Springのトランザクション管理機能が行う。
Springのトランザクション管理機能を使用したトランザクション管理方法については、「\ :ref:`service_transaction_management`\ 」を参照されたい。
|
.. _DataAccessMyBatis3HowToUse:
How to use
--------------------------------------------------------------------------------
ここからは、実際にMyBatis3を使用して、データベースにアクセスするための設定及び実装方法について、説明する。
以降の説明は、大きく以下に分類する事ができる。
.. tabularcolumns:: |p{0.1\linewidth}|p{0.20\linewidth}|p{0.60\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 20 60
* - 項番
- 分類
- 説明
* - (1)
- アプリケーション全体の設定
- MyBatis3をアプリケーションで使用するための設定方法や、MyBatis3の動作を変更するための設定方法について記載している。
| ここに記載している内容は、\ **プロジェクト立ち上げ時にアプリケーションアーキテクトが設定を行う時に必要となる。**\
| そのため、基本的にはアプリケーション開発者が個々に意識する必要はない部分である。
以下のセクションが、この分類に該当する。
* \ :ref:`DataAccessMyBatis3HowToUseSettingsPomXml`\
* \ :ref:`DataAccessMyBatis3HowToUseSettingsCooperateWithMyBatis3AndSpring`\
* \ :ref:`DataAccessMyBatis3HowToUseSettingsMyBatis3`\
\ `MyBatis3用のブランクプロジェクト `_ \ からプロジェクトを生成した場合は、上記で説明している設定の多くが既に設定済みの状態となっているため、アプリケーションアーキテクトは、プロジェクト特性を判断し、必要に応じて設定の追加及び変更を行うことになる。
* - (2)
- データアクセス処理の実装方法
- MyBatis3を使った基本的なデータアクセス処理の実装方法について記載している。
ここに記載している内容は、\ **アプリケーション開発者が実装時に必要となる。**\
以下のセクションが、この分類に該当する。
* \ :ref:`DataAccessMyBatis3HowToDababaseAccess`\
* \ :ref:`DataAccessMyBatis3HowToUseResultSetMapping`\
* \ :ref:`DataAccessMyBatis3HowToUseFind`\
* \ :ref:`DataAccessMyBatis3HowToUseCreate`\
* \ :ref:`DataAccessMyBatis3HowToUseUpdate`\
* \ :ref:`DataAccessMyBatis3HowToUseDelete`\
* \ :ref:`DataAccessMyBatis3HowToUseDynamicSql`\
* \ :ref:`DataAccessMyBatis3HowToUseLikeEscape`\
* \ :ref:`DataAccessMyBatis3HowToUseSqlInjectionCountermeasure`\
|
.. _DataAccessMyBatis3HowToUseSettingsPomXml:
pom.xmlの設定
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| インフラストラクチャ層にMyBatis3を使用する場合は、\ :file:`pom.xml`\ にterasoluna-gfw-mybatis3-dependenciesへの依存関係を追加する。
| マルチプロジェクト構成の場合は、domainプロジェクトの\ :file:`pom.xml`\ (\ :file:`projectName-domain/pom.xml`\ )に追加する。
\ `MyBatis3用のブランクプロジェクト `_ \ からプロジェクトを生成した場合は、terasoluna-gfw-mybatis3-dependenciesへの依存関係は、設定済みの状態である。
.. code-block:: xml
:emphasize-lines: 22-27
4.0.0
projectName-domain
jar
com.example
mybatis3-example-app
1.0.0-SNAPSHOT
../pom.xml
org.terasoluna.gfw
terasoluna-gfw-mybatis3-dependencies
pom
.. tabularcolumns:: |p{0.10\linewidth}|p{0.80\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 80
* - 項番
- 説明
* - (1)
- terasoluna-gfw-mybatis3をdependenciesに追加する。
terasoluna-gfw-mybatis3には、MyBatis3及びMyBatis-Springへの依存関係が定義されている。
.. note::
上記設定例は、依存ライブラリのバージョンを親プロジェクトである terasoluna-gfw-parent で管理する前提であるため、pom.xmlでのバージョンの指定は不要である。
|
.. _DataAccessMyBatis3HowToUseSettingsCooperateWithMyBatis3AndSpring:
MyBatis3とSpringを連携するための設定
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. _DataAccessMyBatis3HowToUseSettingsDataSource:
データソースの設定
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
MyBatis3とSpringを連携する場合、データソースはSpringのDIコンテナで管理しているデータソースを使用する必要がある。
\ `MyBatis3用のブランクプロジェクト `_ \ からプロジェクトを生成した場合は、Apache Commons DBCPのデータソースが設定済みの状態であるため、プロジェクトの要件に合わせて設定を変更すること。
データソースの設定方法については、共通編の「\ :ref:`data-access-common_howtouse_datasource`\ 」を参照されたい。
|
.. _DataAccessMyBatis3HowToUseSettingsTransactionManager:
トランザクション管理の設定
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
| MyBatis3とSpringを連携する場合、
トランザクション管理はSpringのDIコンテナで管理している\ ``PlatformTransactionManager``\ を使用する必要がある。
ローカルトランザクションを使用する場合は、JDBCのAPIを呼び出してトランザクション制御を行う\ ``DataSourceTransactionManager``\ を使用する。
\ `MyBatis3用のブランクプロジェクト `_ \ からプロジェクトを生成した場合は、\ ``DataSourceTransactionManager``\ が設定済みの状態である。
設定例は以下の通り。
- \ :file:`projectName-env/src/main/resources/META-INF/spring/projectName-env.xml`\
.. code-block:: xml
:emphasize-lines: 15-22
.. tabularcolumns:: |p{0.10\linewidth}|p{0.80\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 80
* - 項番
- 説明
* - (1)
- \ ``PlatformTransactionManager``\ として、\ ``org.springframework.jdbc.datasource.DataSourceTransactionManager``\ を指定する。
* - (2)
- \ ``dataSource``\ プロパティに、設定済みのデータソースのbeanを指定する。
トランザクション内でSQLを実行する際は、ここで指定したデータソースからコネクションが取得される。
* - (3)
- \ コミット時にエラーが発生した場合にロールバック処理が呼び出される様にする。
この設定を追加することで、「未確定状態の操作を持つコネクションがコネクションプールに戻ることで発生する意図しないコミット(コネクション再利用時のコミット、コネクションクローズ時の暗黙コミットなど)」が発生するリスクを下げることができる。ただし、ロールバック処理時にエラーが発生する可能性もあるため、意図しないコミットが発生するリスクがなくなるわけではない点に留意されたい。
.. note:: **PlatformTransactionManagerのbean IDについて**
id属性には、\ ``transactionManager``\ を指定することを推奨する。
\ ``transactionManager``\ 以外の値を指定すると、\ ````\ タグのtransaction-manager属性に同じ値を設定する必要がある。
|
アプリケーションサーバから提供されているトランザクションマネージャを使用する場合は、JTAのAPIを呼び出してトランザクション制御を行う\ ``org.springframework.transaction.jta.JtaTransactionManager``\ を使用する。
設定例は以下の通り。
- \ :file:`projectName-env/src/main/resources/META-INF/spring/projectName-env.xml`\
.. code-block:: xml
:emphasize-lines: 6,13-14,18-19
.. tabularcolumns:: |p{0.10\linewidth}|p{0.80\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 80
* - 項番
- 説明
* - (1)
- \ ````\ を指定すると、アプリケーションサーバに対して最適な \ ``JtaTransactionManager``\ がbean定義される。
|
.. _DataAccessMyBatis3HowToUseSettingsMyBatis-Spring:
MyBatis-Springの設定
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
MyBatis3とSpringを連携する場合、MyBatis-Springのコンポーネントを使用して、
* MyBatis3とSpringを連携するために必要となる処理がカスタマイズされた\ ``SqlSessionFactory``\ の生成
* スレッドセーフなMapperオブジェクト(MapperインタフェースのProxyオブジェクト)の生成
を行う必要がある。
\ `MyBatis3用のブランクプロジェクト `_ \ からプロジェクトを生成した場合は、MyBatis3とSpringを連携するための設定は、設定済みの状態である。
設定例は以下の通り。
- \ :file:`projectName-domain/src/main/resources/META-INF/spring/projectName-infra.xml`\
.. code-block:: xml
:emphasize-lines: 4,7-8,12-20,22-23
.. tabularcolumns:: |p{0.10\linewidth}|p{0.80\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 80
* - 項番
- 説明
* - (1)
- \ ``SqlSessionFactory``\ を生成するためのコンポーネントとして、\ ``SqlSessionFactoryBean``\ をbean定義する。
* - (2)
- \ ``dataSource``\ プロパティに、設定済みのデータソースのbeanを指定する。
MyBatis3の処理の中でSQLを発行する際は、ここで指定したデータソースからコネクションが取得される。
* - (3)
- \ ``configLocation``\ プロパティに、MyBatis設定ファイルのパスを指定する。
ここで指定したファイルが\ ``SqlSessionFactory``\ を生成する時に読み込まれる。
* - (4)
- Mapperインタフェースをスキャンするために\ ````\ を定義し、\ ``base-package``\ 属性には、Mapperインタフェースが格納されている基底パッケージを指定する。
指定されたパッケージ配下に格納されている Mapperインタフェースがスキャンされ、スレッドセーフなMapperオブジェクト(MapperインタフェースのProxyオブジェクト)が自動的に生成される。
\ **【指定するパッケージは、各プロジェクトで決められたパッケージにすること】**\
.. note:: **MyBatis3の設定方法について**
\ ``SqlSessionFactoryBean``\ を使用する場合、MyBatis3の設定は、MyBatis設定ファイルではなくbeanのプロパティに直接指定することもできるが、本ガイドラインでは、MyBatis3自体の設定はMyBatis標準の設定ファイルに指定する方法を推奨する。
|
.. _DataAccessMyBatis3HowToUseSettingsMyBatis3:
MyBatis3の設定
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| MyBatis3では、MyBatis3の動作をカスタマイズするための仕組みが用意されている。
| MyBatis3の動作をカスタマイズする場合は、MyBatis設定ファイルに設定値を追加する事で実現可能である。
| ここでは、アプリケーションの特性に依存しない設定項目についてのみ、説明を行う。
| その他の設定項目に関しては、「\ `MyBatis 3 REFERENCE DOCUMENTATION(Configuration XML) `_ \ 」を参照し、アプリケーションの特性にあった設定を行うこと。
| 基本的にはデフォルト値のままでも問題ないが、アプリケーションの特性を考慮し、必要に応じて設定を変更すること。
.. note:: \ **MyBatis設定ファイルの格納場所について**\
本ガイドラインでは、MyBatis設定ファイルは、\ :file:`projectName-domain/src/main/resources/META-INF/mybatis/mybatis-config.xml`\ に格納することを推奨している。
\ `MyBatis3用のブランクプロジェクト `_ \ からプロジェクトを生成した場合は、上記ファイルは格納済みの状態である。
|
.. _DataAccessMyBatis3HowToUseSettingsDefaultFetchSize:
\ ``fetchSize``\ の設定
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
| 大量のデータを返すようなクエリを記述する場合は、JDBCドライバに対して適切な\ ``fetchSize``\ を指定する必要がある。
| \ ``fetchSize``\ は、JDBCドライバとデータベース間の1回の通信で取得するデータの件数を設定するパラメータである。
\ ``fetchSize``\ を指定しないとJDBCドライバのデフォルト値が利用されるため、使用するJDBCドライバによっては以下の問題を引き起こす可能性がある。
* デフォルト値が小さいJDBCドライバの場合は「性能の劣化」
* デフォルト値が大きい又は制限がないJDBCドライバの場合は「メモリの枯渇」
これらの問題が発生しないように制御するために、MyBatis3は以下の2つの方法で\ ``fetchSize``\ を指定することができる。
* 全てのクエリに対して適用する「デフォルトの\ ``fetchSize``\ 」の指定
* 特定のクエリに対して適用する「クエリ単位の\ ``fetchSize``\ 」の指定
.. note:: \ **「デフォルトのfetchSize」について**\
「デフォルトの\ ``fetchSize``\ 」は、MyBatis 3.3.0以降のバージョンで利用することができる。
以下に、「デフォルトの\ ``fetchSize``\ 」を指定する方法を示す。
- \ :file:`projectName-domain/src/main/resources/META-INF/mybatis/mybatis-config.xml`\
.. code-block:: xml
.. tabularcolumns:: |p{0.10\linewidth}|p{0.80\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 80
* - 項番
- 説明
* - (1)
- \ ``defaultFetchSize``\ に、1回の通信で取得するデータの件数を指定する。
\
.. note:: \ **「クエリ単位のfetchSize」の指定方法**\
\ ``fetchSize``\ をクエリ単位に指定する必要がある場合は、検索用のSQLを記述するためのXML要素(\ ``