文档章节

(useAffectedRows)Mysql / Mybatis update时,字段不变返回值的问题

NullException
 NullException
发布于 2017/07/24 11:12
字数 896
阅读 291
收藏 0

MySQL

当执行一句update语句,但修改内容与原数据一致时,mysql本神返回的  受影响行数为0 ,在 控制台或者 客户端如navicat中都可看到

但jdbc/mybatis 返回的却是1,返回的是 sql语句 的匹配行数。

 

Oracle直接返回1条记录被更新。

所以很明显,不同数据update的机制是不一样的。

但是针对标准SQL,不涉及具体数据库,update t_order set order_mark = 2 where order_id=1555肯定是会操作一条记录,所以你可以理解通过jdbc执行update返回的是操作记录数,而不是影响记录数

 

 

使用spring,mbatis更新数据时如果数据前后相同,会返回1
在使用客户端时,如果数据相同,返回值为0
返回不一样,不知道为什么会是这样?

找到原因了
Found MySQL specific workaround. If someone is curious - useAffectedRows option for jdbc url, e.g. 
jdbc:mysql://${jdbc.host}/${jdbc.db}?useAffectedRows=true

useAffectedRows的含义 :是否用受影响的行数替代查找到的行数来返回数据,也就是查找到了 但却不一定真正修改了

JDBC默认返回的是符合的行数Rows matched, 如果想返回修改过( Changed)的行数  ,需要使用useAffectedRows参数

附上该参数修改方式:

 

遇到MySQL中on duplicate key update语句返回值不正确:

在server5.1.*的返回分别为insert=1,update=3,nochange=2

在server5.5.*的返回分别为insert=1,update=2,nochange=1

应返回:insert=1,update=2,nochange=0

使用mysql-connector-java-*.jar不当导致。修正为:jdbc:mysql://ip:port/db?useAffectedRows=true&…

useAffectedRows的含义 :是否用受影响的行数替代查找到的行数来返回数据,也就是查找到了 但却不一定真正修改了

 

其他常见常用参数:

UsePerformanceMonitor,userperfmon, perfmon:是否启用性能监视,默认 false

IgnorePrepare:    是否忽略 Prepare() 调用,默认 true

UseProcedureBodies,procedure bodies:是否检查存储过程体、参数的有效性,默认 true

AutoEnlist:    是否自动使用活动的连接,默认 true

TreatTinyAsBoolean:是否将 TINYINT(1) 列视为布尔型,默认 true

AllowUserVariables:是否允许 SQL 中出现用户变量,默认 false

FunctionsReturnString:所有服务器函数是否按返回字符串处理,默认 false

UseAffectedRows:是否用受影响的行数替代查找到的行数来返回数据,默认 false

Keepalive:    保持 TCP 连接的秒数,默认0,不保持。

ConnectionLifeTime:连接被销毁前在连接池中保持的最少时间(秒)。默认 0

Pooling:    是否使用线程池,默认 true

MinimumPoolSize, min pool size:线程池中允许的最少线程数,默认 0

MaximumPoolSize,max pool size:线程池中允许的最多线程数,默认 100

ConnectionReset:连接过期后是否自动复位,默认 false

CharacterSet, charset:向服务器请求连接所使用的字符集,默认:无

 

当执行一句update语句,但修改内容与原数据一致时,mysql本神返回的  受影响行数为0 ,在 控制台或者 客户端如navicat中都可看到 但jdbc/mybatis 返回的却是1,返回的是 sql语句 的匹配行数。

 

参考:http://blog.csdn.net/sxwehren/article/detail

本文转载自:http://blog.csdn.net/z69183787/article/details/53144681

NullException
粉丝 0
博文 2
码字总数 228
作品 0
浦东
程序员
私信 提问
mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey

mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的...

飞翼
2016/12/28
324
0
Mybatis深度整合Mysql的Json字段 - extcol

概述 以前当业务数据结构变化时,往往需要采用的方案是: 修改表结构增加字段 遇到数据结构有list结构时,新建1对多的关联子表 用字典表表示字段的增加 以上方案对代码侵入性很强,同时与旧业...

杰睿宁
05/04
450
0
MyBatis:获取插入记录的自增主键

我们知道MySql中主键可以设成auto_increment,也就是自增主键,每当新增一条记录,主键值自动加1。 在MyBatis中,执行insert,返回值为受影响的语句行数,此操作跟JDBC一致。 但是如果应用中...

kolbe
2015/09/30
3.9K
1
MYSQL无重复插入数据更新语法&sql一句话使insert时若主键重复则更新

我来说两句 收藏 我要投稿 MYSQL无重复插入数据更新语法&sql一句话使insert时若主键重复则更新 如果你指定了ON DUPLICATE KEY UPDATE命令语句,那么在唯一索引或者主索引的作用下将不插入与数...

碧海潮生曲
2013/03/02
434
0
Oracle数据库批量foreach涉及union all插入自增长主键实现方案

事件发生的背景同动弹同步,我接到了一个把我的项目从mysql迁移到oracle数据库的噩耗。本来以为这事件麻烦的事儿,但是实际情况比我想的麻烦的多。 顺便总结一下我换库遇到的种种问题: 1、m...

Pig-man
2016/11/26
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
6
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部