Mybatis與iBatis的主要區別對比

Mybatis與iBatis的主要差異對比
他們都是優秀的持久層框架,MyBatis是現在最常用的持久層框架,可以動態地拼接sql語句,非常人性化,更適合邏輯複雜的sql;iBatis就是MyBatis前身,他們有很多相似的地方,今天主要講一下sqlMap裏面的變化。
1. 傳入參數
iBatis是parameterClass,而MyBatis是可以不寫的,也可以用parameterType;parameterClass,而MyBatis是可以不寫的,也可以用parameterType;
iBatis的傳出參數關鍵字是:resultClass,而MyBatis是resultMap。
iBatis: <select id="selectDeviceByWhere" parameterClass="Map" resultClass="BaseResultMap"> </select>
MyBatis:<select id="selectDeviceByWhere" parameterType="Map" resultMap="BaseResultMap"> </select>
2. 接收參數
IBatis是使用# #和$ KaTeX parse error: Expected 'EOF', got '#' at position 23: …使用方法等同於MyBatis;#̲ #=#{ }, = =={ } ,解釋一下#和KaTeX parse error: Expected 'EOF', got '#' at position 5: 的區別,#̲字符串處理,加單引號,可以一定…直接使用,當傳入的是數字時,用#會進行隱式轉換爲字符串,耗性能。IBatis是使用# #和$ KaTeX parse error: Expected 'EOF', got '#' at position 23: …使用方法等同於MyBatis;#̲ #=#{ }, = =={ } ,解釋一下#和KaTeX parse error: Expected 'EOF', got '#' at position 5: 的區別,#̲字符串處理,加單引號,可以一定…直接使用,當傳入的是數字時,用#會進行隱式轉換爲字符串,耗性能。
3. 判斷語句,這個也是非常常用和重要的地方。
對於MyBatis的很簡單,只要在where 或者if 的標籤裏面添加test=""就可以了,裏面寫判斷條件了。但是IBatis的就麻煩了許多了,它將每個都方法都進行了封裝。例如
isNull:判斷property字段是否是null

<isNull prepend="and" property="id">   </isNull>
isEqual相當於equals,判斷狀態值。
<isEqual property="state" compareValue="0">  </isEqual>` 或
<isEqual property="state" compareProperty="nextState">  </isEqual>
isEmpty判斷參數是否爲Null或者空,滿足其中一個條件則其true。
isNotEmpty相反,當參數既不爲Null也不爲空是其爲true。
4. 循環的使用
iBatis是使用Iterate:這屬性遍歷整個集合,併爲 java.util.List 集合中的元素重複元素體的內容。例如

<isNotEmpty property="deptIds">
        and dept_id in 
        <iterate property="deptIds" open="(" close=")" conjunction=",">
            #deptIds[]#
            </iterate>
    </isNotEmpty>

deptIds是數組類型的屬性值,當deptIds不爲null或“”時,進行deptIds遍歷取值。
MyBatis使用的是ForEach方法。他可以遍歷List,,Map三種元素。
循環插入:

<insert id="xxxx" parameterType="CompilingRateDto">
            insert into cm_compiling_rate (area)
            values 
            <foreach collection="compilingRateList" item="compilingRate"  separator="," >
                    (#{compilingRate.area})
             </foreach>
    </insert>

循環更新:

<update id="xxxxx" parameterType="CompilingRateDto">
            <foreach collection="updateCompilingRateList" item="compiling"  separator=";" >
                update cm_compiling_rate cr
                      set  compiling_manpower = #{compiling.compilingManpower},
                 where cr.valid_Month=#{compiling.validMonth}           
              </foreach>             
     </update>

5. MyBatis中一條sql結束後可以有“;”,而iBatis會報錯
6. 存儲過程的調用
iBatis:

 <procedure id="setCaseQueueStatus.sql" parameterMap="params.caseQueueStatus">
        <![CDATA[
            {call CMPCCDATA.PKG_CMPCC_QUEUE_TEASE.PROC_SET_AST_ACCT_STATUS(?,?)}
             ]]>
    </procedure>
   <parameterMap id="params.caseQueueStatus" class="java.util.Map">
            <parameter property="P_ACCT_SN" jdbcType="VARCHAR" javaType="string" mode="IN" />
            <parameter property="P_QUEUE_STATUS" jdbcType="VARCHAR" javaType="string" mode="IN" />
    </parameterMap>

MyBatis :

<select id="xxxxx"  resultType = "java.lang.String" statementType="CALLABLE">
           {call batch_randomMark()}
</select>

通過 statementType 屬性將該語句標識爲存儲過程而非普通 SQL 語句
————————————————
版權聲明:本文爲CSDN博主「Rudolf__」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/rudolf__/article/details/83578615

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章