About

ドキュメント

Javadocs

プロジェクト文書

Built by Maven

概要

SQLスクリプトの実行を行うには、 @ScriptをDaoのメソッドに注釈します。

@Config(config = AppConfig.class)
public interface EmployeeDao {
    @Script
    void createTable();
    ...
}

メソッドの戻り値の型はvoidでなければいけません。パラメータの数は0でなければいけません。

また、メソッドに対応するスクリプトファイルが必須です。

スクリプトファイル

配置場所

スクリプトファイルはクラスパスが通った META-INF ディレクトリ以下に配置しなければいけません。

ファイル名の形式

ファイル名は、次の形式でなければいけません。

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.DialectgetNameメソッドの値が使用されます。 あらかじめ用意された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要素で明示することもできます。アノテーションで指定した場合、方言クラスのデフォルトの値よりも優先されます。

    @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ステートメントは複数行に分けて記述できます。 ステートメントはセミコロン(;)で区切らなければいけません。 改行はステートメントの区切りとはみなされません。

ストアドプロシージャーなどのブロックの区切りは、方言クラスのデフォルトの値か、@ScriptのblockDelimiter要素に指定した値を使用して示せます。 この例では、Oracle Database用の方言クラスのデフォルトの区切り文字であるスラッシュ(/)を使用しています。 ブロックの 区切り文字は行頭に記述し、区切り文字の後ろには何も記述しないようにしてください。 つまり、区切り文字だけの行としなければいけません。