在使用oracl過程中踩到好多坑,在此記錄,也分享給大家。
第一:批量插入
代碼一(在為明確表和字段的情況下,動態批量增加):
@Insert("<script> " + " Insert into ${tableName} ( ${serverColumns} )" + " <foreach collection='list' item='item' index='index' separator='UNION ALL'> " + "( SELECT ${item} FROM dual)" + " </foreach> "+ "</script> ") int insertBatch(@Param("tableName") String tableName, @Param("serverColumns") String serverColumns, @Param("list") List<String> list);
代碼二(具體演示Mybatis,Mappe.xml中的代碼):
<insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="false"> INSERT INTO RELATION (ID,LCC_CODE,CLIENT_CODE,KEY_ID,DICT_ID,REMARK,UPDATE_FLAG,SERVER_CREATE_TIME) <foreach collection="list" index="index" item="list" separator=" union all"> (SELECT ${list} FROM dual) </foreach> </insert>
第二:批量更新
代碼(具體演示Mybatis,Mappe.xml中的代碼):
<update id="updateUserPswdBatch" parameterType="java.util.List"> <foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";"> UPDATE T_HPM_PUBLIC_USER <set> <if test="item.password != null"> PASSWORD = #{item.password}, </if> </set> where ID = #{item.id} <if test='item.idNumber != null and item.idNumber !="" '> AND ID_NUMBER = #{item.idNumber} </if> </foreach> </update>
單元測試:
@Test public void updateUserPswdBatchTest() { List<Map<String, String>> list = new ArrayList<>(); Map<String, String> map1 = new HashMap<>(); map1.put("id", "789456"); map1.put("password", "777777777777777777"); Map<String, String> map2 = new HashMap<>(); map2.put("id", "123456"); map2.put("password", "88888888888888888888"); Map<String, String> map3 = new HashMap<>(); map3.put("id", "8563159"); map3.put("password", "9999999999999999999"); map3.put("idNumber","530111197111083524"); list.add(map1); list.add(map2); list.add(map3); int i = userMapper.updateUserPswdBatch(list); logger.info("【批量更新獲取的結果為】 i={}", i); }
注意一:更新的結果i=-1;但是測試后還是-1.
百度查了具體原因:
返回負數,是由於mybatis的defaultExecutorType的引起的,defaultExecutorType有三個執行器SIMPLE、REUSE和BATCH。
其中BATCH可以批量更新操作緩存SQL以提高性能,但是有個缺陷就是無法獲取update、delete返回的行數
如果確定要拿到更新條數,defaultExecutorTypes設置成SIMPLE就可以
說明:
在項目中把defaultExecutorTypes設置成SIMPLE以后,返回的數據還是-1,拿不到具體執行的條數。
注意二:oracle執行update和insert語句卡住不動的問題
百度查了具體原因:
造成這樣的情況原因在於你之前執行了update或inert操作但你並沒有commit,導致你操作的這條記錄被oracle鎖住,后面就無法update或insert它了
解決辦法:
1:可能你是在PLSQL中操作的,commit一下
2:查詢鎖定記錄:
SELECT s.sid, s.serial# FROM v$locked_object lo, dba_objects ao, v$session s WHERE ao.object_id = lo.object_id AND lo.session_id = s.sid;
將查詢結果中的數據刪除:
ALTER system KILL session 'SID,serial'