广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Mybatis执行Update返回行数为负数的问题
  • 230
分享到

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

2024-04-02 19:04:59 230人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

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

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

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

--结束END--

本文标题: Mybatis执行Update返回行数为负数的问题

本文链接: https://www.lsjlt.com/news/158997.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作