ibatis 批量更新(二)(ibatis 通过iterate组装in()函数作为数据的筛选条件)
1.情景展示
oracle数据库中,需要根据指定字段内容调用加密程序后,根据主键id进行更新其对应的字段mindex_id的值;
加密通过Java实现,然后通过Java对其进行更新;
Java使用的sqlMap框架是ibatis,ibatis结合oracle如何实现批量更新?
2.解决方案
sqlMap如何写?
1 <!-- 批量更新 --> 2 <update id="updatePRIMARY_INDEX2" parameterClass="java.util.ArrayList"> 3 UPDATE PRIMARY_INDEX2 SET MINDEX_ID = 4 <iterate conjunction="" open="CASE ID" close="END"> 5 <![CDATA[ 6 WHEN #list[].ID# THEN #list[].MINDEX_ID# 7 ]]> 8 </iterate> 9 WHERE ID IN 10 <!-- in()不能超过1000 --> 11 <iterate conjunction="," open="(" close=")"> 12 #list[].ID# 13 </iterate> 14 </update>
相当于oracle中的
1 UPDATE PRIMARY_INDEX2 2 SET MINDEX_ID = CASE ID 3 WHEN '235886' THEN 4 '6' 5 WHEN '235885' THEN 6 '5' 7 WHEN '235884' THEN 8 '4' 9 WHEN '235883' THEN 10 '3' 11 WHEN '235882' THEN 12 '2' 13 WHEN '235881' THEN 14 '1' 15 END 16 WHERE ID IN ('235886', '235885', '235884', '235883', '235882', '235881');
说明:oracle的in()函数有限制,里面的个数不能超过1000个。
2023年1月29日11:03:15
IN()函数使用迭代来实现
<select id="getORGINFOS" parameterClass="map" resultClass="java.util.HashMap">
SELECT ORGCODE,ORGNAME FROM BASE_ORG_INFO T
WHERE ORGCODE IN
<isNotNull property="ORGCODES">
<iterate property="ORGCODES" open="(" close=")" conjunction=",">
<![CDATA[#ORGCODES[]#]]>
</iterate>
</isNotNull>
<isNull property="ORGCODES">
<iterate property="ORGCODE" open="(" close=")" conjunction=",">
<![CDATA[#ORGCODE[]#]]>
</iterate>
</isNull>
</select>
Java代码片段展示
bo调dao
dao调xml
这种使用方式,也就是:Map当中嵌套了List。
在调用的时候<iterate>标签需要指定property属性,告诉xml从可以从key=ORGCODES拿到List。
2024-05-17 16:58:30
说明:
在ibatis中,当parameterClass或resultClass为java.util.HashMap时,我们可以将其简写为:hashmap。
当parameterClass或resultClass为java.util.ArrayList时,我们可以将其简写为:list。
<select id="getDEVICENAMES" parameterClass="list" resultClass="hashmap">
</select>
当parameterClass为java.util.Map时,我们可以将其简写为:map。
注意:resultClass不能为java.util.HashMap或者hashmap,否则在运行的时候会报错。
关于iterate标签的另一种用法
如上图所示,我们可以看到:
入参格式为:List<Integer>。
xml调用
说明:parameterClass="list"和#list[]#并没有关联关系,只是名字一样,仅此而已,代表的含义也不同。
parameterClass指定了入参为java.util.List,resultClass为java.util.HashMap。
由于入参的数据格式为:List<Integer>,在iterate标签我们就不能再指定property属性了。
因为:List里面直接存储的就是数据,无需我们像Map那样进行二次指定。
无论是#list[]#还是#ids[]#,代表的都是入参的list。
只不过是使用#list[]#来代表入参的list更为方便,而如果使用其他名字的话,必须和dao层调用时指定的入参的形参名称保持完全一致!
写在最后
哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!
相关推荐:
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/10066430.html