概要
SQLスクリプトの実行を行うには、 @Script
をDaoのメソッドに注釈します。
@Config(config = AppConfig.class) public interface EmployeeDao { @Script void createTable(); ... }
メソッドの戻り値の型はvoidでなければいけません。パラメータの数は0でなければいけません。
また、メソッドに対応するスクリプトファイルが必須です。
スクリプトファイル
ファイル名の形式
ファイル名は、次の形式でなければいけません。
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
が優先的に使用されます。
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 |
区切り文字
スクリプトファイルの区切り文字には、ステートメントの区切り文字とブロックの区切り文字の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
要素で明示することもできます。アノテーションで指定した場合、方言クラスのデフォルトの値よりも優先されます。
@Script(blockDelimiter = "GO") 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ステートメントは複数行に分けて記述できます。 ステートメントはセミコロン(;)で区切らなければいけません。 改行はステートメントの区切りとはみなされません。
ストアドプロシージャーなどのブロックの区切りは、方言クラスのデフォルトの値か、@ScriptのblockDelimiter
要素に指定した値を使用して示せます。
この例では、Oracle Database用の方言クラスのデフォルトの区切り文字であるスラッシュ(/)を使用しています。
ブロックの 区切り文字は行頭に記述し、区切り文字の後ろには何も記述しないようにしてください。
つまり、区切り文字だけの行としなければいけません。