ibatis 動態條件

(1)實例一:
        <!-- 動態條件分頁查詢 --> 
        <sql id="sql_count"> 
                select count(*) 
        </sql> 
        <sql id="sql_select"> 
                select * 
        </sql> 
        <sql id="sql_where"> 
                from icp 
                <dynamic prepend="where"> 
                        <isNotEmpty prepend="and" property="name"> 
                                name like '%$name$%' 
                        </isNotEmpty> 
                        <isNotEmpty prepend="and" property="path"> 
                                path like '%path$%' 
                        </isNotEmpty> 
                        <isNotEmpty prepend="and" property="area_id"> 
                                area_id = #area_id# 
                        </isNotEmpty> 
                        <isNotEmpty prepend="and" property="hided"> 
                                hided = #hided# 
                        </isNotEmpty> 
                </dynamic> 
                <dynamic prepend=""> 
                        <isNotNull property="_start"> 
                                <isNotNull property="_size"> 
                                        limit #_start#, #_size# 
                                </isNotNull> 
                        </isNotNull> 
                </dynamic> 
        </sql> 
        <select id="findByParamsForCount" parameterClass="map" resultClass="int"> 
                <include refid="sql_count"/> 
                <include refid="sql_where"/> 
        </select> 
        <select id="findByParams" parameterClass="map" resultMap="icp.result_base"> 
                <include refid="sql_select"/> 
                <include refid="sql_where"/> 
        </select>
說明:
0.
使用<sql id="">,<include refid="">做用:方便一些sql內容,在多個地方重複使用;且使主sql語句比較簡潔(缺點:但看上去不一目瞭然)
同時,能夠隨便將sql語句中做任一部分抽取出來到sql,在主sql中間調用也沒問題。以下:
        SELECT d.Device_ID,d.Device_Name,a.App_ID,a.App_Name,a.App_Memo
               FROM T_Device_BaseInfo d ,T_App_Spce_R_Info da ,T_App_Info a 
               WHERE d.Spec_Code=da.Spec_Code AND da.App_ID=a.App_ID
能夠改成:
    <sql id="selectDapermit">
        d.Device_Name,a.App_ID,a.App_Name,a.App_Memo FROM T_Device_BaseInfo d ,
    </sql>
        SELECT d.Device_ID ,<include refid="selectDapermit" />
               T_App_Spce_R_Info da ,T_App_Info a 
               WHERE d.Spec_Code=da.Spec_Code AND da.App_ID=a.App_ID
 
1.
<dynamic prepend="where"> ..</dynamic>標籤,便可此標籤中間部分任一個條件爲true時,會向當前的sql語句中添加一個"where"的字符.
2.
若只有一個判斷條件時,能夠直接用:
<isNotEmpty prepend="where" property="name"> 
                                name like '%$name$%' 
 </isNotEmpty>
3.
模糊查詢:
在一般狀況下 ibatis的參數在sqlmap中使用#param#的形式,參數名以’#‘包着,但當使用模糊查詢時,須將#改成$.如上.
4.
設置範圍查詢時,須用雙重判斷,又如:
                        <isNotEmpty prepend="" property="_starttime"> 
                                <isNotEmpty prepend="and" property="_endtime"> 
                                        <![CDATA[ 
                                        createtime >= #_starttime# 
                                        and createtime < #_endtime# 
                                 ]]> 
                                </isNotEmpty> 
                        </isNotEmpty>
 
(2)實例二
        <insert id="insert" parameterClass="RuleMaster"> 
                insert into rulemaster( 
                name, 
                createtime, 
                updatetime, 
                remark 
                ) values ( 
                #name#, 
                now(), 
                now(), 
                #remark# 
                ) 
                <selectKey keyProperty="id" resultClass="long"> 
                        select LAST_INSERT_ID() 
                </selectKey> 
        </insert> 
        <!-- 更新 --> 
        <update id="update" parameterClass="RuleMaster"> 
                update rulemaster set 
                name = #name#, 
                updatetime = now(), 
                remark = #remark# 
                where id = #id# 
        </update>
說明:
 <selectKey>用於iBatis自動生成的主鍵 
不少數據庫支持自動生成主鍵的數據類型。不過這一般(並不老是)是個私有的特性。
SQL Map 經過<insert>的子元素<selectKey>來支持自動生成的鍵值。它同時支持預生成(如
Oracle)和後生成兩種類型(如 MS-SQL Server)。下面是兩個例子: 
< !—Oracle SEQUENCE Example --> 
<insert id="insertProduct-ORACLE" parameterClass="com.domain.Product"> 
<selectKey resultClass="int" keyProperty="id" > 
SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL 
</selectKey> 
insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) 
values (#id#,#description#) 
</insert>
 
<!-- Mysql  這個例子是我本身加上去的-->
<insert id="insertProduct-Mysql" parameterClass="com.domain.Product">
insert into PRODUCT(PRD_DESCRIPTION)
values (#description#)
<selectKey resultClass="int" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
 
(3)
動態SQL的參數有
屬性關鍵字
含義
<isEqual>
若是參數相等於值 則查詢條件有效。
<isNotEqual>
若是參數不等於值則查詢條件有效。
<isGreaterThan>
若是參數大於值則查詢條件有效。
<isGreaterEqual>
若是參數等於值則查詢條件有效。
<isLessEqual>
若是參數小於值則查詢條件有效。以下所示:
<isLessEqual prepend = 」AND」 property = 」age」 compareValue = 」18」 >
ADOLESCENT = ‘TRUE’
</isLessEqual>
<isPropertyAvailable>
若是參數有使用則查詢條件有效。
<isNotPropertyAvailable>
若是參數沒有使用則查詢條件有效。
<isNull>
若是參數爲NULL則查詢條件有效。
<isNotNull>
若是參數不爲NULL則查詢條件有效。
<isEmpty>
若是參數爲空則查詢條件有效。
<isNotEmpty>
若是參數不爲空則查詢條件有效 。參數的數據類型爲 Collection String  時參數不爲 NULL 或「」。以下所示:
<isNotEmpty prepend=」AND」 property=」firstName」 >
FIRST_NAME=#firstName#
</isNotEmpty>
<isParameterPresent>
若是參數類不爲NULL 則查詢條件有效。
<isNotParameterPresent>
Checks to see if the parameter object is not present (null). Example Usage:
<isNotParameterPresent prepend=」AND」>
EMPLOYEE_TYPE = ‘DEFAULT’
</isNotParameterPresent>
 
(4)
iterator用法:
Person代碼大體以下:
public class Person{
  public Person(int age){
      this.age=age;
  }
  /**
    * 年齡
    */
  private int age;
  /**
    * 性別
    */
  private String sex;
  
    //get/set方法略
    ...
 }//end of Person
 
PersonDaoImp以下:
  /**
    * 刪除性別爲man,年齡爲 11,12 的Person記錄
    */
  public int deletePerson(Map<String, Object> map) {
         
         List<Person>  personList=new ArrayList<Person>();

         Person p1=new Person(11);
         person p2=new Person(12);
         personList.add(p1);
         personList.add(p2);

         map.put("personList",  personList);

         map.put("sex",'man');
         return getSqlMapClientTemplate().delete(
                                 "person.deletePerson", map);
     }
 
person.xml以下:
<!-- 刪除相應的person記錄 -->
  <delete id="deletePerson" parameterClass="map">

    delete from 表名 where      sex=#sex#         
        <iterate prepend=" and" property=" personList" open="("
          close=")" conjunction="or">
          age=$ personList[]. age$
        </iterate> 
       
  </delete>
輸出sql以下:
delete from 表名 where sex='man' and  (age =11  or age=12 )

固然你也能夠這麼寫:
person.xml以下:
<!-- 刪除相應的person記錄 -->
  <delete id="deletePerson" parameterClass="map">

    delete from 表名 where      sex=#sex#      and age in   
        <iterate property=" personList" open="("
          close=")" conjunction=",">
          $ personList[]. age$
        </iterate> 
       
  </delete>
輸出sql以下:
delete from 表名 where sex='man' and   age in (11  ,12 )
 
(5)
ibatis中,須添加:
<![CDATA[  ]]>:
能夠用來分隔sql語句出來,以防止與xml中一些語法衝突。如sql中的<,>,<>等符號若直接寫在xml中,xml會報錯。
若放入CDATA中,則正常。
但其中的內容,不包括<include refid> 或 <isNotNull>等標籤。
能夠包括a.id=#personId#.
如:
<sql id="oraderby">
order by a.name desc
</sql>
<![CDATA[ select a.name ,b.name from a,b  where a.id<>b.id  and b.age=#age# ]]>  <isNotNull prepend="and" property="name">  a.name=#name# </isNotNull> <include refid="orderby">
相關文章
相關標籤/搜索