MyBatis中ONLの使用教程詳細


前言
この記事は主にMyBatisでOGALを使う方法を説明します。みんなが参考にして勉強するために、興味のある友達は以下のように詳しく紹介します。
ONL関連のコンテンツを検索すれば、通常の結果はStrutsと関係があります。MyBatisに関するものはきっと見つけられません。Strutsの使い方と似ていますが、別の方法で理解するのは難しいです。
MyBatis常用ONL表現
  • e 1 or e 2
  • e 1 and e 2
  • e 1==e 2,e 1 eq 2
  • e 1!=e 2,e 1 neq e 2
  • e 1 lt e 2:
  • より小さいです。
  • e 1 lte 2:以下、他のgt(以上)、gte(以上)
  • e 1 in e 2
  • e 1 not in e 2
  • e 1+e 2、e 1*e 2、e 1/e 2、e 1-e 2、e 1%e 2
  • e,not e:いいえ、反
  • を求めます。
  • e.methodコール対象方法
  • e.propertyオブジェクト属性値
  • e 1[e 2]インデックスで値を取ると、List、配列とMap
  • @class@method(args)クラスの静的方法
  • を呼び出します。
  • @class@fieldクラスの静的フィールドの値を呼び出します。
  • 上記の内容はMyBatisで使用するONL表式だけで、完全な表式はここですをクリックします。
    MyBatisの中でOGALはどこで使えますか?
    もしMyBatisパラメータを深く勉強します。を見たら、この文章にOGANLと特殊な使い方が出ているという印象があるかもしれません。
    もし見ていないなら、時間を見つけてみてください。上記のブログは分かりにくいですが、理解したら役に立ちます。
    MyBatisでONLが使えるところは二つあります。
  • 動的SQL表現における
  • ドル{param}パラメータ中
  • 上の二つのところはMyBatisで処理する時は全部ONLで処理します。
    これら2つの場合の使い方を例に挙げて説明します。
    1.動的SQL表現における
    一例として、MySQL likeクエリ:
    
    <select id="xxx" ...>
     select id,name,... from country
     <where>
     <if test="name != null and name != ''">
      name like concat('%', #{name}, '%')
     </if>
     </where>
    </select>
    上のコードのtestの値はONLで計算します。
    例二、汎用likeクエリ:
    
    <select id="xxx" ...>
     select id,name,... from country
     <bind name="nameLike" value="'%' + name + '%'"/>
     <where>
     <if test="name != null and name != ''">
      name like #{nameLike}
     </if>
     </where>
    </select>
    ここのvalue値はONLで計算されます。
    注:<Bindパラメータの呼び出しは#{}または${} によって取得でき、注入を防ぐことができる。
    ユニバーサルMapperでUUUIDの主キーをサポートしています。汎用Mapperでの実装は<bind>タグを使用しています。このラベルは静的な方法を呼び出しています。大体の方法は以下の通りです。
    
    <bind name="username_bind" 
     value='@java.util.UUID@randomUUID().toString().replace("-", "")' />
    このような方法は静的方法を自動的に呼び出すことができますが、対応する属性値を書き返すことができませんので、注意が必要です。
    2.${param}パラメータの中
    上のlikeの例では、次のような方法を使うのが一番簡単です。
    
    <select id="xxx" ...>
     select id,name,... from country
     <where>
     <if test="name != null and name != ''">
      name like '${'%' + name + '%'}'
     </if>
     </where>
    </select>
    ここで注意したいのは${'%' + name + '%'}で、%${name}%ではなく、この2つの方法の結果は同じですが、処理プロセスは違っています。
    MyBatisで${}を処理する場合、ONLを使ってこの結果値を計算し、SQLで対応する${xxx}を置換し、ONLで処理するのは$
    ここでの表式は、ONLがサポートするすべての表式であり、書き込みが複雑であり、静的方法の戻り値を呼び出すことができ、静的な属性値を呼び出すこともできる。
    例:ONLを使って単表の分表機能を実現する。
    上で言ったのはONLの簡単な使い方です。ここでONLを挙げて、データベースの分割を実現する例を示します。
    この機能は汎用Mapperの新機能で、運転時にテーブル名を指定し、指定されたテーブル名でテーブルを操作することができます。この機能が実現したのはOGALを使ったことです。
    まず、すべてのテーブルがこの機能を必要としているわけではないので、パラメータ(インターフェース方法はエンティティクラスのパラメータしかない)オブジェクトがこのインターフェースを継承する場合、ダイナミックなテーブル名を使用することができるインターフェースを定義した。
    
    public interface IDynamicTableName {
    
     /**
     *        -       ,  null '',          
     *
     * @return
     */
     String getDynamicTableName();
    }
    XMLに表名を書く時に使用します。
    
    <if test="@tk.mybatis.mapper.util.OGNL@isDynamicParameter(_parameter) 
      and dynamicTableName != null 
      and dynamicTableName != ''">
     ${dynamicTableName}
    </if>
    <if test="@tk.mybatis.mapper.util.OGNL@isNotDynamicParameter(_parameter) 
      or dynamicTableName == null 
      or dynamicTableName == ''">
     defaultTableName
    </if>
    判断が必要です。parameterはIDynamicTable Nameインターフェースを継承していますか?簡単な書き方はもう実現できないので、静的な方法を使いました。この二つの方法は以下の通りです。
    
    /**
     *             
     *
     * @param parameter
     * @return true  ,false   
     */
    public static boolean isDynamicParameter(Object parameter) {
     if (parameter != null && parameter instanceof IDynamicTableName) {
     return true;
     }
     return false;
    }
    
    /**
     *       b      
     *
     * @param parameter
     * @return true   ,false  
     */
    public static boolean isNotDynamicParameter(Object parameter) {
     return !isDynamicParameter(parameter);
    }
    <if>で判断した結果、その表名を選択します。
    なお、XML判定にはdynamicTable Nameがあり、このパラメータはgetdynamicTable Name法により得られたものであり、MyBatisは属性に対応するgetter方法を用いて値を取得するものであって、fieldによるものではない。
    最後に
    本当にMyBatisのONLの使い方を知りたいなら、自分でいくつかの例を書いてテストして遊んでみて、手を動かしてテストするのはいい勉強方法です。
    はい、以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に一定の助けをもたらすことを望んでいます。質問があれば、メッセージを残して交流してください。ありがとうございます。