起因是我的代碼中更新方法和同事寫的不一樣
數(shù)據(jù)層用的mybatis,數(shù)據(jù)庫用的mysql
我的寫法
Student s= studentDao.selectById("123");
.......//業(yè)務操作
Student sTemp = new Student();
sTemp.setId("123");
sTemp.setSex(0);
studentDao.update(sTemp);
然后我同事是這么寫的
Student s= studentDao.selectById("123");
.......//業(yè)務操作
s.setId("123");
s.setSex(0);
studentDao.update(s);
那么這里有個問題在mybaits中是判斷這個字段有就會加上更新語句
數(shù)據(jù)庫原數(shù)據(jù)
id name sex weight
123 張三 1 120
比如這兩段代碼執(zhí)行完成后
我的sql
update Student set sex=0 where id='123';
我同事的sql
update Student set name="張三",sex=0,weight="120" where id='123';
我的做法弊端在于 new了一個對象
我自己的想法是為了節(jié)約全字段更新數(shù)據(jù)的sql執(zhí)行時間,還有mybatis的的sql拼接
問題1:
數(shù)據(jù)相同時這兩種sql有沒有性能差異?我實際測試的時候好像并沒有看出有差異,希望有人能告訴我原理
問題2:
以上兩種方法到底哪種方法才是正確的
可以看看這里
后端好書閱讀與推薦(續(xù)二) - QueenKing - SegmentFault
https://segmentfault.com/a/11...
更新有兩種方式,一種是通用性更新:從數(shù)據(jù)庫獲得完整對象,然后修改這個對象,然后保存,另一種是針對性更新:直接按條件修改數(shù)據(jù)庫中一些對象的某些字段。前者的好處在于通用,可以將前臺傳來的表單無論修改了那個字段都可以直接保存,無需更多拼湊,修改任何字段的方法都是相同的,便于統(tǒng)一處理,后者的好處在于性能更好,因為節(jié)省了許多不必要字段的傳遞,而且允許原子性更新,比如inc
樓上大致正確,但是
1.前者也是通用的,但要多寫一些 setXXX 的代碼;
2.第二種方式在并發(fā)情況下容易導致前面的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正在執(zhí)行SQL語句update1,這時候MySQL會加鎖。
等到update1執(zhí)行完后,請求2的SQL語句update2再執(zhí)行,導致原本update1修改后的
name="李四"又被update2改回了name="張三"。
所以如果要用完整更新,請求2必須在setXXX前加鎖,讓update1在update2完成后才執(zhí)行,這樣才能避免并發(fā)情況下導致前面的update失效的問題。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術與教育服務機構,發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網(wǎng)
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。