Mybatis执行Update返回行数为负数的问题

目录
  • Mybatis执行Update返回行数为负数
    • 在官网上找到原因
  • Mybatis Update返回值
    • 对应的java程序打印数字

Mybatis执行Update返回行数为负数

获取mybatis的update行数,总是返回负数。

在官网上找到原因

是由于defaultExecutorType的引起的,defaultExecutorType有三个执行器SIMPLE、REUSE和BATCH。

其中BATCH可以批量更新操作缓存SQL以提高性能,但是有个缺陷就是无法获取update、delete返回的行数。defaultExecutorType的默认执行器是SIMPLE。

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

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

通过查看源码可以发现,batch执行器返回的是最大批量执行条数:

public static final int BATCH_UPDATE_RETURN_VALUE = Integer.MIN_VALUE + 1002;
public int doUpdate(MappedStatement ms, Object parameterObject) throws SQLException {
    final Configuration configuration = ms.getConfiguration();
    final StatementHandler handler = configuration.newStatementHandler(this, ms, parameterObject, RowBounds.DEFAULT, null, null);
    final BoundSql boundSql = handler.getBoundSql();
    final String sql = boundSql.getSql();
    final Statement stmt;
    if (sql.equals(currentSql) && ms.equals(currentStatement)) {
      int last = statementList.size() - 1;
      stmt = statementList.get(last);
      BatchResult batchResult = batchResultList.get(last);
      batchResult.addParameterObject(parameterObject);
    } else {
      Connection connection = getConnection(ms.getStatementLog());
      stmt = handler.prepare(connection);
      currentSql = sql;
      currentStatement = ms;
      statementList.add(stmt);
      batchResultList.add(new BatchResult(ms, sql, parameterObject));
    }
    handler.parameterize(stmt);
    handler.batch(stmt);
    return BATCH_UPDATE_RETURN_VALUE;
  }
<?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>

Mybatis Update返回值

mybatis sql:

<update id="test" parameterType="map">
        update test_0731 set name = #{params.name}, age = #{params.age} where id = ${params.id}
    </update>

对应的java程序打印数字

(1)确实更新了某些字段的值

表数据:

提交的数据:更新id为1的记录,

返回的值是1,表示一条被更改

(2)被update但是update前后的数据是一样的

继续发送这个,数据,前后的数据一样

发现虽然没影响到值,但是返回的值还是1。

(3) 没有匹配任何数据

请求的数据如下:

此时id为2,返回的数字是0。

所以update返回值是指match匹配到,而执行update语句的数量。

update返回值也是可以为boolean类型,当返回值为0时对应的boolean类型就是false, 如果不为零就是返回true

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Mybatis Update操作返回值问题

    后端的数据持久化使用的是 Mybatis ,在做高并发下账户增减余额的时候,打算使用乐观锁来解决这个问题.在获取update操作的返回值时遇到了一个问题,似乎 Mybatis 进行 update 操作得到的 int 返回值并不是影响的行数.这下就尴尬了. 一般而言,我们知道当我们使用 Mybatis 在 mapper 接口中定义 insert delete 等操作,定义一个 int 类型的返回值,通过该值是否为 0 来判断数据库中受影响的行数进而判断操作是否成功. 到底 update 返回值代表

  • mybatis update更新字段的使用操作

    多个mapper方法,更新单字段 说实话不太推荐,因为如果有10个字段要更新,难道写10个方法. 但是实际中很多人都这么写. 通用mapper方法,java代码控制字段 特点是一个mapper方法包含所有字段,不为空的就update. 但是需要控制入参,一般有2中方式: new 一个对象然后set id和要改的字段 如果字段多比较费劲,需要一个一个set. 查询出对象,然后set要改的字段 这2种方式差不多,就是代码看起来不一样. 特别注意,定位字段不要加if 要更新的字段加if没有什么问题 但

  • Mybatis执行update失败的解决

    Mybatis执行update失败 今天在进行分布式重构项目的时候碰到一个问题,在执行sql的时候只有update不能成功,其他语句都可以正常执行,报错如下: 版本:org.mybatis:mybatis:3.4.5 接口 @UpdateProvider(type = ManagerProvider.class, method = "updateManager") int updateManager(Manager manager) throws Exception; 报错信息 Loa

  • 解决Mybatis返回update后影响的行数问题

    主要在JDBC链接中加入这个参数即可: useAffectedRows=true 补充知识:mybatis批量update,返回行数为-1 mybatis批量更新返回结果为1,是由于mybatis的defaultExExecutorType引起的, 它有三个执行器:SIMPLE 就是普通的执行器:REUSE 执行器会重用预处理语句(prepared statements): BATCH 执行器将重用语句并执行批量更新. BATCH可以批量更新操作,缓存SQL以提高性能,缺陷就是无法获取updat

  • Mybatis执行Update返回行数为负数的问题

    目录 Mybatis执行Update返回行数为负数 在官网上找到原因 Mybatis Update返回值 对应的java程序打印数字 Mybatis执行Update返回行数为负数 获取mybatis的update行数,总是返回负数. 在官网上找到原因 是由于defaultExecutorType的引起的,defaultExecutorType有三个执行器SIMPLE.REUSE和BATCH. 其中BATCH可以批量更新操作缓存SQL以提高性能,但是有个缺陷就是无法获取update.delete返

  • mybatis执行update批量更新时报错的解决方案

    目录 执行update批量更新时报错 在使用Mybatis批量更新时 定义Mapper Dao接口中定义 最后在service中调用 同时执行多条sql的办法 执行update失败问题 说下原因 解决办法 执行update批量更新时报错 在使用Mybatis 批量更新时 想要批量更新时通常在mapper中这么写: 定义Mapper  Dao接口中定义 最后在service中调用 生成的sql直接放到mysql中运行完全没有问题,但是mybatis执行的时候却会报错: <span style=&quo

  • php使用PDO下exec()函数查询执行后受影响行数的方法

    本文实例讲述了php使用PDO下exec()函数查询执行后受影响行数的方法.分享给大家供大家参考,具体如下: exec()方法返回执行后受影响的行数. 语法:int PDO::exec(string statement) 提示: 参数statement是要执行的SQL语句.该方法返回执行查询时受影响的行数,通常用于insert,delete和update语句中.但不能用于select查询,返回查询结果. 为了验证这个提示,下面我分别对insert,delete,update,select 查询进

  • PHP中mysqli_affected_rows作用行数返回值分析

    本文实例分析了PHP中mysqli_affected_rows作用行数返回值.分享给大家供大家参考.具体分析如下: mysqli中关于update操作影响的行数可以有两种返回形式: 1. 返回匹配的行数 2. 返回影响的行数 默认情况下mysqli_affected_rows返回的值为影响的行数,如果我们需要返回匹配的行数,可以使用mysqli_real_connect函数进行数据库连接的初始化,并在函数的flag参数位加上: MYSQLI_CLIENT_FOUND_ROWS return nu

  • mybatis 有时update语句执行无效的解决方案

    目录 项目里mybatis有时update语句执行无效 解决办法 执行update语句后,数据没有被更新,也没有报错 问题描述 详细情况 解决办法 项目里mybatis有时update语句执行无效 公司测试人员在测试的时候发现,在积分系统,消费产生了积分,有时候,却不能加到用户累计积分上去. 明明积分流水记录跟用户积分的增加在一个事务当中的.积分流水记录生成成功,偏偏用户积分没有加上去?奇了怪了. 加积分的代码是: tMemberPointMapper.updateByPrimaryKeySel

  • mybatis执行批量更新batch update 的方法(oracle,mysql两种)

    Oracle和MySQL数据库的批量update在mybatis中配置不太一样: oracle数据库: <code class="hljs tcl" style=""><<span class="hljs-keyword" style="">update</span> id=<span class="hljs-string" style=""

  • 向数据库中插入数据并返回当前插入的行数及全局变量@@IDENTITY应用

    数据库中有张表User,字段是ID和Name,ID自增. 利用存储过程实现插入时返回当前的行数 复制代码 代码如下: CREATE PROC Proc_InsertUser @name nvarchar(100) AS INSERT INTO dbo.User( Name )VALUES(@name) SELECT @@IDENTITY AS ID 利用全局变量@@IDENTITY实现. 如果哪里有不正确的地方,欢迎批评指正,共同进步.

  • 解决mybatis执行SQL语句部分参数返回NULL问题

    今天在写代码的时候发现一个问题:mybatis执行sql语句的时候返回bean的部分属性为null,在数据库中执行该sql语句能够正常返回,把相关代码反反复复翻了个遍,甚至都重启eclipse了,依旧没解决问题,后来网上搜了一下,还真有类似的问题. 闲话少说,直接说问题,该sql语句是自己写的,resultType直接用了该bean全名称,最终导致部分属性显示为null, 原来的写法: <select id="selectByArticle" parametertype=&quo

随机推荐