ConditionBeanの基本
ConditionBeanとは?
そもそもConditionBeanとは?に関してはこちら
特徴
ConditionBeanは、目的ベースにSQLを組み立てるオブジェクトです。
- A. 「取得したいテーブル何か?」
- B. 「取得したい関連テーブルは何か?」
- C. 「どんな絞込みをしたいか?ソートをしたいか?」
- D. 「一件検索なのか?リスト検索なのか?」
などの「目的」を指定することで、SQLを安全に実行すること可能です。
実装手順
- A. 基点テーブルのConditionBeanを生成
- B. 取得したい関連テーブルを指定 → cb.setupSelect_...()
- C. 絞り込み条件・ソート条件を設定 → cb.query().set/add...()
- D. Behaviorのメソッドを呼ぶ
ex) 基点テーブルを会員(MEMBER)とした場合 @Java
// ## Arrange ##
// = = = = = = = = = = = = = = = = =
// A. 基点テーブルのConditionBeanを生成
// --> select句, from句)
// = = = = = = = = = = = = = = = = =
MemberCB cb = new MemberCB();// 基点テーブルは「会員」
// = = = = = = = = = = = = = = = =
// B. 取得したい関連テーブルを指定
// --> select句, from句, join句)
// = = = = = = = = = = = = = = = =
cb.setupSelect_MemberStatus();// 「会員ステータス」を結合してSelect句に展開
// = = = = = = = = = = = = = = = = = = = = = =
// C. 絞り込み条件・ソート条件を設定
// --> where句, order-by句(, from句, join句)
// = = = = = = = = = = = = = = = = = = = = = =
cb.query().setMemberName_PrefixSearch("S");// 会員名が'S'で始まること
cb.query().addOrderBy_MemberBirthday_Desc();// 会員の生年月日の降順で並べる
// ## Act ##
// = = = = = = = = = = = = =
// D. Behaviorのメソッドを呼ぶ
// = = = = = = = = = = = = =
List<Member> memberList = memberBhv.selectList(cb);// リスト検索
// ## Assert ##
assertNotSame(0, memberList.size());
for (Member member : memberList) {
log(member.toString());
assertTrue(member.getMemberName().startsWith("S"));
}
// [SQL]
// select ...
// from MEMBER member
// left outer join MEMBER_STATUS status
// on member.MEMBER_STATUS_CODE = status.MEMBER_STATUS_CODE
// where member.MEMBER_NAME like 'S%'
// order by member.MEMBER_BIRTHDAY desc
ConditionBeanの機能
こちら新ドキュメントで作り途中のものです。全てリンク切れですが、一覧として役に立つので先だって公開しています。
- setupSelect_Xxx()
- 関連テーブルの指定(select句、join句)
- specify()
- 主にselect句の補佐的な指定
-
- SpecifyColumn
- 取得カラムの指定 - cb.specify().columnXxx()
- (Specify)DerivedReferrer
- 子テーブルの導出カラム - cb.specify().derivedXxx(new SubQuery...)
- query()
- 検索条件の指定(where句、orderBy句、from句、join句)
-
- Equal
- [=]
- NotEqual
- [!=]
- GreaterThan
- [>]
- LessThan
- [<]
- GreaterEqual
- [>=]
- LessEqual
- [<=]
- InScope
- [in] - in ('foo', 'bar')
- NotInScope
- [in] - not in ('foo', 'bar')
- PrefixSearch
- [like] 前方一致
- LikeSearch
- [like] 前方一致・後方一致・中間一致
- FromTo
- 汎用FromTo条件 - FOO >= 10 and FOO <= 20
- DateFromTo
- 日付のFromTo条件
- ExistsSubQuery
- 子テーブルの条件で絞り込み(exists) - cb.query().existsXxx(new SubQuery...)
- NotExistsSubQuery
- 子テーブルの条件で絞り込み(not exists) - cb.query().notExistsXxx(new SubQuery...)
- InScopeSubQuery
- 子テーブルの条件で絞り込み(in) - cb.query().inScopeXxx(new SubQuery...)
- NotInScopeSubQuery
- 子テーブルの条件で絞り込み(not in) - cb.query().notInScopeXxx(new SubQuery...)
- (Query)DerivedReferrer
- 子テーブルの導出カラムで絞り込み - cb.query().derivedXxx(new SubQuery...)
- ScalarSubQuery
- 基点テーブルのスカラ値で絞り込み - cb.query().scalar_Equal().max(new SubQuery...)
- InlineView
- インラインビューでの絞り込み - cb.query().queryXxx().inline().set...
- OnClause
- on句の絞り込み条件 - cb.query().queryXxx().on().set...
- InnerJoin
- 内部結合の指定 - cb.query().queryXxx().innerJoin();
- addOrderBy_Xxx_Asc(Desc)()
- orderBy句の指定 - cb.query().addOrderBy_Xxx_Asc()
-
- NullsFirst(Last)
- nullを最初(最後)に - ..._Asc().withNullsFirst()
- ManualOrder
- 手動で並べる - ..._Asc().withManualOrder(orderList)
- SpecifiedDerivedOrderBy
- 子テーブルの導出カラムで並べる - cb.query().addSpecifiedDerivedOrderBy...()
- Union
- union句 - cb.union(new UnionQuery...)
- OrQuery
- or条件 - cb.orQuery(new OrQuery...)
- ColumnQuery
- カラム同士の比較での絞り込み - cb.columnQuery(new SpecifyQuery...)
- Paging
- ページング検索 - cb.paging(pageSize, pageNumber)
- FetchFirst
- 最初のn件だけ取得 - cb.fetchFirst(fetchSize)
- LockForUpdate
- 更新ロック - cb.lockForUpdate()
- StatementConfig
- StatementのConfiguration(queryTimeoutなど) - cb.configure(statementConfig)
- ToDisplaySql
- 表示用SQL - cb.toDisplaySql()
- Genba*Fit
- ConditionBean関連の現場フィット
-
- Classification
- 区分値
- FixedCondition
- 業務的one-to-oneの固定条件
- DatabaseDependency
- データベース依存機能
- WhereRecycle
- Where句の再利用
- DebugLog
- 徹底したデバッグログ
- ExceptionMessage
- デバッグしやすい例外メッセージ
- {TwoEdgedSword}
- ※以下は厳重注意して利用すること
-
- IncludeQuery
- 条件メソッドの取捨選択
- EqualEmptyString
- 空文字による等値条件(非等値も含む)
- DisablePagingReSelect
- ページングの再検索の無効化
- Various
- その他いろいろ
-
- InterfaceDispatch
- インターフェース経由での抽象的な利用
- TableInfo
- テーブル情報の取得 ※DBアクセスしない
- Don'tUse
- 利用してはいけない
- {TwoEdgedSword}
- ※以下は厳重注意して利用すること
-
- EmbedCondition
- バインド変数を使わない埋め込み条件
- CheckSafetyResult
- 安全件数のチェック
- HasWhereOrderBy
- where句・order-by句の有無 ※DBアクセスしない
CB関連のBehaviorのメソッド
こちら新ドキュメントで作り途中のものです。全てリンク切れですが、一覧として役に立つので先だって公開しています。
ConditionBeanを利用するBehaviorのメソッドは以下の通り:
- selectEntity(cb)
- 一件検索。結果がない場合はnullを戻す
- selectEntityWithDeletedCheck(cb)
- 一件検索。結果がない場合は例外発生
- selectList(cb)
- リスト検索
- selectPage(cb)
- ページング検索。cb.paging()とセットで利用
- selectCursor(cb, entityRowHandler)
- カーソル検索。entityRowHandlerで一件ずつメモリ展開して処理
- scalarSelect(cb)
- スカラ検索。max(), min(), sum(), avg()
- LoadReferrer
- 子テーブルの取得。Refererrテーブル毎にメソッドがある
- queryUpdate(entity, cb)
- ConditionBeanの条件で更新
- queryDelete(cb)
- ConditionBeanの条件で削除
DBFluteBasicExample
詳細な機能や仕様に関しては、DBFluteBasicExampleのExample実装をご覧下さい。
DBアクセスを定番化しよう
gihyo.jp連載の「DBアクセスを定番化しよう」も参考になります。
ConditionBeanのスコープ
ConditionBeanと外だしSQLのどちらを使ったらよいのか迷ったら、ConditionBeanのスコープをご覧下さい。
逆引きConditionBean
目的から機能を逆引くドキュメント:逆引きConditionBean
ConditionBeanのポリシー
ConditionBeanのポリシーについて。※概念的なドキュメントです。
