外だしSQLの基本
そもそも外だしSQLとは?についてはこちら
関連ページへのリンク
実装概要
実装の流れは以下のようになります:
- 1. SQLファイルを作成する。
- 2. SQLを2Way-SQLで実装する。
- 3. Sql2Entityを実行する。
- 4. SQLを呼び出して実行する。
実装手順
1. SQLファイルを作成する。
- パッケージ
-
- Java版
- ../src/main/resources配下のxxx.exbhvパッケージ
- C#版
- ../source配下のxxx.exbhv
- ファイル名
- [Behaviorクラス名]_[SQLを表現する任意の名前].sql *基点となるテーブルのBehavior
- エンコーディング
- UTF-8 *設定により変更可能(torque.daoSqlFileEncoding)
- その他補足
-
- C#版での注意点
- SQLファイルのビルドアクションを「埋め込まれたリソース」にして下さい。
- SQLファイルとBehaviorとの関連
- SQLファイルは任意のパッケージでも構いませんが、上記のように規約合わせて配置するとSQLのパスの指定が「タイプセーフ」に行えます(後述)。 このようなSQLファイルを規約でBehaviorと関連付けてパスの解決をするやり方を「BehaviorQueryPath(後述)を利用した外だしSQL」と呼びます。 *DBFlute-0.7.1より
- 任意のパッケージを利用する場合
- 例えば、「sql/member/selectSimpleMember.sql」というようなパスもファイル名も任意で指定することも可能です。 但し、その場合はSQLの配置規約や命名規約など各プロジェクトにて考える必要があります。また、プログラムからのSQLのパスの指定をタイプセーフに行うことはできません。
ex) SQLファイルの配置
com/example/.../dbflute/exbhv/MemberBhv_selectSimpleMember.sql
2. SQLを2Way-SQLで実装する。
ポイントは以下の通りです:
- A. Sql2Entityの宣言
- 戻り値Entity「CustomizeEntity」と引数DTO「ParameterBean」を生成する場合はその宣言を行う。 *Sql2Entityについてはこちら
- B. パラメータコメント
- 引数のParameterBeanへの参照は「pmb」という変数名を利用すること(習慣)。 *パラメータコメントについてはこちら
- その他補足
-
- CustomizeEntity
- 外だしSQLの戻り値Entityのことを「CustomizeEntity」と呼びます。
- ParameterBean
- 外だしSQLの引数DTOのことを「ParameterBean」と呼びます。
ex) 2Way-SQLでの実装(CustomizeEntityとParameterBeanを生成する場合)
-- #SimpleMember#
-- !SimpleMemberPmb!
-- !!Integer memberId!!
-- !!String memberName!!
select member.MEMBER_ID
, member.MEMBER_NAME
, memberStatus.MEMBER_STATUS_NAME
from MEMBER member
left outer join MEMBER_STATUS memberStatus
on member.MEMBER_STATUS_CODE = memberStatus.MEMBER_STATUS_CODE
/*BEGIN*/where
/*IF pmb.memberId != null*/member.MEMBER_ID = /*pmb.memberId*/3/*END*/
/*IF pmb.memberName != null*/and member.MEMBER_NAME like /*pmb.memberName*/'ス' || '%'/*END*/
/*END*/
order by member.MEMBER_ID asc
3. Sql2Entityを実行する。
以下のものが自動生成されます:
- A. 戻り値Entity「CustomizeEntity」
- exentity.customize配下に生成。
- B. 引数DTO「ParameterBean」
- exdao.pmbean配下に生成。
- C. SQLのパス定義「BehaviorQueryPath」
- Behaviorのstatic定義として生成。定数名は「PATH_xxx」。*DBFlute-0.7.1より
- その他補足
-
- SQLが文法的に間違っている場合
- Sql2Entity実行時に例外が発生します。SQL文を修正して成功するまで再実行して下さい。
- BehaviorQueryPath
- Behaviorに定義されるSQLのパス定義を「BehaviorQueryPath」と呼びます。
Sql2Entityについてはこちら
4. SQLを呼び出して実行する。
ポイントは以下の通りです:
- Behavior#outsideSql().selectList()
- SQLファイルの名前で指定したBehaviorを利用する。
- 第一引数(path):SQLのパス
- 必須。Behavior.PATH_xxxの定義を利用する
- 第二引数(pmb):ParameterBean
- 任意。SQLに渡すパラメータが無い場合は不要(null可)。
- 第三引数(entityType):CustomizeEntityを指定する。
- 必須。
- その他補足
-
- 任意のパッケージを利用の場合(or DBFlute-0.7.0以下)
- 第一引数には「sql/member/selectSimpleMember.sql」というようなSQLファイルへのフルパスを文字列で指定して下さい。
- C#版の場合
- 第三引数はなく、メソッドのジェネリック指定でCustomizeEntityの型を指定します。
ex) リスト検索のテスト実装{条件:名前が'ス'で始まる会員であること}
public void test_outsideSql_selectSimpleMember_Tx() throws Exception {
// ## Arrange ##
// SQLのパス「BehaviorQueryPath」
String path = MemberBhv.PATH_selectSimpleMember;
// パラメータ「ParameterBean」
SimpleMemberPmb pmb = new SimpleMemberPmb();
pmb.setMemberName("ス");
// 戻り値Entityの型「CustomizeEntity」
Class<SimpleMember> entityType = SimpleMember.class;
// ## Act ##
// 外だしSQLの実行!
List<SimpleMember> resultList = memberBhv.outsideSql().selectList(path, pmb, entityType);
// ## Assert ##
...
}
ex) リスト検索のテスト実装のログ
(XLog#log():23) - /===============================================================================
(XLog#log():23) - OutsideSqlDao.selectList()
(XLog#log():23) - =========================/
(XLog#log():23) - path: com/example/dbflute/basic/dbflute/exbhv/MemberBhv_selectSimpleMember.sql
(XLog#log():23) - option: {paging=non, dynamic=false}
(QLog#log():23) - -- #SimpleMember#
-- !SimpleMemberPmb!
-- !!Integer memberId!!
-- !!String memberName!!
select member.MEMBER_ID
, member.MEMBER_NAME
, memberStatus.MEMBER_STATUS_NAME
from MEMBER member
left outer join MEMBER_STATUS memberStatus
on member.MEMBER_STATUS_CODE = memberStatus.MEMBER_STATUS_CODE
where
member.MEMBER_NAME like 'ス' || '%'
order by member.MEMBER_ID asc
(XLog#log():23) - ===========/ [00m00s532ms - Selected list: 2 first={1,ストイコビッチ,正式会員}]
(XLog#log():23) -
(ContainerTestCase#log():70) - {SimpleMember}
(ContainerTestCase#log():70) - 1, ストイコビッチ, 正式会員
(ContainerTestCase#log():70) - 4, スタンコビッチ, 正式会員
SQL上のSelect句の指定カラムを1つにして、戻り値Entityの型としてStringやIntegerを指定することも可能です。
List<String> valueList = memberBhv.outsideSql().selectList(path, pmb, String.class);
