実際、MyBatisの強力な特徴の1つは、通常、その動的なSQL機能です。 JDBCまたは他の同様のフレームワークを使用した経験がある場合は、SQL文字列を動的に連結することが非常にもつれていることを理解してください。リストの最後にスペースを忘れたり、コンマを省略したりしないでください。 MyBatisの動的SQLは、この痛みを徹底的に処理できます。動的なSQLの場合、最も簡単な方法は、ハードコードされたときにさまざまな動的な動作判断を提供することです。 MyBatisでは、この状況を改善するために強力な動的SQL言語を使用して、SQLステートメントのマッピングで使用できます。動的なSQL要素は、JSTLまたは他の類似のXMLベースのテキストプロセッサの使用に似ています。 MyBatisは、強力なOGNLベースの式を使用して、他の要素を排除します。
一般的に使用するいくつかのノード要素には、if、chook(when、rething)、trim(where、if)、およびforeachが含まれます。 XSLTの使用法に少し似ています(記事〜の後半で言及します)。
(1)IFの使用
VIISITMAPPERのページネーション構成では、PageIndex> -1およびPagesize> -1の場合、対応するページネーションSQLが追加されます。
<選択id = "getListBypagenate" parameterType = "pagenateargs" resultType = "visitor"> select * from(<includ refid = "getlistsql" /> <incturebysql " />)t <! - #{}はパラメーター化された出力を実行することを意味します。 test = "pagestart> -1 and pagesize> -1"> limit#{pagestart}、#{pagesize} </if> </select> </select> <sql id = "getListsQl"> select * select * select *私たちのパラメーターPageIndexとPagesizeはどちらもint値であるため、このような直接的な判断を下すことができます。オブジェクトインスタンスの場合、null判断を使用して動的ロジックを制御できます。特定の開発は、ビジネスニーズに依存します。ここで書くのは容易ではないことに注意することが重要だと思います。これは構成〜で認識されません。
(2)選択の使用(場合、それ以外の場合)
複数の条件下で条件の1つのみを満たすアプリケーションシナリオで主に使用されている場合を選択します。たとえば、クエリ条件、合格ID、名前、およびcreateTimeがそれぞれあります。ビジターテーブルを照会するとき、VisitorIDに値がある場合、IDクエリを使用し、VisitOrnameに値がある場合は、VisitNameクエリを使用します。次のように、david.mybatis.demo.ivisitoroperationインターフェイスクラスにリストを追加します<visitor> getListChooseWhendemo(Basic Queryargs args)メソッドを追加します。 visitormapperに対応する選択ノード構成を追加します。
Package David.mybatis.demo; Import java.util.list; import david.mybatis.model.basicqueryargs; Import david.mybatis.model.pagenateargs; import david.model.visitor; import david.mybatis.model.visitor.visitorn; public interpuration;訪問者*/ public int add(訪問者訪問者); /** visitorを削除*/ public int delete(int id); /**訪問者の更新*/ public int update(訪問者訪問者); /**クエリ訪問者*/パブリックビジタークエリ(int id); / * *クエリリスト */ public List <visitor> getList(); / * * Pagination Query List */ public List <Visitor> getListBypagenate(Pagenateargs args); / * *ページネーションクエリリスト(rownumを含む) */ publicリスト<visitorwithrn> /**基本クエリ*/ Public Visitor BasicQuery(int id); / * *動的条件クエリ(選択、When)インスタンス */ public List <visitor> getListChooseWhendemo(Basic Queryargs args); / * *動的条件クエリ(場合、if、if)/ public list <visitor> getListWheredemo(Basic Queryargs args); / * * Dynamic Query(foreach)インスタンス */ public List <Gisitor> getListForeAchDemo(list <Integer> ids); }
<?xml version = "1.0" encoding = "utf-8"?> <!doctype mapper public " - // mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd <resultmap type = "visitor" id = "visitorrs"> <id column = "id" property = "id" /> <result column = "name" property = "name" /> <result column = "email" email "property =" email " /> <result column =" status " /> <result column =" createTime "property" /> resultmap訪問者から</sql> <! - 条件のいずれかが満たされたときに選択します - > <select id = "getListChooseWhendemo" resultmap = "visitorrs" parametertype = "basic queryargs"> <includ refid = "getListsqlConditions"/> <ここで> < test = "queryid!= 0"> and id =#{queryid} </when> <test = "queryname!= null"> and name ol#{queryname "> </when> <sidetime> =#{querytime} </sids> </seace> </selection> </select(3)where(trim)の使用
キーワードの利点は、対応するフィルター条件がある場合、適切な時期にキーワードを挿入することがわかっていることです。また、主に次のシナリオを扱う、対応するコネクタとまたはコネクタをいつ削除するかも知っています
<select id = "findactiveBloglike" resultType = "blog"> select * from blog where where <if test = "state!= null"> state =#{state} </if> <if> "title!= null"> {title!= null "> </if> </select>それはすべての条件の失敗の結果にはなりません
<選択id = "findactiveBloglike" resultType = "blog"> select * from blog where </select>
または、最初の条件が満たされていないため、後続の状態は満たされます。
<select id = "findactivebloglike" resultType = "blog"> select * from blog where and title 'sometitle' </select>
したがって、このためには、条件の例の場合に選択を作成し、対応するメソッドパブリックリスト<ビジター> getListWhereDemo(Basic Queryargs args)をivisitoroperationインターフェイスクラスに追加し、VisitorMapper構成ファイルに対応する構成を次のように追加できます。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype mapper public " - // mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd <sql id = "getListsQLConditions"> select * from Visitor < /sql> <! - 条件が満たされている場合は操作を追加 - > <select id = "getListwheredemo" resultmap = "visitors" parametertype = "basic queryargs"> <inclutsqlistqlictuss " /> < </if> <if> <test = "queryid> 0">およびid =#{queryid} </if> <if> "queryname!= null"> and like =#{queryname} </if> <if> <if> " |または "> <if test =" querystatus> 0 "> status> 0 </if> <if> <if>" queryid> 0 "> and#{queryid} </if> <if> <" queryname!= null "> </trim> - > </select> </mapper>(4)foreachの使用
一般的に使用される動的SQLでは、IDが大規模なIDSの文字列にIDがあるビジネスシナリオがあります。この場合、ID文字列をスプライスするために一生懸命働くことなく、Eachを使用できます。同じステップは、対応するメソッドをiVisitoroperationインターフェイスクラスのパブリックリスト<Gisitor> getListForeAchDemo(List <Integer> IDS)に追加し、次のように対応するノード要素情報を構成することです。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype mapper public " - // mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd <sql id = "getListsQlConditions"> select * from Visitor </sql> <! - foreach loop条件 - > <select id = "getListforeachDemo" resultmap = "visitors"> <included refid = "getListsQLConditions"/>> where status> close = ")"> $ {item} </foreach> </select> </mapper>最後に、Demorunで対応するテスト方法を確立する必要があり、MyBatisの動的なSQLが完了します。以下のテストに使用されるDemorunメソッド
/** Dynamic Query foreach instance*/ public static void getListforeachdemo(list <integer> ids){sqlsession session = mybatisutils.getsqlsession(); ivisitoroperation voperation = session.getMapper(ivisitoroperation.class);リスト<ビジター> ls = voperation.getListforeachDemo(IDS); for(訪問者訪問者:ls){System.out.println(訪問者); }} /** If if Irsing* / public static void getListWhereCondition(int id、string name、date createTime){name = name == ""? null:名前; sqlsession session = mybatisutils.getsqlsession(); BasicQueryargs args = new BasicQueryargs(id、name、createTime); ivisitoroperation voperation = session.getMapper(ivisitoroperation.class);リスト<ビジター> ls = voperation.getListwheredemo(args); if(ls.size()== 0)system.out.println( "一致なし!"); else {for(visitor visitor:ls){system.out.println(visitor); }}} /** dynamic query instanceを選択します* / public static void getListChooseWhendemo(int id、string name、date createTime){name = name == ""? null:名前; sqlsession session = mybatisutils.getsqlsession(); BasicQueryargs args = new BasicQueryargs(id、name、createTime); ivisitoroperation voperation = session.getMapper(ivisitoroperation.class);リスト<ビジター> ls = voperation.getListChooseWhendemo(args); if(ls.size()== 0)system.out.println( "一致なし!"); else {for(visitor visitor:ls){system.out.println(visitor); }}}
PS:ognlについて
OGNLは、オブジェクトグラフナビゲーション言語の略語です。言語の観点から見ると、Javaオブジェクトのプロパティを取得および設定するために使用される強力な表現言語です。 Javaオブジェクトグラフをナビゲートするために、より高い抽象化構文を提供することを目的としています。 OGNLには、次のような多くの場所でアプリケーションがあります。
オブジェクトをモデル化するためのGUI要素(テキストフィールド、コンボボックスなど)としてのバインディング言語。
SwingのTablemodelのデータソース言語へのデータベーステーブル。
Webコンポーネントとバックグラウンドモデルオブジェクトのバインディング言語(Webognl、Tapestry、Webwork、webobjects)。
Jakarata Commons BeanutilsまたはJSTL Expression Languageのより表現力のある代替品として。
さらに、Javaでできることはたくさんあります。これは、リストマッピングや選択など、OGNLを使用して実行できます。開発者の場合、OGNLを使用すると、簡潔な構文を使用してJavaオブジェクトのナビゲーションを完了できます。一般的に、オブジェクト情報のナビゲーションは「パス」を介して完了します。この「パス」は、GETまたはSETメソッドを直接使用するのではなく、コレクションなどにインデックスが付けられたオブジェクトであるJava Beanの属性になります。