SQLスクリプトの実行を行うには、 @Script
をDaoのメソッドに注釈します。
メソッドの戻り値の型はvoidでなければいけません。パラメータの数は0でなければいけません。
また、メソッドに対応するスクリプトファイルが必須です。
スクリプトファイルはクラスパスが通った META-INF
ディレクトリ以下に配置しなければいけません。
ファイル名は、次の形式でなければいけません。
例えば、 Daoのクラスが aaa.bbb.EmployeeDao
で
マッピングしたいメソッドが createTable
の場合、パス名は次のようになります。
複数のRDBMSに対応する必要があり特定のRDBMSでは別のスクリプトファイルを使いたい場合、
.script
の前にハイフン区切りでRDBMS名を入れることで、優先的に使用するファイルを指示できます。
たとえば、PostgreSQL専用のSQLファイルは次の名前にします。
この場合、PostgreSQLを使用している場合に限り、META-INF/aaa/bbb/EmployeeDao/createTable.script
よりも
META-INF/aaa/bbb/EmployeeDao/createTable-postgres.script
が優先的に使用されます。
RDBMS名は、 org.seasar.doma.jdbc.dialect.Dialect
の getName
メソッドの値が使用されます。
あらかじめ用意されたDialectについてそれぞれのRDBMS名を以下の表に示します。
データベース | 方言クラスの名前 | RDBMS名 |
---|---|---|
DB2 | org.seasar.doma.jdbc.dialect.Db2Dialect |
db2 |
H2 Database Engine 1.2.126 | org.seasar.doma.jdbc.dialect.H212126Dialect |
h2 |
H2 Database Engine | org.seasar.doma.jdbc.dialect.H2Dialect |
h2 |
HSQLDB | org.seasar.doma.jdbc.dialect.HsqldbDialect |
hsqldb |
Microsoft SQL Server 2008 | org.seasar.doma.jdbc.dialect.Mssql2008Dialect |
mssql2008 |
Microsoft SQL Server | org.seasar.doma.jdbc.dialect.MssqlDialect |
mssql |
MySQL | org.seasar.doma.jdbc.dialect.MySqlDialect |
mysql |
Oracle Database | org.seasar.doma.jdbc.dialect.OracleDialect |
oracle |
PostgreSQL | org.seasar.doma.jdbc.dialect.PostgresDialect |
postgres |
SQLite | org.seasar.doma.jdbc.dialect.SqliteDialect |
sqlite |
スクリプトファイルのエンコーディングはUTF-8でなければいけません。
スクリプトファイルの区切り文字には、ステートメントの区切り文字とブロックの区切り文字の2種類があります。
ステートメントの区切り文字はセミコロン(;)です。
ブロックの区切り文字は、方言クラスのデフォルトの値が使用されます。
データベース | 方言クラスの名前 | ブロックの区切り文字 |
---|---|---|
DB2 | org.seasar.doma.jdbc.dialect.Db2Dialect |
@ |
H2 Database Engine 1.2.126 | org.seasar.doma.jdbc.dialect.H212126Dialect |
なし |
H2 Database Engine | org.seasar.doma.jdbc.dialect.H2Dialect |
なし |
HSQLDB | org.seasar.doma.jdbc.dialect.HsqldbDialect |
なし |
Microsoft SQL Server 2008 | org.seasar.doma.jdbc.dialect.Mssql2008Dialect |
GO |
Microsoft SQL Server | org.seasar.doma.jdbc.dialect.MssqlDialect |
GO |
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 |
なし |
ブロックの区切り文字は、アノテーションのblockDelimiter
要素で明示することもできます。アノテーションで指定した場合、方言クラスのデフォルトの値よりも優先されます。
デフォルトでは、スクリプト中のどれかのSQLの実行が失敗すれば、処理はそこで止まります。
しかし、アノテーションのhaltOnError
要素にfalse
を指定することで、エラー発生時に処理を継続させることができます。
スクリプトはスクリプトファイルに次のように記述できます。 この例は、Oracle Databaseに有効なスクリプトです。
コメントは1行コメント(--)とブロックコメント(/* */)の2種類が使用できます。 コメントは取り除かれてデータベースへ発行されます。
1つのSQLステートメントは複数行に分けて記述できます。 ステートメントはセミコロン(;)で区切らなければいけません。 改行はステートメントの区切りとはみなされません。
ストアドプロシージャーなどのブロックの区切りは、方言クラスのデフォルトの値か、@ScriptのblockDelimiter
要素に指定した値を使用して示せます。
この例では、Oracle Database用の方言クラスのデフォルトの区切り文字であるスラッシュ(/)を使用しています。
ブロックの 区切り文字は行頭に記述し、区切り文字の後ろには何も記述しないようにしてください。
つまり、区切り文字だけの行としなければいけません。