项目中用到了批量更新。

在开发当中,可能经常会遇到批量处理这种情况,一般都再在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返回行数为负数的更多相关文章

  1. mysql 存储过程:提供查询语句并返回查询执行影响的行数

    mysql 存储过程:提供查询语句并返回查询执行影响的行数DELIMITER $$ DROP PROCEDURE IF EXISTS `p_get_select_row_number`$$ CREAT ...

  2. 优化sql,返回行数少情况下,NL比hash快好多

    sql如下 select t.id, t.value, tt.sort as sortno from ENGINEERING_TYPE t left join ENGINEERING_TYPE tt ...

  3. mysql sql获取上条插入id,update影响行数

    1.获取上条插入数据 LAST_INSERT_ID(); 2.获取update影响行数. ROW_COUNT(); mysql> UPDATE t -> SET address = 'be ...

  4. mybatis批量update,返回行数为-1

    mybatis批量更新返回结果为-1,是由于mybatis的defaultExExecutorType引起的,    它有三个执行器:SIMPLE 就是普通的执行器:REUSE 执行器会重用预处理语句 ...

  5. php mysql_affected_rows获取sql执行影响的行数

    php mysql_affected_rows函数用于获取执行某一SQL语句(如INSERT,UPDATE 或 DELETE )所影响的行数,本文章向大家介绍php mysql_affected_ro ...

  6. springMVC+mybatis 增删该操作后判断影响行数一直返回-2147482646

    MyBatis发现更新和插入返回值一直为"-2147482646"的错误是由defaultExecutorType设置引起的,如果设置为BATCH,更新返回值就会丢失.mybati ...

  7. 解析oracle的rownum,数据库查询结果返回行数设置

    对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀 ...

  8. linux 统计命令执行后的行数或者统计目录下文件数目

    ls |wc 是统计你这个目录下的文件数目.ls |wc -l是输出第一个结果即31即文件的数目.

  9. EF5中 执行 sql语句使用Database.ExecuteSqlCommand 返回影响的行数 ; EF5执行sql查询语句 Database.SqlQuery 带返回值

    一: 执行sql语句,返回受影响的行数 在mysql里面,如果没有影响,那么返回行数为  -1 ,sqlserver 里面  还没有测试过 using (var ctx = new MyDbConte ...

随机推荐

  1. 获得Version和Build版本号

    [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"] ?: [[NSBundle mainBu ...

  2. Mac的搜狗输入法和QQ输入法加入⌘⌥⌃⇧自定义短语

    搜狗输入法(Mac):http://pinyin.sogou.com/mac/ 创建名为『搜狗输入法自定义短语.ini』的文本文件(建议用Sublime Text),内容如下,然后偏好设置的自定义短语 ...

  3. hzau 1205 Sequence Number(二分)

    G. Sequence Number In Linear algebra, we have learned the definition of inversion number: Assuming A ...

  4. 【Prism】MEF版HelloWorld

    引言 Pirsm框架是由微软P & P小组设计的,用于构建组合式的WPF企业级应用,支持两个IOC容器,分别为Unity和MEF.官方地址为http://compositewpf.codepl ...

  5. AOP注解式拦截

    1. 自己定义的拦截注解 package com.spring.aop; import java.lang.annotation.Documented; import java.lang.annota ...

  6. pthread_cond_wait() 前使用 while 讲解

    pthread_cond_wait() 前使用 while 讲解 -- : LINUX环境下多线程编程肯定会遇到需要条件变量的情况,此时必然要使用pthread_cond_wait()函数.但这个函数 ...

  7. js1

    document.write('<h1>Hello World</h1>'); //写入网页 alert('Hello World'); console.log('Hello ...

  8. Linux之时间、地点、人物、事件、情节

    时间 date 显示当前时间 time cmd 显示 cmd的运行时间 地点 locate 根据文件名,迅速找到文件.基于系统构建的索引 find 根据各种规则找到文件,更强大,但比较慢 wherei ...

  9. [转]深入详解javascript之delete操作符

    最近重新温习JS,对delete操作符一直处于一知半解的状态,偶然发现一篇文章,对此作了非常细致深入的解释,看完有茅塞顿开的感觉,不敢独享,大致翻译如下. 原文地址:http://perfection ...

  10. spark远程调试

    基本流程1.远程运行spark,打开Spark master机器的JVM的jdwp,让其阻塞监听指定端口(8888),让其有终端向指定端口发送特定请求再执行:2.IntelliJ配置socket远程连 ...