設定
設定可能な項目は、 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
デフォルトの SqlFileRepository
は GreedyCacheSqlFileRepository
で、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
を返します。 @Entity
の naming 要素は、この値よりも優先されます。 @Table
と @Column
の name
要素に明示的な値を指定すると、命名規則は適用されません。
デフォルトの 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);
}
高度な定義
高度な定義は、次の場合に適しています。
設定インスタンスが依存性注入コンテナ内のシングルトンオブジェクトとして管理される
トランザクションマネージャが使用するアプリケーションサーバーまたはフレームワークから提供される
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),
@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);
}