DBアクセスを定番化しよう DBFlute入門

第1回 DBFluteの概要

この記事を読むのに必要な時間:およそ 5 分

更新系メソッドの一覧は,次のリスト7を見てください。

リスト7 Behavior更新系メソッド一覧

更新件数更新
タイプ
メソッド
Modified
Only(※3)
排他制御あり(※1)排他制御なし(Nonstrict)(※2)
1件INSERT void insert(Member member)-
UPDATEvoid update(Member member)void updateNonstrict(Member member)
DELETEvoid delete(Member member)void deleteNonstrict(Member member)-
void deleteNonstrictIgnoreDeleted(Member member)-
INSERT or UPDATEvoid insertOrUpdate(Member member)void insertOrUpdateNonstrict(Member member)
n件INSERTint[] batchInsert(List<Member> memberList)-
UPDATEint[] batchUpdate(List<Member> memberList)int[] batchUpdateNonstrict(List<Member> memberList)×
DELETEint[] batchDelete(List<Member> memberList)int[] batchDeleteNonstrict(List<Member> memberList)-

※1)排他制御の結果として対象のRecordが存在しない場合に EntityAlreadyUpdatedException が発生します。この例外はS2Daoの排他例外であるorg.seasar.dao.NotSingleRowUpdateRuntimeExceptionを継承しています。

※2)updateNonstrict()とdeleteNonstrict()は,対象のEntityが存在しない場合にEntityAlreadyDeletedExceptionが発生します。

※3)Setterが呼び出された項目だけをUpdate文のSet句に列挙して更新します。

細かく役割ごとに分かれています。主な特徴として,排他制御なしのメソッドが明示的に用意されている点です。

実際の開発において,排他制御なしで更新しなければならないときがあります。主には夜間バッチ処理による更新です。

S2Daoでは,排他制御の設定をしてしまうと,同じDAOからは排他制御なしで更新することができなくなります。更新処理直前に検索をして更新日時やバージョンNOを取得して更新をすれば,実質的に排他制御なしで更新することも可能ですが,スピードが求められる夜間バッチなどで,その事前検索はパフォーマンスに影響してきます。実際にはその方法はやらない方が良いでしょう。

BehaviorではNonstrictという名前の付いたメソッドを使えば排他制御なしで更新することが簡単に実現可能で,かつ,事前検索が不要です。

また,Behaviorの全ての更新は,Setterが呼び出されたものだけをUpdate文のSet句に設定して更新する「ModifiedOnly」を採用しています。不要な列を更新することはありません。

他にも細かい配慮があり,紹介し切れないので割愛させて頂きますが,このように,DBFluteではBehaviorを利用することで,より高水準なDBアクセスプログラミングを提供します。

拡張機能(ConditionBean)

DBFluteは,先述の通りS2Daoの不足部分を補うための機能を備えます。

その一つがConditionBeanと呼ばれるものです。ConditionBeanとは,⁠定番Queryのタイプセーフ実装を提供するObject」と言えます。

論よりコード,リスト8を見てください。

リスト8 ConditionBeanのサンプル

MemberCB cb = new MemberCB();
cb.setupSelect_MemberStatus(); //[1]
cb.query().setMemberName_PrefixSearch("Billy"); //[2]
cb.query().addOrderBy_MemberFormalizedDate_Desc();//[3]
cb.query().addOrderBy_MemberId_Asc(); //[4]
List memberList = memberBhv.selectList(cb); //[5]

// memberBhvはDIコンテナにインジェクションされる

[1]は,会員(Member)に対して会員ステータス(MemberStatus)を結合しSelect句に設定することを示します。

[2]は,会員名が「Billy」で始まるもので絞り込むという条件を設定しています。

[3]は,更新日時の降順でソートするという条件を設定しています。

[4]は,更新日時が同じ値の場合に会員IDの昇順でソートするという条件を設定しています。

[5]は,たBehaviorにConditionBeanを渡して検索処理を実行しています。

これが実行されると,発行されるSQLはリスト9のようになります。

リスト9 ConditionBeanのサンプル

select member.MEMBER_ID, member.MEMBER_NAME, ...
     , memberStatus.MEMBER_STATUS_CODE, ...
  from MEMBER member
    left outer join MEMBER_STATUS memberStatus
      on member.MEMBER_STATUS_CODE = memberStatus.MEMBER_STATUS_CODE
 where member.MEMBER_NAME like 'Billy%'
 order by member.UPDATE_DATE desc, member.MEMBER_ID asc

このように,シンプルで定型的(定番的)なSQLをプログラム上でタイプセーフに実装することができます。これにより,スペルミスやSQLの文法ミスよるバグはなくなります。

SQLの得意な数人の開発プロジェクトでは,そこまで効果を発揮しませんが,ある程度の人数でスキルもバラバラな開発プロジェクトでは,このConditionBeanが大いに力を発揮します。

まとめ

DBFluteが何なのか,おおよそご理解頂けましたでしょうか?

今回触れたのは,本当に概要です。もっと詳しくどのように利用できるのか,徐々に説明していきたいと思います。

それでは次回は,DBFluteの環境を構築して実際に使ってみましょう。

著者プロフィール

久保雅彦(くぼまさひこ)

DBFluteメインコミッタ。主にオープン系の開発に従事。DB設計・DB周りの実装などを担当することが多い。