設定
設定可能な項目は、 org.seasar.doma.jdbc.Config インターフェースの実装クラスのメソッドから返される必要があります。
設定可能な項目
データソース
getDataSource メソッドから JDBC DataSource を返します。 Doma が提供するローカル トランザクションが必要な場合は、 LocalTransactionDataSource を返します。
トランザクション も参照してください。
注釈
これは必須の設定項目です。
データソースの名前
getDataSourceName メソッドから DataSource の名前を返します。複数のデータソースが使用される環境では、名前が重要です。各データソースに一意の名前を付ける必要があります。
デフォルト値は Config の実装クラスの完全修飾名です。
SQL ダイアレクト
getDialect メソッドから Dialect を返します。使用するデータベースに合わせて適切なダイアレクトを選択する必要があります。
Doma は次のダイアレクトを提供します。
データベース |
ダイアクレクト名 |
説明 |
|---|---|---|
DB2 |
Db2Dialect |
|
H2 Database Engine 1.2.126 |
H212126Dialect |
H2 Database Engine 1.2.126 |
H2 Database |
H2Dialect |
H2 Database Engine 1.3.171 and above |
HSQLDB |
HsqldbDialect |
|
Microsoft SQL Server 2008 |
Mssql2008Dialect |
Microsoft SQL Server 2008 |
Microsoft SQL Server |
MssqlDialect |
Microsoft SQL Server 2012 and above |
MySQL |
MySqlDialect |
MySQL 5 と 8 |
Oracle Database 11g |
Oracle11Dialect |
Oracle Database 11g |
Oracle Database |
OracleDialect |
Oracle Database 12g and above |
PostgreSQL |
PostgresDialect |
|
SQLite |
SqliteDialect |
これらのダイアレクトは org.seasar.doma.jdbc.dialect パッケージにあります。
MysqlDialectはデフォルトでMySQL 5 をサポートします。MySQL 8 のダイアレクトとして使用するには、以下のようにバージョンを指定してMysqlDialectをインスタンス化します。
MysqlDialect dialect = new MysqlDialect(MysqlDialect.MySqlVersion.V8);
注釈
これは必須の設定項目です。
ロガー
getJdbcLogger メソッドから JdbcLogger を返します。
Domaは次のロガーを提供します。
org.seasar.doma.jdbc.UtilLoggingJdbcLogger
デフォルトの JdbcLogger は、java.util.logging を使用する UtilLoggingJdbcLogger です。
SQLファイルリポジトリ
getSqlFileRepository メソッドから SqlFileRepository を返します。
Doma は次の SQLファイルリポジトリ を提供します。
org.seasar.doma.jdbc.GreedyCacheSqlFileRepository
org.seasar.doma.jdbc.NoCacheSqlFileRepository
デフォルトの SqlFileRepository は GreedyCacheSqlFileRepository で、SQL 解析の結果を無制限にキャッシュします。
REQUIRES_NEW トランザクションの制御
getRequiresNewController メソッドから RequiresNewController を返します。 RequiresNewController は、トランザクションのロック時間を短縮するために新しいトランザクションを開始する場合があります。
この機能は、テーブルを使用する @TableGenerator の場合にのみ使用され、データベーステーブルを使用して ID を生成します。
デフォルトの RequiresNewController は何も行いません。
クラスのロード
getClassHelper メソッドから ClassHelper を返します。
使用するアプリケーションサーバーとフレームワークが独自の方法でクラスをロードする場合は、独自の ClassHelper を作成することを検討してください。
デフォルトの ClassHelper は主に Class#forName を使ってクラスをロードします。
例外メッセージに含まれる SQL 形式の選択
getExceptionSqlLogType から SqlLogType を返します。デフォルトの SqlLogType を使うと、フォーマットされた SQLが例外メッセージに含まれます。
重複したカラムの処理
getDuplicateColumnHandler メソッドから DuplicateColumnHandler を返します。結果セットのマッピング処理で、エンティティクラスに対する重複したカラムが見つかった場合、DuplicateColumnHandler がこの状況を処理します。
デフォルトの DuplicateColumnHandler は何もしません。 重複が見つかった場合に DuplicateColumnException をスローするには、ThrowingDuplicateColumnHandler を返します。
不明なカラムのハンドリング
getUnknownColumnHandler メソッドから UnknownColumnHandler を返します。結果セットのマッピング処理で、エンティティクラスのプロパティに対応しないカラムが見つかった場合、UnknownColumnHandler によってハンドリングが行われます。
デフォルトの UnknownColumnHandler は UnknownColumnException をスローします。
テーブルとカラムの命名規則
getNaming メソッドから Naming を返します。 @Entity の naming 要素は、この値よりも優先されます。 @Table と @Column の name 要素に明示的な値を指定すると、命名規則は適用されません。
デフォルトの Naming は何も行いません。
java.util.Map のキーの命名規則
getMapKeyNaming メソッドから MapKeyNaming を返します。 MapKeyNaming は、結果セットが java.util.Map<String, Object> にマップされるときに使用されます。
デフォルトの MapKeyNaming は何も行いません。
ローカルトランザクションマネージャ
getTransactionManager メソッドから LocalTransactionManager を返します。デフォルトでは、getTransactionManager メソッドは UnsupportedOperationException をスローします。
トランザクション も参照してください。
SQLにコメントとしてSQL識別子を追加する
getCommenter メソッドから Commenter を返します。
Doma は次のような Commenter を提供します。
org.seasar.doma.jdbc.CallerCommenter
デフォルトの Commenter は何も行いません。
Command implementors
getCommandImplementors メソッドから CommandImplementors を返します。例えば、CommandImplementors は、JDBC API を実行するためのフックを提供します。
Query implementors
getQueryImplementors メソッドから QueryImplementors を返します。たとえば、QueryImplementors は、SQL ステートメントを書き直すためのフックを提供します。
代替のクエリ実装を差し込むためにも利用できます。たとえば対応する auto-batch ファクトリメソッドから ChunkedAutoBatchInsertQuery、ChunkedAutoBatchUpdateQuery、または ChunkedAutoBatchDeleteQuery を返すと、非常に大きなエンティティリストを処理する際のピークメモリを抑えられます。非常に大きなバッチでメモリ使用量を抑える を参照してください。
クエリタイムアウト
getQueryTimeout メソッドからクエリタイムアウト (秒) を返します。この値は、クエリ でデフォルトの値として使用されます。
最大行数
getMaxRows メソッドから最大行数を返します。この値は 選択クエリ でデフォルトの値として使用されます。
フェッチサイズ
getFetchSize メソッドからフェッチ サイズを返します。この値は 選択クエリ でデフォルトの値として使用されます。
バッチサイズ
getBatchSize メソッドからバッチサイズを返します。この値は、バッチ挿入、バッチ更新、および バッチ削除 でデフォルトの値として使用されます。
エンティティリスナーの提供
getEntityListenerProvider メソッドから EntityListenerProvider を返します。依存性注入コンテナからエンティティリスナーを取得する場合は、独自の EntityListenerProvider を作成してください。
デフォルトの EntityListenerProvider は、供給されたプロバイダーからエンティティリスナーを取得します。
SQL ビルダーの設定
getSqlBuilderSettings メソッドから SqlBuilderSettings を返します。
SqlBuilderSettings は次のSQLの構築に関する設定を制御します:
SQLからブロックコメントを削除するかどうか
SQLから行コメントを削除するかどうか
SQLから空行を削除するかどうか
INリストのパディングを有効にするかどうか
IN リストパディングは、SQL IN 句のパラメータが2のべき乗より少ない場合に、最後のパラメータでパラメータを埋める機能です。この機能は、パラメータ数にかかわらず同じSQL文が生成されやすくなることを保証し、SQLキャッシュや関連するパフォーマンスの最適化に良い効果をもたらす可能性があります。
デフォルトでは、特別なコントロールは適用されません。
統計マネージャー
getStatisticManager メソッドから StatisticManager を返します。
StatisticManager は SQL 実行に関連する統計情報を管理します。各 SQL 文に対して次の情報を保持します:
実行回数
実行最大時間(ミリ秒)
実行の最小時間(ミリ秒)
ミリ秒単位の総実行時間
ミリ秒単位の平均実行時間
統計情報の収集はデフォルトで無効です。有効にするには、次の操作を行います:
void doSomething() {
Config config = getConfig();
config.getStatisticManager().setEnabled(true);
}
無効にするには、setEnabled(false) を呼び出します。
デフォルトの実装では、有効にすると統計情報を無期限に収集します。メモリの枯渇を防ぐためには、定期的に StatisticManager の clear メソッドを呼び出すか、 StatisticManager の適切な実装クラスを作成してください。
JDBCドライバのロード
すべての JDBC ドライバは、[サービスプロバイダ][service provider] メカニズムによって自動的にロードされます。
警告
ただし、特定の環境では、このメカニズムが適切に動作しません。たとえば、Apache Tomcat を使用すると、このケースが見つかります。参照: [DriverManager、サービス プロバイダのメカニズムとメモリリーク][tomcat driver]
設定クラスの定義
単純な定義
単純な定義は、次の場合に適しています。
設定インスタンスが依存関係注入コンテナで管理されない
ローカルトランザクションが使用される
public class DbConfig implements Config {
private static final DbConfig CONFIG = new DbConfig();
private final Dialect dialect;
private final LocalTransactionDataSource dataSource;
private final TransactionManager transactionManager;
private DbConfig() {
dialect = new H2Dialect();
dataSource = new LocalTransactionDataSource(
"jdbc:h2:mem:tutorial;DB_CLOSE_DELAY=-1", "sa", null);
transactionManager = new LocalTransactionManager(
dataSource.getLocalTransaction(getJdbcLogger()));
}
@Override
public Dialect getDialect() {
return dialect;
}
@Override
public DataSource getDataSource() {
return dataSource;
}
@Override
public TransactionManager getTransactionManager() {
return transactionManager;
}
public static DbConfig singleton() {
return CONFIG;
}
}
上記の DbConfig クラスは次のように使用できます。
EmployeeDao dao = new EmployeeDaoImpl(DbConfig.singleton());
上記の EmployeeDao インタフェースには、次のように @Dao アノテーションを付ける必要があります。
@Dao
public interface EmployeeDao {
@Select
Employee selectById(Integer id);
}
さらに単純な定義
org.seasar.doma.jdbc.SimpleConfig を使用すると、より簡単に構成を構築できます。
SimpleConfig は接続文字列に基づいて Dialect を決定し、ローカルトランザクションを使用してトランザクションを管理します。
ここでは、SimpleConfig を使用して Config を構築する例を示します。
Config config = SimpleConfig.builder("jdbc:h2:mem:tutorial;DB_CLOSE_DELAY=-1", "sa", null)
.naming(Naming.SNAKE_UPPER_CASE)
.queryTimeout(10)
.build();
上記の config インスタンスは以下のように使用できます。
EmployeeDao dao = new EmployeeDaoImpl(config);
注釈
SimpleConfig は、主にサンプルコードまたはテストコードで使用するために使用されます。
高度な定義
高度な定義は、次の場合に適しています。
設定インスタンスが依存性注入コンテナ内のシングルトンオブジェクトとして管理される
トランザクションマネージャが使用するアプリケーションサーバーまたはフレームワークから提供される
dialect と dataSource が依存性注入コンテナによって注入されると仮定します。
public class DbConfig implements Config {
private Dialect dialect;
private DataSource dataSource;
@Override
public Dialect getDialect() {
return dialect;
}
public void setDialect(Dialect dialect) {
this.dialect = dialect;
}
@Override
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}
上記のクラスのインスタンスを DAO のインスタンスに注入するには、DAO インタフェースに @AnnotateWith アノテーションを付ける必要があります。
@Dao
@AnnotateWith(annotations = {
@Annotation(target = AnnotationTarget.CONSTRUCTOR, type = javax.inject.Inject.class) })
public interface EmployeeDao {
@Select
Employee selectById(Integer id);
}
@Dao
@AnnotateWith(annotations = {
@Annotation(target = AnnotationTarget.CONSTRUCTOR, type = javax.inject.Inject.class) })
public interface DepartmentDao {
@Select
Department selectById(Integer id);
}
DAO インタフェースに @AnnotateWith で繰り返しアノテーションを付けることを避けるには、任意のアノテーションに 1 回だけアノテーションを付けます。
@AnnotateWith(annotations = {
@Annotation(target = AnnotationTarget.CONSTRUCTOR, type = javax.inject.Inject.class) })
public @interface InjectConfig {
}
次に、DAO インタフェースに上記の @InjectConfig アノテーションを付けることができます。
@Dao
@InjectConfig
public interface EmployeeDao {
@Select
Employee selectById(Integer id);
}
@Dao
@InjectConfig
public interface DepartmentDao {
@Select
Department selectById(Integer id);
}