Mybatis的批处理以及执行Update返回行数为负数
2018-01-17 09:41
381 查看
项目中用到了批量更新。
下面先记一下批处理映射吧:
mybatis批量删除
[b] [/b]此处的maps接口中的@Param值对应,属于自定义变量。[b] [/b]
[b] mybatis批量更新[/b]
说说遇到到问题:
获取mybatis的update行数,总是返回负数。后来在官网上找到原因,是由于defaultExecutorType的引起的,defaultExecutorType有三个执行器SIMPLE、REUSE和BATCH。其中BATCH可以批量更新操作缓存SQL以提高性能,但是有个缺陷就是无法获取update、delete返回的行数。defaultExecutorType的默认执行器是SIMPLE。
由于项目配置中启用了BATCH执行器,UPDATE和DELETE返回的行数就丢失了,把执行器改为SIMPLE即可。
其实这个在我的项目中是没效果的,应该以后会有用吧,先记下来。
我的项目目前没找到好的解决办法,只能用try..catch来解决了,=.=|
在开发当中,可能经常会遇到批量处理这种情况,一般都再在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>
[b] [/b]此处的maps接口中的@Param值对应,属于自定义变量。[b] [/b]
void removeProductAgent(@Param("maps")Map<String, Object> map);
[b] mybatis批量更新[/b]
<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返回行数为负数
- Mybatis执行Update返回行数为负数
- Mybatis执行Update返回行数为负数
- Mybatis执行update,insert等语句返回的不是受影响的行数
- mysql执行preparedStatement.executeUpdate时,只返回changedRows的行数,不返回涉及到的行数的办法
- 或操作(||)和与操作(&&)的执行顺序以及返回结果
- onNewIntent何时会被执行 以及 Android任务和返回栈解析
- java mybatis 执行 sqlserver存储过程 xml 以及实现类
- mybatis学习之查询结果返回List以及Map
- Java MyBatis 插入数据库返回主键 总返回行数
- 传值设置mybatis查询的 列名(字段名),以及如何查看mybatis中执行的SQL语句
- 注解写法mybatis 传List类型参数以及返回List类型参数
- mybatis插入语句执行后返回结果
- Android系统Recovery工作原理之使用update.zip升级过程---updater-script脚本语法简介以及执行流程(转)
- MyBatis中,传String类型参数到xml配置文件,并执行SQL语句后返回String类型的结果写法(jeesite)
- 如何在mybatis中一个insert,delete,update中执行多条SQL语句
- mybatis中update执行多次
- mybatis学习笔记 一对一 和一对多 以及 如何通过框架直接返回主键id
- mysql 存储过程:提供查询语句并返回查询执行影响的行数
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程