在使用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'