はじめに
前回はDBFluteの環境を構築し、実際にDBアクセスをしてみました。
今回はDBFluteのコア機能であるConditionBeanを実際に使ってみましょう。
お知らせ
この連載にて利用するExampleのソース(Eclipseプロジェクト)は、Subversionにて管理されており、誰もが参照することが可能です。
以下がSVNリポジトリのURLです。
H2データベースを組み込みで利用しているため、チェックアウトしてすぐに単体テストが実行できます。
また、ちょっとしたテーブル構造の確認などはDBFluteが生成したテーブル一覧HTMLにて確認できます。
今回のConditionBeanの例題プログラムも全てこのプロジェクトにて実装されています。ぜひチェックアウトしてDBFluteをいじり倒して見て下さい!
ConditionBean
条件絞り込み
Equal
まず、基本中の基本「Equal」からやってみて、条件メソッドの根本的な仕様を探っていきましょう。
条件値は全てバインド変数としてハンドリングされます。条件の組み立てはConditionBeanのquery()メソッドを必ず利用します。
続いてメソッドを補完すると、set[カラム名]_[演算子]()というメソッドが利用できます(リスト1)。
そして、複数条件を指定指定した場合は全てAND条件として設定されます(リスト2)。ConditionBeanではOR条件はサポートしていません(特例を除き)。代わりにUNION(後述)を利用します。
もし、setMemberId_Equal()の引数にnullを入れた場合はどうなるでしょうか?
例えば、検索画面の条件入力項目において、ユーザが何も入力しなければnullもしくは空文字が来ることでしょう。そのような状況を考慮して、nullもしくは空文字が指定された場合はその条件は無効になります(リスト3、4)。
よってConditionBeanでは、画面入力値の有無をif文で囲って条件付与を分岐させる必要はありません(リスト5)。この仕様は、他の条件メソッドにも当てはまります(GreaterEqualやLessThanなど)。
また、同じカラムに対する同じ演算子の条件を再度設定した場合は、上書きになります(リスト6)。
しかし、この挙動は演算子によって変わります。LikeSearch(後述)は同じカラムに対する同じ演算子の条件をAND条件でつなげることに意味のあるため、これらの演算子は呼び出すたびにAND条件で条件が追加されます。
ただし、NotEqual(後述)もAND条件でつなげる意味があるのですが、NotInScope(後述)を利用することで代用できるためこちらは上書き仕様となっています。
では同じカラムに対する同じ演算子で「同じ値」の条件を設定した時が気になりますね。どうなるのでしょう?
明らかに意味が無いため、もちろん2つ条件を作ったりはせずに1つだけ条件が有効になります(リスト7)。この場合は、明らかなプログラミングミスになりますので、既に設定済みであることを示すWARNログが出力されます(リスト8)。
NotEqual
では、じゃんじゃん他の演算子を見ていきましょう。
「NotEqual」です(リスト9)。SQLでは「where COLUMN_NAME != 3」という条件になります。同じカラムに対する同じ演算子の条件を複数指定すると、最後に設定した条件が有効になります。
GreaterThan
「GreaterThan」です(リスト10)。SQLでは「where COLUMN_NAME > 3」という条件になります。同じカラムに対する同じ演算子の条件を複数指定すると、最後に設定した条件が有効になります。
GreaterEqual
「GreaterEqual」です(リスト11)。SQLでは「where COLUMN_NAME >= 3」という条件になります。同じカラムに対する同じ演算子の条件を複数指定すると、最後に設定した条件が有効になります。
LessThan
「LessThan」です(リスト12)。SQLでは「where COLUMN_NAME < 3」という条件になります。同じカラムに対する同じ演算子の条件を複数指定すると、最後に設定した条件が有効になります。
LessEqual
「LessEqual」です(リスト13)。SQLでは「where COLUMN_NAME <= 3」という条件になります。同じカラムに対する同じ演算子の条件を複数指定すると、最後に設定した条件が有効になります。
PrefixSearch
ちょっと毛並みが変わります。前方一致検索を意味する「PrefixSearch」です(リスト14)。
SQLでは「where COLUMN_NAME like 'xxx%'」という条件になります。同じカラムに対する同じ演算子の条件を複数指定すると、最後に設定した条件が有効になります。
アプリケーションにおいて前方一致は一番よく利用される曖昧検索かと思われます。
そのため、このように明示的なメソッドとして用意されています。
特徴としては、ワイルドカード(%)はConditionBean内部にて解決されるため、プログラム側で明示的に付与する必要がないということが挙げられます。ログを見てみると、しっかりワイルドカードが付与されていることがわかります(リスト15)。
InScope
ある列に対して複数の値を条件に検索する「InScope」です(リスト16)。
SQLでは「where COLUMN_NAME in ('a', 'b')」という条件になります。同じカラムに対する同じ演算子の条件を複数指定すると、指定した分条件がAND条件で追加されます。
NotInScope
「InScope」の否定版を意味する「NotInScope」です(リスト17)。
SQLでは「where COLUMN_NAME not in ('a', 'b')」という条件になります。同じカラムに対する同じ演算子の条件を複数指定すると、指定した分条件がAND条件で追加されます。
次回
基本的な演算子は一通り登場しました。さらには応用的なものが他にもあるのですが、先に他のもっと基本的なところを見ていきたいと思います。
今回はソートや結合とかが全く出てきていません。気になっている方もいらっしゃるかと思いますので、次回はConditionBeanのソートや結合等の基本的な機能を見ていきます。