外だしSQLの基本

そもそも外だし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);