Mybatis的批处理以及执行Update返回行数为负数

项目中用到了批量更新。

在开发当中,可能经常会遇到批量处理这种情况,一般都再在java层面进行,
其本质是节省数据库连接打开关闭的的次数,占用更少的运行内存。

  下面先记一下批处理映射吧:

  mybatis批量插入 

<insert id="saveFeeRuleList" useGeneratedKeys="true" parameterType="java.util.List">
        <selectKey resultType="java.lang.String" keyProperty="id" order="AFTER">
            SELECT
            LAST_INSERT_ID()
    </selectKey>
    INSERT INTO t_product_fee_rule(
        <include refid="Base_Column_List"/>
    )
    VALUES
    <foreach collection="list" item="item" index="index" separator=",">
        (
            #{item.id},#{item.productId},
            #{item.feeCode},#{item.feeValue},
            #{item.remarks}
        )
    </foreach>
</insert>

mybatis批量删除

<delete id="removeProductAgent" parameterType="java.util.HashMap">
    <foreach collection="maps.agentIds" item="item" index="index" open="" close="" separator=";">
        DELETE FROM t_product_agent
        WHERE 1 = 1
        AND product_id = #{maps.productId}
        AND agent_id = #{item}
    </foreach>
</delete>

此处的maps接口中的@Param值对应,属于自定义变量

void removeProductAgent(@Param("maps")Map<String, Object> map);

mybatis批量更新

<update id="updateByMap" parameterType="java.util.List">
        begin
        <foreach collection="list" item="item" index="index" open=""
            close="" separator=";">
            UPDATE PROCESS_NODE
            SET
            DURATION = (#{item.duration}*3600)
            WHERE NODE_ID = #{item.nodeId}
            AND PROCESS_TEMPLATE_ID = #{item.processTemplateId}
        </foreach>;
        end;
    </update>

说说遇到到问题:

  获取mybatis的update行数,总是返回负数。后来在官网上找到原因,是由于defaultExecutorType的引起的,defaultExecutorType有三个执行器SIMPLE、REUSE和BATCH。其中BATCH可以批量更新操作缓存SQL以提高性能,但是有个缺陷就是无法获取update、delete返回的行数。defaultExecutorType的默认执行器是SIMPLE。

名称描述
SIMPLE执行器执行其它语句
REUSE可能重复使用prepared statements 语句
BATCH可以重复执行语句和批量更新

 由于项目配置中启用了BATCH执行器,UPDATE和DELETE返回的行数就丢失了,把执行器改为SIMPLE即可。  

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!-- 全局映射器启用缓存 -->
        <setting name="cacheEnabled" value="true" />
        <!-- 查询时,关闭关联对象即时加载以提高性能 -->
        <setting name="lazyLoadingEnabled" value="true" />
        <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->
        <setting name="aggressiveLazyLoading" value="false" />
        <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->
        <setting name="multipleResultSetsEnabled" value="true" />
        <!-- 允许使用列标签代替列名 -->
        <setting name="useColumnLabel" value="true" />
        <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->
        <setting name="useGeneratedKeys" value="true" />
        <!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->
        <setting name="autoMappingBehavior" value="FULL" />
        <!-- 对于批量更新操作缓存SQL以提高性能 -->
        <!-- defaultExecutorType设置为BATCH有个缺陷就是无法获取update、delete返回的行数 -->
        <!-- <setting name="defaultExecutorType" value="BATCH" />-->
        <!-- 数据库超过25000秒仍未响应则超时 -->
        <setting name="defaultStatementTimeout" value="25000" />
        <!-- 日志 -->
        <!-- <setting name="logImpl" value="SLF4J"/> -->
    </settings>

    <!-- 注册mybatis插件 -->
    <plugins>
        <!-- mysql分页插件 -->
        <plugin interceptor="com.rvho.mybatis.interceptor.MybatisPageInterceptor">
            <property name="databaseType" value="mysql"/>
        </plugin>
    </plugins>
</configuration>

其实这个在我的项目中是没效果的,应该以后会有用吧,先记下来。

我的项目目前没找到好的解决办法,只能用try..catch来解决了,=.=|

 

    

    

。 

打赏

未经允许请勿转载:老徐聊技术 » Mybatis的批处理以及执行Update返回行数为负数

分享到: +More

评论 沙了个发

换个身份

取消评论