設定

設定可能な項目は、 org.seasar.doma.jdbc.Config インターフェースの実装クラスのメソッドから返される必要があります。

設定可能な項目

データソース

getDataSource メソッドから JDBC DataSource を返します。 Doma が提供するローカル トランザクションが必要な場合は、 LocalTransactionDataSource を返します。

トランザクション も参照してください。

注釈

DataSource は必須の設定項目です。

データソースの名前

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

注釈

SQL の方言は必須の設定項目です。

ロガー

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 は、トランザクションのロック時間を短縮するために新しいトランザクションを開始する場合があります。

この機能は、テーブルの ID を生成する @TableGenerator を使用する場合にのみ使用されます。

デフォルトの RequiresNewController は何も行いません。

クラスのロード

getClassHelper メソッドから ClassHelper を返します。

使用するアプリケーションサーバーとフレームワークが独自の方法でクラスをロードする場合は、独自の ClassHelper を作成することを検討してください。

デフォルトの ClassHelper は主に Class#forName を使ってクラスをロードします。

例外メッセージに含まれる SQL 形式の選択

getExceptionSqlLogType から SqlLogType を返します。デフォルトの SqlLogType を使うと、フォーマットされた SQLが例外メッセージに含まれます。

不明なカラムのハンドリング

getUnknownColumnHandler メソッドから UnknownColumnHandler を返します。結果セットのマッピング処理で、エンティティクラスのプロパティに対応しないカラムが見つかった場合、UnknownColumnHandler によってハンドリングが行われます。

デフォルトの UnknownColumnHandle``r ``UnknownColumnException をスローします。

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

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

デフォルトの Naming は何も行いません。

java.util.Map のキーの命名規則

getMapKeyNaming メソッドから MapKeyNaming を返します。 MapKeyNaming は、結果セットが java.util.Map<String, Object> にマップされるときに使用されます。

デフォルトの MapKeyNaming は何も行いません。

ローカルトランザクションマネージャ

getTransactionManager メソッドから LocalTransactionManager を返します。 getTransactionManager メソッドはデフォルトとして UnsupportedOperationException をスローします。

トランザクション も参照してください。

SQL にコメントを追加する

getCommenter メソッドから Commenter を返します。

Doma は次のような `Commenter を提供します。

  • org.seasar.doma.jdbc.CallerCommenter

デフォルトの Commenter は何も行いません。

Command implementors

getCommandImplementors メソッドから CommandImplementors を返します。たとえば、CommandImplementors は、JDBC API を実行するためのフックを提供します。

Query implementors

getQueryImplementors メソッドから QueryImplementors を返します。たとえば、QueryImplementors は、SQL ステートメントを書き直すためのフックを提供します。

クエリタイムアウト

getQueryTimeout メソッドからクエリタイムアウト (秒) を返します。この値は、クエリ でデフォルトの値として使用されます。

最大行数

getMaxRows メソッドから最大行数を返します。この値は 検索 でデフォルトの値として使用されます。

フェッチサイズ

getFetchSize メソッドからフェッチ サイズを返します。この値は 検索 でデフォルトの値として使用されます。

バッチサイズ

getBatchSize メソッドからバッチサイズを返します。この値は、バッチ追加バッチ更新、および バッチ削除 でデフォルトの値として使用されます。

エンティティリスナーの提供

getEntityListenerProvider メソッドから EntityListenerProvider を返します。依存性注入コンテナからエンティティリスナーを取得する場合は、独自の EntityListenerProvider を作成してください。

デフォルトの EntityListenerProvider は、受け入れられた Supplier からエンティティリスナーを取得します。

SQL ビルダーの設定

getSqlBuilderSettings メソッドから SqlBuilderSettings を返します。

SqlBuilderSettings は SQL の構築を制御します。具体的にはコメントや空白行を SQL から削除できます。

JDBCドライバのロード

すべての JDBC ドライバは、 サービスプロバイダ メカニズムによって自動的にロードされます。

警告

ただし、特定の環境では、このメカニズムが適切に動作しません。たとえば、Apache Tomcat を使用すると、このケースが見つかります。参照: DriverManager、サービス プロバイダのメカニズムとメモリリーク

設定クラスの定義

単純な定義

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

  • 設定インスタンスが依存関係注入コンテナで管理されない

  • ローカルトランザクションが使用される

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

高度な定義

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

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

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

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),
    @Annotation(target = AnnotationTarget.CONSTRUCTOR_PARAMETER, type = javax.inject.Named.class, elements = "\"config\"") })
public interface EmployeeDao {

    @Select
    Employee selectById(Integer id);
}
@Dao
@AnnotateWith(annotations = {
    @Annotation(target = AnnotationTarget.CONSTRUCTOR, type = javax.inject.Inject.class),
    @Annotation(target = AnnotationTarget.CONSTRUCTOR_PARAMETER, type = javax.inject.Named.class, elements = "\"config\"") })
public interface DepartmentDao {

    @Select
    Department selectById(Integer id);
}

DAO インタフェースに @AnnotateWith で繰り返しアノテーションを付けることを避けるには、任意のアノテーションに 1 回だけアノテーションを付けます。

@AnnotateWith(annotations = {
    @Annotation(target = AnnotationTarget.CONSTRUCTOR, type = javax.inject.Inject.class),
    @Annotation(target = AnnotationTarget.CONSTRUCTOR_PARAMETER, type = javax.inject.Named.class, elements = "\"config\"") })
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);
}