mybatisupdate操作返回值问题

古灵精怪cat      2022-05-08     484

关键词:

  在获取update操作的返回值时遇到了一个问题,似乎 Mybatis 进行 update 操作得到的 int 返回值并不是影响的行数,下面通过本文给大家分享Mybatis Update操作返回值问题,需要的朋友参考下吧


 

后端的数据持久化使用的是 Mybatis ,在做高并发下账户增减余额的时候,打算使用乐观锁来解决这个问题。在获取update操作的返回值时遇到了一个问题,似乎 Mybatis 进行 update 操作得到的 int 返回值并不是影响的行数。这下就尴尬了。

一般而言,我们知道当我们使用 Mybatis 在 mapper 接口中定义 insert delete 等操作,定义一个 int 类型的返回值,通过该值是否为 0 来判断数据库中受影响的行数进而判断操作是否成功。

到底 update 返回值代表什么呢?我们来验证一下便知道了,假设有如下一张表以及两条数据:

技术图片

我们来编写一个简单的单元测试用例来验证下,首先使用 mybatis 简单的写个 mapper 进行更新操作,其中 xml 中的内容为:

技术图片

数据库连接配置为:

技术图片

接来下,我们来编写一个简单的单元测试来验证下: update 的返回值是不是受影响的记录的条数 ,对应的单元测试代码如下:

技术图片

由单元测试代码可以得知,我们将要把数据库中两条记录的 phone 字段的值由 12345678 修改为 66666666 ,正常情况下, resultCode 将会返回 2 。因为 update 操作影响到数据库中这 2 条记录,这和我们期望 2 是相符合的。那么一切正常的情况下,这次单元测试将会通过,那么我们运行看看结果:

技术图片

单元测试通过了,再查看数据库中的记录:

技术图片

这说明 mybatis 的 update 更新操作返回值的确是返回受影响的行数……真的是这样吗?

技术图片

我们知道,当数据库中的记录被修改之后,再次执行重复的 update 操作将不会影响到新的行数,为了验证我说的话,我们试试:

技术图片

那么,按照这个逻辑:我们再次执行这个单元测试应该是, resultCode 返回的应该是 0 ,和我们的期望的数字 2 不一致,将会导致测试不通过。再次运行单元测试:

技术图片

居然还是 passed ,看到这里聪明的你已经看出来了, 默认情况下,mybatis 的 update 操作返回值是记录的 matched 的条数,并不是影响的记录条数。

严格意义上来将,这并不是 mybatis 的返回值,mybatis 仅仅只是返回的数据库连接驱动(通常是 JDBC )的返回值,也就是说,如果驱动告知更新 2 条记录受影响,那么我们将得到 mybatis 的返回值就会是 2 和 mybatis 本身是没有关系的。

道理我都懂,如果我们非得要 mybatis 的 update 操作明确的返回受影响的记录条数,有没有什么办法呢?

当然是有的。

通过对 JDBC URL 显式的指定 useAffectedRows 选项,我们将可以得到受影响的记录的条数:

jdbc:mysql://${jdbc.host}/${jdbc.db}?useAffectedRows=true

我们对我们的数据库连接配置稍做修改,添加 useAffectedRows 字段:

技术图片

此时,mybatis 的 update 操作返回的应该是受影响的条数了,我们再次运行单元测试试试看:

技术图片

update 操作返回的是受影响的记录条数,我们知道为 0 和我们预期的 2 不一致,自然而然单元测试不通过咯~。

原文链接:https://www.jb51.net/article/123076.htm

 

mybatisupdate返回值怎么配置

你可以把defaultExecutorType值改了。有三个值:SIMPLE 普通返回。REUSE 重复。BATCH 批量更新。MyBatis发现更新和插入返回值一直为"-2147482646"的错误是由defaultExecutorType设置引起的,如果设置为batch,更新返回值就会丢... 查看详情

mybatisupdate语句问题(注解方式)

假设我有一个实体类User包含id,name,age,sex属性那么假设我只更新了sex属性,Mybatis是否能做到一个update(Useruser)方法中的语句只更新sex值,而不是所有值,如果有2个属性变化,则会更新这2个。参考技术A<updateid="放方法"param... 查看详情

mybatisupdate数据时无异常但没更新成功

没更新的问题原因:sqlSession.commit();没执行commit,但官方文档里有这样的描述:“默认情况下MyBatis不会自动提交事务,除非它侦测到有插入、更新或删除操作改变了数据库。”  源码:<updateid="updateTest"parameterType="cn.td.us... 查看详情

mybatisupdate/delete如何获取返回影响条数,在线坐等,直接配置resulttype和不配置都不行,谢谢

...回的结果不是真正更新的条数哇。。。谢谢哈 参考技术Bmybatisupdate/delete如何获取返回影响条数,在线坐等,直接配置resultType和不配置都不行。selectcount(1)fromtablewhere----,把你要更新或者删除的条件传入,查一下,那个就是影响的... 查看详情

mybatisupdate不生效

参考技术A你好,很高兴回答你的问题。不生效指的是什么呢,是执行后没有数据被更新吗?那可能是没有符合where条件的数据。如果有帮助到你,请点击采纳。 查看详情

实体框架返回值操作

】实体框架返回值操作【英文标题】:Entityframeworkreturnedvaluesmanipulation【发布时间】:2019-12-0114:19:22【问题描述】:这里是实体框架/MVC新手。编写我的第一个EF应用程序(api)。到目前为止一切顺利,我可以从数据库中检索行,但... 查看详情

返回一个数组在 C# 中操作原始值

】返回一个数组在C#中操作原始值【英文标题】:ReturninganArrayManipulatesOriginalValueinC#【发布时间】:2018-11-2823:36:17【问题描述】:这是我在网站上的第一个问题,我相信我会在这里找到答案。在学校,我尝试编写一些基本的C#编码... 查看详情

mfc线程操作waitformultipleobjects返回值

...led总是等于WAIT_TIMEOUT表示超时,怎样能不超时呢是读串口操作参考技术A检查硬件接线和发送包内容。追问硬件应该没有问题,因为其他程序能正常运行,发送也没有问题 查看详情

finally-操作返回值

Finally中操作返回值会出现一个问题?值没有被改变?1staticintM1()2{3intresult=100;4try5{6result=result+1;7//======引发异常的代码==========8intx=10,y=0;9Console.WriteLine(x/y);10//======引发异常的代码==========11returnresult;12}13catch14{ 查看详情

为啥不能将 WideString 用作互操作的函数返回值?

】为啥不能将WideString用作互操作的函数返回值?【英文标题】:WhycanaWideStringnotbeusedasafunctionreturnvalueforinterop?为什么不能将WideString用作互操作的函数返回值?【发布时间】:2012-03-1002:36:51【问题描述】:我曾不止一次建议人们... 查看详情

RXJS:返回外部 observable 的操作值

】RXJS:返回外部observable的操作值【英文标题】:RXJS:Returnthemanipulatedvalueofouterobservable【发布时间】:2018-09-1222:52:13【问题描述】:我试图调用两个observable,第二个的响应我操纵第一个,然后返回一个新的observable。returnthis.http.ge... 查看详情

使用 vbscript 自定义操作返回值/取消安装

】使用vbscript自定义操作返回值/取消安装【英文标题】:Returnavalue/cancelinstallationwithvbscriptcustomaction【发布时间】:2013-06-2623:03:27【问题描述】:我的安装程序中有一个自定义操作,它使用vbscript自定义操作打开一个消息框。<Cu... 查看详情

J2ME - 如何使线程返回一个值,并在该线程完成后,在其他操作中使用返回值?

...J2ME-如何使线程返回一个值,并在该线程完成后,在其他操作中使用返回值?【英文标题】:J2ME-Howtomakeathreadreturnavalueandafterthatthreadisfinished,usethereturnvalueinotheroperations?【发布时间】:2014-06-2301:14:58【问题描述】:我有一些关于线... 查看详情

使用 http 服务从操作 (NGXS) 中返回一个值

】使用http服务从操作(NGXS)中返回一个值【英文标题】:Returnavaluefromanaction(NGXS)withhttpservice【发布时间】:2020-01-0915:24:30【问题描述】:还有其他更简洁的方法可以通过操作(NGXS)从http服务返回值吗?还是我们应该始终更新“结果... 查看详情

尽管记录的值具有数字,但 Javascript 从“推送”操作返回稀疏数组

】尽管记录的值具有数字,但Javascript从“推送”操作返回稀疏数组【英文标题】:Javascriptreturningasparsearrayfrom"push"operationsdespitetheloggedvaluehavingnumbers【发布时间】:2018-08-1706:40:51【问题描述】:我正在研究我的回溯算法技... 查看详情

所有返回“字段 'id' 没有默认值”的元数据库操作

】所有返回“字段\\\'id\\\'没有默认值”的元数据库操作【英文标题】:AllMetabaseoperationsreturning"Field\'id\'doesn\'thaveadefaultvalue"所有返回“字段\'id\'没有默认值”的元数据库操作【发布时间】:2020-03-1717:40:35【问题描述】:... 查看详情

成功执行所有删除操作时返回布尔值 (true | false)

】成功执行所有删除操作时返回布尔值(true|false)【英文标题】:Returnboolean(true|false)valuewhenalldeleteoperationsaresuccessfullyperformed【发布时间】:2018-03-2420:50:32【问题描述】:我正在使用Sequelize、GraphQL和Typescript来编写代码。我有两个... 查看详情

Placement new 的返回值与其操作数的强制转换值之间是不是存在(语义)差异?

】Placementnew的返回值与其操作数的强制转换值之间是不是存在(语义)差异?【英文标题】:Istherea(semantic)differencebetweenthereturnvalueofplacementnewandthecastedvalueofitsoperand?Placementnew的返回值与其操作数的强制转换值之间是否存在(语义... 查看详情