設定

設定可能な項目は、 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

デフォルトの SqlFileRepositoryGreedyCacheSqlFileRepository で、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 によってハンドリングが行われます。

デフォルトの UnknownColumnHandlerUnknownColumnException をスローします。

テーブルとカラムの命名規則

getNaming メソッドから Naming を返します。 @Entitynaming 要素は、この値よりも優先されます。 @Table@Columnname 要素に明示的な値を指定すると、命名規則は適用されません。

デフォルトの 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 ファクトリメソッドから ChunkedAutoBatchInsertQueryChunkedAutoBatchUpdateQuery、または 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) を呼び出します。

デフォルトの実装では、有効にすると統計情報を無期限に収集します。メモリの枯渇を防ぐためには、定期的に StatisticManagerclear メソッドを呼び出すか、 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 は、主にサンプルコードまたはテストコードで使用するために使用されます。

高度な定義

高度な定義は、次の場合に適しています。

  • 設定インスタンスが依存性注入コンテナ内のシングルトンオブジェクトとして管理される

  • トランザクションマネージャが使用するアプリケーションサーバーまたはフレームワークから提供される

dialectdataSource が依存性注入コンテナによって注入されると仮定します。

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);
}