概要
Domaに対する設定は、Config
インタフェースの実装クラスで表現します。
Config
の実装クラスは@Dao
のconfig
要素に指定します。
次の事柄を設定で変更できます。
- データソース
- データソースの名前
- データベースの方言
- エンティティやプロパティのネーミング規約
- JDBC関連のログ出力に使用するロギングフレームワークへのアダプタ
- SQLファイルのキャッシュ戦略
- トランザクション属性がREQUIRES_NEWであるトランザクションとの連動方法
- クエリ時に使用するパラメータ(タイムアウト、最大件数、フェッチ件数、バッチサイズ)
設定クラスの作成
Configインタフェースを直接実装する場合
Config
インタフェースの実装クラスは、publicなデフォルトコンストラクタ(引数なしのコンストラクタ)を持たねばいけません。
また、どのメソッドも null
を返してはいけません。
ここでは、代表的な設定項目について説明します。
データソースの設定
javax.sql.DataSource
を、dataSource
メソッドで返します。
このメソッドでは、通常、DIコンテナやアプリケーションサーバーからDataSource
をルックアップするコードを記述するのがいいでしょう。
学習等でごく簡易的なデータアクセスを行うだけであれば、
SimpleDataSource
を使用できます。
データソース名の設定
データソース名をあらわすString
を、dataSourceName
メソッドで返します。
データソース名は、複数のデータソースを利用する環境で重要です。
データソース名はデータソースごとに自動生成される識別子を認識するために使用されます。
複数データソースを利用する場合は、それぞれ異なる名前を返すようにしてください。
RDBMS方言の設定
org.seasar.doma.jdbc.dialect.Dialect
を、dialect
メソッドで返します。
Dialect
はRDBMSの方言をあらわすインタフェースです。
実装クラスには次のものがあります。
データベース | 方言クラスの名前 |
---|---|
HSQLDB | org.seasar.doma.jdbc.dialect.HsqldbDialect |
MySql | org.seasar.doma.jdbc.dialect.MySqlDialect |
PostgreSQL | org.seasar.doma.jdbc.dialect.PostgresDialect |
Oracle Database | org.seasar.doma.jdbc.dialect.OracleDialect |
接続先のRDBMSにあわせて、実装クラスを選んでください。
ロガーの設定
org.seasar.doma.jdbc.JdbcLogger
を、jdbcLogger
メソッドで返します。
JdbcLogger
はデータベースアクセスに関するログを扱うインタフェースです。
実装クラスには次のものがあります。
UtilLoggingJdbcLogger
は、java.util.logging
のロガーを使用してログ出力する実装です。
多くの場合、アプリケーションで使用するcommons-loggingなどのロガーに出力する実装クラスを別途作ったほうがよいでしょう。
ネーミング規約の設定
org.seasar.doma.jdbc.NamingConvention
を、namingConvention
メソッドで返します。
NamingConvention
はネーミング規約を扱うインタフェースです。
実装クラスには次のものがあります。
CamelNamingConvention
は、キャメルケースの文字列をアンダースコア(_)区切りに変換するネーミング規約です。
@Table
が注釈されていないエンティティクラスの単純名をアンダースコア区切りテーブル名に変換したり、
エンティティクラスの@Calumn
が注釈されていない永続的なフィールドの名前をアンダースコア区切りのカラムに変換したりします。
テーブル名やカラム名のネーミング規約とあった実装クラスを作成し使用してください。
SQLファイルのリポジトリの設定
org.seasar.doma.jdbc.SqlFileRepository
を、sqlFileRepository
メソッドで返します。
SqlFileRepository
はSQLファイルのリポジトリを扱うインタフェースです。
実装クラスには次のものがあります。
CachedSqlFileRepository
は、読み込んだSQLファイルの内容をパースし、その結果を無制限にキャッシュします。
メモリの利用に厳しい制限がある環境や、扱うSQLファイルが膨大にある環境では、適切なキャッシュアルゴリズムをもった実装クラスを作成し使用してください。
REQUIRES_NEWの属性をもつトランザクションを制御するための設定
org.seasar.doma.jdbc.RequiresNewController
を、requiresNewController
メソッドで返します。
RequiresNewController
はREQUIRES_NEW の属性をもつトランザクションを制御するインタフェースです。
実装クラスには次のものがあります。
NullRequiresNewController
は、実質的になにも行いません。
REQUIRES_NEWの属性をもつトランザクションの最適な制御方法は、環境ごとに異なるため、適切な実装クラスを作成し使用してください。
ただし、このインタフェースは、@TableGenerator
で、識別子を自動生成する際にしか使われません。
@TableGenerator
を利用しない場合は、NullRequiresNewController
を使用してもかまいません。
また、@TableGenerator
を利用する場合であっても、識別子を採番するための更新ロックが問題にならない程度のトランザクション数であれば、NullRequiresNewController
を使用してもかまいません。
クエリタイムアウト(秒)の設定
クエリタイムアウト(秒)をあらわす、int
をqueryTimeout
メソッドで返します。
この値は、Daoインタフェースの@Delegate
以外の問い合わせで使用されます。
クエリタイムアウト(秒)はjava.sql.Statement.setQueryTimeout(int)
に渡されます。
SELECT時のフェッチサイズの設定
SELECT時のフェッチサイズをあらわす、int
をfetchSize
メソッドで返します。
この値は、Daoインタフェースの@Select
が注釈されたメソッドの実行で使用されます。
フェッチサイズはjava.sql.Statement.setFetchSize(int)
に渡されます。
SELECT時の最大行数の設定
SELECT時の最大行数をあらわす、int
をmaxRows
メソッドで返します。
この値は、Daoインタフェースの@Select
が注釈されたメソッドの実行で使用されます。
最大行数はjava.sql.Statement.setMaxRows(int)
に渡されます。
バッチ更新のバッチサイズの設定
バッチサイズをあらわす、int
をbatchSize
メソッドで返します。
この値は、Daoインタフェースの@BatchUpdate
などが注釈されたバッチ系のメソッドの実行に使用されます。
DomaAbstractConfigを継承する場合
Config
インタフェースを直接実装してもかまいませんが、
いくつかのデフォルトの設定をもつ DomaAbstractConfig
を継承するのが簡単です。
最初は、このクラスを使い、慣れてきたらConfig
インタフェースを直接実装するのがよいでしょう。
public class AppConfig extends DomaAbstractConfig { ... }
DomaAbstractConfig
を利用する場合、必要な設定は次の3つです。
- データソースの設定
- データソース名の設定
- RDBMS方言の設定
上記以外の設定については、デフォルトの実装やデフォルトの値が使用されます。
設定項目 | デフォルトの実装クラス/値 |
---|---|
ロガーの設定 | org.seasar.doma.jdbc.UtilLoggingJdbcLogger |
ネーミング規約の設定 | org.seasar.doma.jdbc.CamelNamingConvention |
SQLファイルのリポジトリの設定 | org.seasar.doma.jdbc.CachedSqlFileRepository |
REQUIRES_NEWの属性をもつトランザクションを制御するための設定 | org.seasar.doma.jdbc.NullRequiresNewController |
クエリタイムアウト(秒)の設定 | 0 (0以下の値は明示的に設定しないことをあらわします) |
SELECT時のフェッチサイズの設定 | 0 (0以下の値は明示的に設定しないことをあらわします) |
SELECT時の最大行数の設定 | 0 (0以下の値は明示的に設定しないことをあらわします) |
バッチ更新のバッチサイズの設定 | 10 |
設定クラスの利用
設定クラスは@Dao
のconfig
要素で指定します。
設定クラスをAppConfig
という名前で作成した場合、次のようになります。
@Dao(config = AppConfig.class) public interface MyDao { ... }
Seasar2を利用する場合の設定例
Seasar2を利用する場合、
Config
の実装クラスでは、
Seasar2が管理するデータソースやトランザクションマネジャーと連携するとよいでしょう。
また、ロギングフレームワークも統一したほうが管理しやすいでしょう。
例については、ダウンロードページで提供している「SAStrutsを利用したデモアプリ」を参照してください。