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用の方言クラスのデフォルトの区切り文字であるスラッシュ(/)を使用しています。
ブロックの 区切り文字は行頭に記述し、区切り文字の後ろには何も記述しないようにしてください。
つまり、区切り文字だけの行としなければいけません。