Domaに対する設定は、Config
インタフェースの実装クラスで表現します。
Config
の実装クラスは@Dao
のconfig
要素に指定します。
次の事柄を設定で変更できます。
Config
インタフェースの実装クラスは、publicなデフォルトコンストラクタ(引数なしのコンストラクタ)を持たねばいけません。
また、どのメソッドも null
を返してはいけません。
ここでは、代表的な設定項目について説明します。
javax.sql.DataSource
を、getDataSource
メソッドで返します。
学習等でごく簡易的なデータアクセスを行うだけであれば、
SimpleDataSource
を使用できます。
データソース名をあらわすString
を、getDataSourceName
メソッドで返します。
データソース名は、複数のデータソースを利用する環境で重要です。
データソース名はデータソースごとに自動生成される識別子を認識するために使用されます。
複数データソースを利用する場合は、それぞれ異なる名前を返すようにしてください。
org.seasar.doma.jdbc.dialect.Dialect
を、getDialect
メソッドで返します。
Dialect
はRDBMSの方言をあらわすインタフェースです。
実装クラスには次のものがあります。
データベース | 方言クラスの名前 | 説明 |
---|---|---|
DB2 | org.seasar.doma.jdbc.dialect.Db2Dialect |
|
H2 Database Engine 1.2.126 | org.seasar.doma.jdbc.dialect.H212126Dialect |
H2 Database Engine 1.2.126で稼動実績あり |
H2 Database Engine | org.seasar.doma.jdbc.dialect.H2Dialect |
H2 Database Engine 1.3.171以降に対応 |
HSQLDB | org.seasar.doma.jdbc.dialect.HsqldbDialect |
|
Microsoft SQL Server 2008 | org.seasar.doma.jdbc.dialect.Mssql2008Dialect |
Microsoft SQL Server 2008に対応 |
Microsoft SQL Server | org.seasar.doma.jdbc.dialect.MssqlDialect |
Microsoft SQL Server 2012以降に対応 |
MySQL | org.seasar.doma.jdbc.dialect.MySqlDialect |
|
Oracle Database | org.seasar.doma.jdbc.dialect.OracleDialect |
|
PostgreSQL | org.seasar.doma.jdbc.dialect.PostgresDialect |
|
SQLite | org.seasar.doma.jdbc.dialect.SqliteDialect |
接続先のRDBMSにあわせて、実装クラスを選んでください。
org.seasar.doma.jdbc.JdbcLogger
を、getJdbcLogger
メソッドで返します。
JdbcLogger
はデータベースアクセスに関するログを扱うインタフェースです。
実装クラスには次のものがあります。
UtilLoggingJdbcLogger
は、java.util.logging
のロガーを使用してログ出力する実装です。
多くの場合、アプリケーションで使用するcommons-loggingなどのロガーに出力する実装クラスを別途作ったほうがよいでしょう。
org.seasar.doma.jdbc.SqlFileRepository
を、getSqlFileRepository
メソッドで返します。
SqlFileRepository
はSQLファイルのリポジトリを扱うインタフェースです。
実装クラスには次のものがあります。
GreedyCacheSqlFileRepository
は、読み込んだSQLファイルの内容をパースし、その結果をメモリが許す限り最大限にキャッシュします。
NoCacheSqlFileRepository
は、一切キャッシュを行いません。毎回、SQLファイルからSQLを読み取りパースします。
メモリの利用に厳しい制限がある環境や、扱うSQLファイルが膨大にある環境では、適切なキャッシュアルゴリズムをもった実装クラスを作成し使用してください。
org.seasar.doma.jdbc.RequiresNewController
を、getRequiresNewController
メソッドで返します。
RequiresNewController
はREQUIRES_NEW の属性をもつトランザクションを制御するインタフェースです。
実装クラスには次のものがあります。
NullRequiresNewController
は、実質的になにも行いません。
REQUIRES_NEWの属性をもつトランザクションの最適な制御方法は、環境ごとに異なるため、適切な実装クラスを作成し使用してください。
ただし、このインタフェースは、@TableGenerator
で、識別子を自動生成する際にしか使われません。
@TableGenerator
を利用しない場合は、NullRequiresNewController
を使用してもかまいません。
また、@TableGenerator
を利用する場合であっても、識別子を採番するための更新ロックが問題にならない程度のトランザクション数であれば、NullRequiresNewController
を使用してもかまいません。
org.seasar.doma.jdbc.ClassHelper
を、getClassHelper
メソッドで返します。
ClassHelper
はクラスの扱いに関してアプリケーションサーバやフレームワークの差異を抽象化するインタフェースです。
実装クラスには次のものがあります。
DefaultClassHelper
は、java.lang.Class.forName(name)
を用いてクラスをロードします。
例外メッセージに含めるSQLのタイプをあらわす、org.seasar.doma.jdbc.ExceptionSqlLogType
をgetExceptionSqlLogType
メソッドで返します。
この値は、UniqueConstraintException
などの例外にどのような形式のSQLを含めるかを決定します。
クエリタイムアウト(秒)をあらわす、int
をgetQueryTimeout
メソッドで返します。
この値は、Daoインタフェースの@Delegate
以外の問い合わせで使用されます。
クエリタイムアウト(秒)はjava.sql.Statement.setQueryTimeout(int)
に渡されます。
SELECT時のフェッチサイズをあらわす、int
をgetFetchSize
メソッドで返します。
この値は、Daoインタフェースの@Select
が注釈されたメソッドの実行で使用されます。
フェッチサイズはjava.sql.Statement.setFetchSize(int)
に渡されます。
SELECT時の最大行数をあらわす、int
をgetMaxRows
メソッドで返します。
この値は、Daoインタフェースの@Select
が注釈されたメソッドの実行で使用されます。
最大行数はjava.sql.Statement.setMaxRows(int)
に渡されます。
バッチサイズをあらわす、int
をgetBatchSize
メソッドで返します。
この値は、Daoインタフェースの@BatchUpdate
などが注釈されたバッチ系のメソッドの実行に使用されます。
Config
インタフェースを直接実装してもかまいませんが、
いくつかのデフォルトの設定をもつ DomaAbstractConfig
を継承するのが簡単です。
最初は、このクラスを使い、慣れてきたらConfig
インタフェースを直接実装するのがよいでしょう。
DomaAbstractConfig
を利用する場合、必要な設定は次の3つです。
上記以外の設定については、デフォルトの実装やデフォルトの値が使用されます。
設定項目 | デフォルトの実装クラス/値 |
---|---|
ロガーの設定 | org.seasar.doma.jdbc.UtilLoggingJdbcLogger |
SQLファイルのリポジトリの設定 | org.seasar.doma.jdbc.GreedyCacheSqlFileRepository |
REQUIRES_NEWの属性をもつトランザクションを制御するための設定 | org.seasar.doma.jdbc.NullRequiresNewController |
クラスの扱いに関する設定 | org.seasar.doma.jdbc.DefaultClassHelper |
例外メッセージに含めるSQLのタイプの設定 | org.seasar.doma.jdbc.ExceptionSqlLogType.FORMATTED_SQL |
クエリタイムアウト(秒)の設定 | 0 (0以下の値は明示的に設定しないことをあらわします) |
SELECT時のフェッチサイズの設定 | 0 (0以下の値は明示的に設定しないことをあらわします) |
SELECT時の最大行数の設定 | 0 (0以下の値は明示的に設定しないことをあらわします) |
バッチ更新のバッチサイズの設定 | 10 |
通常、クラスパスが通っていれば、JDBC 4.0 ドライバはサービスプロバイダメカニズムにより自動でロードされます。
しかし、たとえばTomcatでは、WEB-INF/libの下のJDBCドライバを自動でロードしません。 自動でロードされない条件下では、Class.forNameを使ってJDBCドライバをロードしてください。
Class.forNameを実行する場所は、設定クラスのstatic初期化子が1つの候補です。 たとえば、H2 DatabaseのJDBCドライバを明示的にロードする場合には次のようにします。
設定クラスは@Dao
のconfig
要素で指定します。
設定クラスをAppConfig
という名前で作成した場合、次のようになります。
DIコンテナを利用する場合、Dao
の実装クラスや設定クラスのインスタンスをDIコンテナに管理させるとよいでしょう。
Dao
の実装クラスのインスタンスに設定クラスのインスタンスをインジェクションするには、
@Dao
のconfig
要素に何も指定しないでください。
この場合、Config
型のインスタンスを受け取るコンストラクタがDao
の実装クラスに生成されます。
コンストラクタインジェクションをサポートするDIコンテナであれば、設定ファイルなどによりインジェクションが可能です。
上のインタフェースに対する実装クラスのソースコードは、aptにより次のように生成されます。
@AnnotateWith
を使用することで、インジェクションのためのアノテーションをDao
の実装クラスのソースコードに注釈できます。
これにより、DIコンテナがサポートしていれば、アノテーションによるインジェクションも可能になります。
たとえば、 Guiceのアノテーションを注釈するには次のように記述します。
上のインタフェースに対する実装クラスのソースコードは、aptにより次のように生成されます。 コンストラクタとコンストラクタのパラメータにアノテーションが注釈されていることに注目してください。
@AnnotateWith
を任意のアノテーションに注釈し、そのアノテーションをDaoインタフェースに注釈することも可能です。
たとえば、@InjectConfig
というアノテーションに@AnnotateWith
を注釈するとします。
@InjectConfig
をDaoインタフェースに注釈すれば、@AnnotateWith
を直接Daoインタフェースに注釈しているのと同じ効果が得られます。