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