スクリプト
一連の静的 SQL ステートメントを実行するには、DAO メソッドに @Script
アノテーションを付けます。
@Dao
public interface EmployeeDao {
@Script
void createTable();
...
}
メソッドの戻り値の型は void
でなければならず、パラメータの数は 0 でなければなりません。
スクリプト表現
ファイル内のスクリプト
エンコーディング
スクリプト ファイルは UTF-8 エンコードで保存する必要があります。
位置
スクリプト ファイルは、CLASSPATH に含まれる「META-INF」ディレクトリ以下のディレクトリに配置する必要があります。
ファイルパスの形式
スクリプト ファイルのパスは次の形式に従う必要があります。
META-INF/daoインターフェイスのパス形式/daoメソッド.script
たとえば、DAOインターフェース名が aaa.bbb.EmployeeDao
、DAOメソッド名が createTable
の場合、スクリプトファイルのパスは次のようになります。
META-INF/aaa/bbb/EmployeeDao/createTable.script
特定の RDBMS への依存関係
特定の RDBMS への依存関係をファイル名で指定できます。これを行うには、拡張子「.sql」の前にハイフン「-」と RDBMS 名を置きます。たとえば、PostgreSQL に固有のファイル パスは次のとおりです。
META-INF/aaa/bbb/EmployeeDao/createTable-postgres.script
RDBMS固有のスクリプトファイルが優先されます。例えば、PostgreSQLを使用する環境では、 "META-INF/aaa/bbb/EmployeeDao/createTable.script" ではなく "META-INF/aaa/bbb/EmployeeDao/createTable-postgres.script" が選択されます。
特定の RDBMS への依存関係 も参照してください。
アノテーション内のスクリプト
@Sql
アノテーションを使用して DAO メソッドにスクリプトを指定できます。
@Dao
public interface EmployeeDao {
@Sql("create table employee (id integer, name varchar(200))")
@Script
void createTable();
...
}
アノテーション内の SQL テンプレート も参照してください。
区切り文字
スクリプトには 2 種類の区切り文字があります。
ステートメント区切り文字
ブロック区切り文字
ステートメントの区切り文字は常にセミコロン ;
です。ブロック区切り文字は Dialect
インスタンスによって決定されます。 RDBMS ブロック区切り文字は次のとおりです。
RDBMS |
方言 |
ブロック区切り文字 |
---|---|---|
DB2 |
Db2Dialect |
@ |
H2 Database Engine 1.2.126 |
H212126Dialect |
|
H2 Database |
H2Dialect |
|
HSQLDB |
HsqldbDialect |
|
Microsoft SQL Server 2008 |
Mssql2008Dialect |
GO |
Microsoft SQL Server |
MssqlDialect |
GO |
MySQL |
MySqlDialect |
/ |
Oracle Database |
OracleDialect |
/ |
PostgreSQL |
PostgresDialect |
$$ |
SQLite |
SqliteDialect |
@Script
の blockDelimiter
要素にブロック区切り文字を指定することもできます。
@Script(blockDelimiter = "GO")
void createProcedure();
対応するスクリプトファイルは以下のとおりです。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[MY_PROCEDURE]
AS
BEGIN
SET NOCOUNT ON;
END
GO
エラーによる停止
ステートメントの実行が失敗すると、スクリプトの実行は停止します。スクリプトの実行を続行するには、 haltOnError
要素に false
を指定します。
@Script(haltOnError = false)
void createTable();
例
次のスクリプトは Oracle データベースに対して有効です。
/*
* table creation statement
*/
create table EMPLOYEE (
ID numeric(5) primary key, -- identifier is not generated automatically
NAME varchar2(20) -- first name only
);
/*
* insert statement
*/
insert into EMPLOYEE (ID, NAME) values (1, 'SMITH');
/*
* procedure creation block
*/
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;
/
/*
* procedure creation block
*/
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;
/
単一行コメント --
と複数行コメント /* ... */
の両方を使用できます。各ステートメントはセミコロン ;
で終わる必要があります。新しい行はステートメントの終わりを意味しないことに注意してください。
この例では、スラッシュ /
がブロック区切り文字です。ブロック区切り文字は行の先頭に表示され、その後に新しい行が続く必要があります。