スクリプト¶
SQLスクリプトの実行を行うには、 @Script をDaoのメソッドに注釈します。
@Config(config = AppConfig.class)
public interface EmployeeDao {
@Script
void createTable();
...
}
メソッドの戻り値の型は void でなければいけません。パラメータの数は0でなければいけません。
また、メソッドに対応するスクリプトファイルが必須です。
スクリプトファイル¶
スクリプトファイルでは、 Dialect が提供するRDBMS名や区切り文字が使用されます。
データベース | Dialectの名前 | RDBMS名 | 区切り文字 |
---|---|---|---|
DB2 | Db2Dialect | db2 | @ |
H2 Database Engine 1.2.126 | H212126Dialect | h2 | |
H2 Database | H2Dialect | h2 | |
HSQLDB | HsqldbDialect | hsqldb | |
Microsoft SQL Server 2008 | Mssql2008Dialect | mssql | GO |
Microsoft SQL Server | MssqlDialect | mssql | GO |
MySQL | MySqlDialect | mysql | / |
Oracle Database | OracleDialect | oracle | / |
PostgreSQL | PostgresDialect | postgres | $$ |
SQLite | SqliteDialect | sqlite |
ファイル名の形式¶
ファイル名は、次の形式でなければいけません。
META-INF/Daoのクラスの完全修飾名をディレクトリに変換したもの/Daoのメソッド名.script
例えば、 Daoのクラスが aaa.bbb.EmployeeDao でマッピングしたいメソッドが createTable の場合、パス名は次のようになります。
META-INF/aaa/bbb/EmployeeDao/createTable.script
複数のRDBMSに対応する必要があり特定のRDBMSでは別のスクリプトファイルを使いたい場合、 .script の前にハイフン区切りでRDBMS名を入れることで、 優先的に使用するファイルを指示できます。 たとえば、PostgreSQL専用のSQLファイルは次の名前にします。
META-INF/aaa/bbb/EmployeeDao/createTables-postgres.script
この場合、PostgreSQLを使用している場合に限り、 META-INF/aaa/bbb/EmployeeDao/createTable.script よりも META-INF/aaa/bbb/EmployeeDao/createTable-postgres.script が優先的に使用されます。
区切り文字¶
スクリプトファイルの区切り文字には、 ステートメントの区切り文字とブロックの区切り文字の2種類があります。
ステートメントの区切り文字はセミコロン ; です。
ブロックの区切り文字は、 Dialect が提供する値が使用されます。
ブロックの区切り文字は、アノテーションの blockDelimiter 要素で明示することもできます。 アノテーションで指定した場合、 Dialect の値よりも優先されます。
@Script(blockDelimiter = "GO")
void createTable();
エラー発生時の継続実行¶
デフォルトでは、スクリプト中のどれかのSQLの実行が失敗すれば、 処理はそこで止まります。 しかし、アノテーションの haltOnError 要素に false を指定することで、エラー発生時に処理を継続させることができます。
@Script(haltOnError = false)
void createTable();
記述例¶
スクリプトファイルは次のように記述できます。 この例は、Oracle Databaseに有効なスクリプトです。
/*
* テーブル定義(SQLステートメント)
*/
create table EMPLOYEE (
ID numeric(5) primary key, -- 識別子
NAME varchar2(20) -- 名前
);
/*
* データの追加(SQLステートメント)
*/
insert into EMPLOYEE (ID, NAME) values (1, 'SMITH');
/*
* プロシージャー定義(SQLブロック)
*/
create or replace procedure proc
( cur out sys_refcursor,
employeeid in numeric
) as
begin
open cur for select * from employee where id > employeeid order by id;
end proc_resultset;
/
/*
* プロシージャー定義2(SQLブロック)
*/
create or replace procedure proc2
( cur out sys_refcursor,
employeeid in numeric
) as
begin
open cur for select * from employee where id > employeeid order by id;
end proc_resultset;
/
コメントは1行コメント -- とブロックコメント /* */ の2種類が使用できます。 コメントは取り除かれてデータベースへ発行されます。
1つのSQLステートメントは複数行に分けて記述できます。 ステートメントはセミコロン ; で区切らなければいけません。 改行はステートメントの区切りとはみなされません。
ストアドプロシージャーなどのブロックの区切りは、 Dialect のデフォルトの値か、 @Script の blockDelimiter 要素に指定した値を使用して示せます。 この例では、 OracleDialect のデフォルトの区切り文字であるスラッシュ / を使用しています。 ブロックの 区切り文字は行頭に記述し、 区切り文字の後ろには何も記述しないようにしてください。 つまり、区切り文字だけの行としなければいけません。
SQL のログ出力形式¶
@Script の sqlLog 要素に SQL のログ出力形式を指定できます。
@Script(sqlLog = SqlLogType.RAW)
void createTable();
SqlLogType.RAW はバインドパラメータ(?)付きの SQL をログ出力することを表します。