Mybatis與iBatis的主要差異對比
他們都是優(yōu)秀的持久層框架皇耗,MyBatis是現在最常用的持久層框架,可以動態(tài)地拼接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: 的區(qū)別托启,#?字符串處理宅倒,加單引號,可以一定…直接使用屯耸,當傳入的是數字時拐迁,用#會進行隱式轉換為字符串,耗性能疗绣。IBatis是使用# #和$ KaTeX parse error: Expected 'EOF', got '#' at position 23: …使用方法等同于MyBatis;#? #=#{ }, = =={ } 线召,解釋一下#和KaTeX parse error: Expected 'EOF', got '#' at position 5: 的區(qū)別,#?字符串處理多矮,加單引號缓淹,可以一定…直接使用,當傳入的是數字時塔逃,用#會進行隱式轉換為字符串讯壶,耗性能。
3. 判斷語句湾盗,這個也是非常常用和重要的地方伏蚊。
對于MyBatis的很簡單,只要在where 或者if 的標簽里面添加test=""就可以了淹仑,里面寫判斷條件了丙挽。但是IBatis的就麻煩了許多了,它將每個都方法都進行了封裝匀借。例如
isNull:判斷property字段是否是null
<isNull prepend="and" property="id">? </isNull>
isEqual相當于equals颜阐,判斷狀態(tài)值。
<isEqual property="state" compareValue="0">? </isEqual>` 或
<isEqual property="state" compareProperty="nextState">? </isEqual>
isEmpty判斷參數是否為Null或者空吓肋,滿足其中一個條件則其true凳怨。
isNotEmpty相反,當參數既不為Null也不為空是其為true。
4. 循環(huán)的使用
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三種元素篙顺。
循環(huán)插入:
<insert id="xxxx" parameterType="CompilingRateDto">
? ? ? ? insert into cm_compiling_rate (area)
? ? ? ? values
? ? ? ? <foreach collection="compilingRateList" item="compilingRate"? separator="," >
? ? ? (#{compilingRate.area})
? ? ? ? </foreach>
</insert>
循環(huán)更新:
<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 語句。