为了账号安全,请及时绑定邮箱和手机立即绑定

疑问: 数据库进行更新时 当数据数据相同时 全字段更新和单字段更新是否有区别

疑问: 数据库进行更新时 当数据数据相同时 全字段更新和单字段更新是否有区别

慕码人2483693 2019-02-19 12:02:20
起因是我的代码中更新方法和同事写的不一样数据层用的mybatis,数据库用的mysql我的写法 Student s= studentDao.selectById("123"); .......//业务操作 Student sTemp = new Student(); sTemp.setId("123"); sTemp.setSex(0); studentDao.update(sTemp); 然后我同事是这么写的 Student s= studentDao.selectById("123"); .......//业务操作 s.setId("123"); s.setSex(0); studentDao.update(s); 那么这里有个问题在mybaits中是判断这个字段有就会加上更新语句数据库原数据 id name sex weight 123 张三 1 120 比如这两段代码执行完成后我的sql update Student set sex=0 where id='123'; 我同事的sql update Student set name="张三",sex=0,weight="120" where id='123'; 我的做法弊端在于 new了一个对象我自己的想法是为了节约全字段更新数据的sql执行时间,还有mybatis的的sql拼接 问题1:数据相同时这两种sql有没有性能差异?我实际测试的时候好像并没有看出有差异,希望有人能告诉我原理 问题2:以上两种方法到底哪种方法才是正确的
查看完整描述

4 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

首先new不new不是关键,当然这个new是没必要的,关键是你的映射文件是如何写的。
建议是需要更新的字段才出现的sql中。

建议你使用mbg, 会自动生成updateByPrimaryKeySelective这种方法,只更新有值的字段。

查看完整回答
反对 回复 2019-03-01
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

楼上大致正确,但是
1.前者也是通用的,但要多写一些 setXXX 的代码;

2.第二种方式在并发情况下容易导致前面的update失效,除非整个过程加锁:
请求1:
update Student set name="李四";
请求2:
update Student set name="张三",sex=0,weight="120" where id='123';

期望结果:
name="李四",sex=0,weight="120" where id='123'
实际结果:
"张三",sex=0,weight="120" where id='123'

原因:
请求2 setXXX 时,请求1正在执行SQL语句update1,这时候MySQL会加锁。
等到update1执行完后,请求2的SQL语句update2再执行,导致原本update1修改后的
name="李四"又被update2改回了name="张三"。

所以如果要用完整更新,请求2必须在setXXX前加锁,让update1在update2完成后才执行,这样才能避免并发情况下导致前面的update失效的问题。

查看完整回答
反对 回复 2019-03-01
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

写个通用的更新sql,可以用mybatis的条件语句,传值也是传多个值,然后不需要更新的值传null,这样可以避免更新的时候new一个对象,也可以避免没有改动的数据也修改,不过可能字段多了,但是某时只需改一个字段的时候多个参数值为null,不大美观。

查看完整回答
反对 回复 2019-03-01
  • 4 回答
  • 0 关注
  • 873 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号