日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Fluent Mybatis 批量更新的使用

瀏覽:38日期:2023-10-18 11:27:55
目錄批量更新同一張表的數(shù)據(jù)更新多條數(shù)據(jù),每條數(shù)據(jù)都不一樣java中for循環(huán)實(shí)現(xiàn)方式一條SQL,服務(wù)端逐條更新mybatis實(shí)現(xiàn)方式使用FluentMybatis實(shí)現(xiàn)方式使用mysql的Case When then方式更新mybatis原生實(shí)現(xiàn)方式批量更新不同的表數(shù)據(jù)參考批量更新同一張表的數(shù)據(jù)更新多條數(shù)據(jù),每條數(shù)據(jù)都不一樣

背景描述

通常需要一次更新多條數(shù)據(jù)有兩個(gè)方式

在業(yè)務(wù)代碼中循環(huán)遍歷,逐條更新一次性更新所有數(shù)據(jù), 采用批量sql方式,一次執(zhí)行。

更準(zhǔn)確的說(shuō)是一條sql語(yǔ)句來(lái)更新所有數(shù)據(jù),逐條更新的操作放到數(shù)據(jù)庫(kù)端,在業(yè)務(wù)代碼端展現(xiàn)的就是一次性更新所有數(shù)據(jù)。

這兩種方式各有利弊,程序中for循環(huán)實(shí)現(xiàn)就不說(shuō)了,這里主要介紹第二種方式在fluent mybatis中的實(shí)現(xiàn),以及和mybatis實(shí)現(xiàn)的對(duì)比。

java中for循環(huán)實(shí)現(xiàn)方式

public class UpdateBatchTest extends BaseTest { @Autowired private StudentMapper mapper; @Test public void testBatchJavaEach() {/** 構(gòu)造多個(gè)更新 **/List<IUpdate> updates = this.newListUpdater();for (IUpdate update : updates) { mapper.updateBy(update);} }/** * 構(gòu)造多個(gè)更新操作 */ private List<IUpdate> newListUpdater() {StudentUpdate update1 = new StudentUpdate() .update.userName().is('user name23').end() .where.id().eq(23L).end();StudentUpdate update2 = new StudentUpdate() .update.userName().is('user name24').end() .where.id().eq(24L).end();return Arrays.asList(update1, update2); }}

這種方式在大批量更新時(shí), 最大的問(wèn)題就是效率,逐條更新,每次都會(huì)連接數(shù)據(jù)庫(kù),然后更新,再釋放連接資源。

一條SQL,服務(wù)端逐條更新mybatis實(shí)現(xiàn)方式

通過(guò)mybatis提供的循環(huán)標(biāo)簽,一次構(gòu)造多條update的sql,一次提交服務(wù)器進(jìn)行執(zhí)行。

<update parameterType='java.util.List'> <update parameterType='java.util.List'><foreach collection='list' item='item' index='index' open='' close='' separator=';'> update student <set>user_name=#{item.userName} </set> where id = #{item.id}</foreach> </update> </update>

定義Mapper

public interface StudentBatchMapper { void updateStudentBatch(List list);}

執(zhí)行測(cè)試驗(yàn)證

public class UpdateBatchTest extends BaseTest { @Autowired private StudentBatchMapper batchMapper; @Test public void updateStudentBatch() {List<StudentEntity> students = Arrays.asList( new StudentEntity().setId(23L).setUserName('user name23'), new StudentEntity().setId(24L).setUserName('user name24'));batchMapper.updateStudentBatch(students);/** 驗(yàn)證SQL參數(shù) **/db.table(ATM.table.student).query().eqDataMap(ATM.dataMap.student.table(2) .id.values(23L, 24L) .userName.values('user name23', 'user name24')); }}使用FluentMybatis實(shí)現(xiàn)方式

使用fluent mybatis進(jìn)行批量更新很簡(jiǎn)單,只需要在#updateBy方法中傳入 IUpdate數(shù)組即可

public class UpdateBatchTest extends BaseTest { @Autowired private StudentMapper mapper; @DisplayName('批量更新同一張表') @Test public void testUpdateBatch_same() {IUpdate[] updates = this.newListUpdater().toArray(new IUpdate[0]);mapper.updateBy(updates);/** 驗(yàn)證SQL語(yǔ)句 **/db.sqlList().wantFirstSql().eq('' +'UPDATE student SET gmt_modified = now(), user_name = ? WHERE id = ?; ' +'UPDATE student SET gmt_modified = now(), user_name = ? WHERE id = ?' , StringMode.SameAsSpace);/** 驗(yàn)證SQL參數(shù) **/db.table(ATM.table.student).query().eqDataMap(ATM.dataMap.student.table(2) .id.values(23L, 24L) .userName.values('user name23', 'user name24')); }}

要實(shí)現(xiàn)批量更新,首先得設(shè)置mysql支持批量操作,在jdbc url鏈接中附加&allowMultiQueries=true屬性

例如:

jdbc:mysql://localhost:3306/testdb?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true使用mysql的Case When then方式更新

UPDATE student SET gmt_modified = now(),address = case id when 1 then ’address 1’ when 2 then ’address 2’ when 3 then ’address 3’ endWHERE id in (1, 2, 3)

上面的sql語(yǔ)句使用mysql的case when then語(yǔ)法實(shí)現(xiàn)的批量更新3條記錄,并且根據(jù)id的值不同,設(shè)置不同的address值。

mybatis原生實(shí)現(xiàn)方式

如果使用mybatis的xml語(yǔ)法來(lái)實(shí)現(xiàn),xml文件就需要表達(dá)為下面方式:

xml文件

<update parameterType='list'> update student <trim prefix='set' suffixOverrides=','><trim prefix='address =case id' suffix='end,'> <foreach collection='list' item='item' index='index'><if test='item.id!=null'> when #{item.id} then #{item.address}</if> </foreach></trim> </trim> <trim prefix='age =case id' suffix='end,'><foreach collection='list' item='item' index='index'> <if test='item.id!=null'>when #{item.id} then #{item.age} </if></foreach> </trim> where id in <foreach collection='list' item='item' index='index' separator=',' open='(' close=')'>#{item.id} </foreach></update>

定義Mapper

public interface StudentBatchMapper { int updateBatchByIds(List<StudentEntity> list);}

驗(yàn)證

public class CaseFuncTest extends BaseTest { @Autowired private StudentBatchMapper batchMapper; @Test public void test_mybatis_batch() {batchMapper.updateBatchByIds(Arrays.asList( new StudentEntity().setId(1L).setAddress('address 1').setAge(23), new StudentEntity().setId(2L).setAddress('address 2').setAge(24), new StudentEntity().setId(3L).setAddress('address 3').setAge(25)));/** 驗(yàn)證執(zhí)行的SQL語(yǔ)句 **/db.sqlList().wantFirstSql().eq('' +'update student ' +'set address =case id when ? then ? when ? then ? when ? then ? end, ' +'age =case id when ? then ? when ? then ? when ? then ? end ' +'where id in ( ? , ? , ? )' , StringMode.SameAsSpace); }}

使用Fluent Mybatis實(shí)現(xiàn)方式

public class CaseFuncTest extends BaseTest { @Autowired private StudentMapper mapper; @Test public void test_fluentMybatisBatch() throws Exception {final String CaseWhen = 'case id ' + 'when 1 then ? ' + 'when 2 then ? ' + 'else ? end';StudentUpdate update = new StudentUpdate() .update.address().applyFunc(CaseWhen, 'address 1', 'address 2', 'address 3') .set.age().applyFunc(CaseWhen, 23, 24, 25) .end() .where.id().in(new int[]{1, 2, 3}).end();mapper.updateBy(update);/** 驗(yàn)證執(zhí)行的SQL語(yǔ)句 **/db.sqlList().wantFirstSql() .eq('UPDATE student ' + 'SET gmt_modified = now(), ' + 'address = case id when 1 then ? when 2 then ? else ? end, ' + 'age = case id when 1 then ? when 2 then ? else ? end ' + 'WHERE id IN (?, ?, ?)',StringMode.SameAsSpace); }}

只需要在applyFunc中傳入case when語(yǔ)句,和對(duì)應(yīng)的參數(shù)(對(duì)應(yīng)case when語(yǔ)句中的預(yù)編譯占位符’?’)

如果業(yè)務(wù)入口傳入的是Entity List或者M(jìn)ap List,可以使用java8的stream功能處理成數(shù)組,示例如下:

public class CaseFuncTest extends BaseTest { @Autowired private StudentMapper mapper; @Test public void test_fluentMybatisBatch2() throws Exception {List<StudentEntity> students = Arrays.asList( new StudentEntity().setId(1L).setAddress('address 1').setAge(23), new StudentEntity().setId(2L).setAddress('address 2').setAge(24), new StudentEntity().setId(3L).setAddress('address 3').setAge(25));final String CaseWhen = 'case id ' + 'when 1 then ? ' + 'when 2 then ? ' + 'else ? end';StudentUpdate update = new StudentUpdate() .update.address().applyFunc(CaseWhen, getFields(students, StudentEntity::getAddress)) .set.age().applyFunc(CaseWhen, getFields(students, StudentEntity::getAge)) .end() .where.id().in(getFields(students, StudentEntity::getId)).end();mapper.updateBy(update);// 驗(yàn)證SQL語(yǔ)句db.sqlList().wantFirstSql() .eq('UPDATE student ' + 'SET gmt_modified = now(), ' + 'address = case id when 1 then ? when 2 then ? else ? end, ' + 'age = case id when 1 then ? when 2 then ? else ? end ' + 'WHERE id IN (?, ?, ?)',StringMode.SameAsSpace);// 驗(yàn)證參數(shù)db.sqlList().wantFirstPara() .eqReflect(new Object[]{'address 1', 'address 2', 'address 3', 23, 24, 25, 1L, 2L, 3L}); } private Object[] getFields(List<StudentEntity> students, Function<StudentEntity, Object> getField) {return students.stream().map(getField).toArray(Object[]::new); }}

使用Fluent Mybatis無(wú)需額外編寫(xiě)xml文件和mapper(使用框架生成的Mapper文件就夠了)。在業(yè)務(wù)邏輯上不至于因?yàn)橛蓄~外的xml文件,而產(chǎn)生割裂感。

批量更新不同的表數(shù)據(jù)

上面的例子使用mybatis和fluent mybatis演示的如果通過(guò)不同方法批量更新同一張表的數(shù)據(jù),在fluent mybatis的更新其實(shí)不限定于同一張表,

在#updateBy(IUpdate... updates)函數(shù)可以傳入任意表更新.

public class UpdateBatchTest extends BaseTest { @Autowired private StudentMapper mapper; @DisplayName('批量更新不同表') @Test public void testUpdateBatch_different() {StudentUpdate update1 = new StudentUpdate() .update.userName().is('user name23').end() .where.id().eq(23L).end();HomeAddressUpdate update2 = new HomeAddressUpdate() .update.address().is('address 24').end() .where.id().eq(24L).end();/** 執(zhí)行不同表的批量更新 **/mapper.updateBy(update1, update2); /** 驗(yàn)證實(shí)際執(zhí)行的預(yù)編譯SQL語(yǔ)句**/db.sqlList().wantFirstSql().eq('' +'UPDATE student SET gmt_modified = now(), user_name = ? WHERE id = ?; ' +'UPDATE home_address SET gmt_modified = now(), address = ? WHERE id = ?', StringMode.SameAsSpace);db.table(ATM.table.student).query().eqDataMap(ATM.dataMap.student.table(2) .id.values(23L, 24L) .userName.values('user name23', 'user'));/** 驗(yàn)證實(shí)際執(zhí)行預(yù)編譯SQL入?yún)⒅?**/db.table(ATM.table.homeAddress).query().eqDataMap(ATM.dataMap.homeAddress.table(2) .id.values(23, 24) .address.values('address', 'address 24')); }}

示例更新了2張表: student 和 home_address

參考

Fluent MyBatis地址Fluent MyBatis文檔

到此這篇關(guān)于Fluent Mybatis 批量更新的使用的文章就介紹到這了,更多相關(guān)Fluent Mybatis 批量更新內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费精品一区| 日本中文字幕一区二区| 日韩av一级| 欧美特黄一级| 日韩黄色在线观看| 国产一区二区三区91| 欧美日韩免费看片| 最新亚洲一区| 亚洲日本在线观看视频| 欧美国产另类| 亚洲男女av一区二区| 午夜久久av| 久久精品国产亚洲一区二区三区| 日韩免费在线| 午夜天堂精品久久久久| 国产一区二区三区四区大秀| 亚洲成人二区| 日韩精品欧美精品| 免费观看亚洲| 欧美激情一区| 久久先锋影音| 欧美视频一区| 都市激情国产精品| 神马久久午夜| 亚洲免费网址| 国产欧美一区二区三区米奇| 日韩国产专区| 亚洲精品乱码| 欧美aa一级| 青草国产精品| 自拍日韩欧美| 精品国产一区二区三区性色av| 激情自拍一区| 国产精品中文字幕制服诱惑| 欧美日韩精品在线一区| 欧美一区网站| 亚洲国产一区二区三区在线播放| 国产精品亚洲欧美日韩一区在线 | 高清一区二区三区| 中文在线一区| 日韩av有码| 欧美一级一区| 亚洲精品1区2区| 中文一区一区三区高中清不卡免费| 日韩综合一区二区三区| 激情综合激情| 黄色精品视频| 日韩精品免费观看视频| 日本免费久久| 国产精选久久| 亚洲视频国产| 久久久国产精品一区二区中文| 欧美亚洲福利| 国产亚洲精品自拍| 日产精品一区| 久久精品 人人爱| 欧美日韩视频一区二区三区| 97精品国产一区二区三区| 日本视频在线一区| 欧美日韩国产一区精品一区| 欧美国产偷国产精品三区| 国产精品最新| 日本一区二区中文字幕| 久久精品国产亚洲夜色av网站 | 亚洲一区二区动漫| 欧美aa在线观看| 精品国产中文字幕第一页| 日韩精品福利一区二区三区| 亚洲女人av| 女人天堂亚洲aⅴ在线观看| 日韩免费在线| 国产一区二区三区国产精品| 国产香蕉精品| 日韩精品免费一区二区夜夜嗨 | 亚洲ww精品| 日韩精品一卡二卡三卡四卡无卡| 视频福利一区| 国产不卡人人| 国产高潮在线| 国产精品成久久久久| 精品国产91| 日韩不卡一区| 国产一区精品福利| 国精品产品一区| 国产一区福利| 福利精品一区| 色爱综合网欧美| 日韩中文在线电影| 中文字幕在线官网| 人在线成免费视频| 日韩精品诱惑一区?区三区| 美女视频网站久久| 国产精品xxx在线观看| 国产图片一区| 美女视频免费精品| 日韩av专区| 日韩欧美一区二区三区免费观看| 吉吉日韩欧美| 99国产精品一区二区| 久久国产中文字幕| 亚洲激情欧美| 亚洲精选91| 久久国内精品自在自线400部| 欧美日韩一区自拍| 国产精品久久乐| 麻豆视频观看网址久久| 蜜桃精品视频| 日韩88av| 999久久久精品国产| 亚洲激情中文| 亚洲一区二区日韩| 日韩欧美中文字幕一区二区三区| 国产日韩中文在线中文字幕 | 亚洲一区中文| 男女激情视频一区| 日韩精品亚洲专区| 国产精品s色| 日韩av中文在线观看| 欧美日韩一区二区国产| 日本久久一区| 国产免费播放一区二区| 亚洲女同中文字幕| 麻豆精品视频在线观看视频| 国产精品亚洲二区| 欧美精品第一区| 捆绑调教美女网站视频一区| 精品午夜av| 亚洲激情中文在线| 国产乱码午夜在线视频| 亚洲精品国产偷自在线观看| 日韩精品视频一区二区三区| 久久99久久人婷婷精品综合| 四虎4545www国产精品| 午夜在线播放视频欧美| 亚洲精品福利| 久久永久免费| 五月天久久777| 在线精品视频一区| 欧美天堂一区| 亚洲国产影院| 日韩av有码| 91精品国产福利在线观看麻豆| 欧美日韩激情| 日韩在线视频一区二区三区| 国产精品美女久久久久久不卡 | 久久精品国产999大香线蕉| 日韩大片在线| 亚洲精品网址| 视频一区二区三区入口| 欧美日韩a区| 麻豆成全视频免费观看在线看| 激情视频一区二区三区| 亚洲乱码视频| 福利一区和二区| 视频一区二区三区在线| 精品免费视频| 午夜在线视频观看日韩17c| 久久av资源| 尤物在线精品| 精品视频亚洲| 日韩在线卡一卡二| 福利一区二区免费视频| 日韩精品一卡二卡三卡四卡无卡| 国产日韩视频| 久久香蕉国产| 欧美国产专区| 少妇精品久久久一区二区三区| 亚洲人成网77777色在线播放| 久久字幕精品一区| 91成人精品| 国产精品亚洲综合在线观看| 精品捆绑调教一区二区三区| 亚洲三级国产| av日韩中文| 亚洲欧洲国产精品一区| 精品国产亚洲一区二区三区大结局| 国产伦理久久久久久妇女| 日韩视频一二区| 久久裸体视频| 国产日韩欧美三区| 日韩一区欧美二区| 久久视频精品| 精品国产成人| 日韩黄色免费网站| 日韩午夜一区| 美女一区网站| 国产精成人品2018| 免费精品视频在线| 91精品一区二区三区综合| 国产精品美女在线观看直播| 丝袜国产日韩另类美女| 四虎4545www国产精品 | 国产亚洲精品精品国产亚洲综合| 狠狠色综合网| 亚洲va中文在线播放免费| 欧美激情日韩| 欧美色综合网| 日韩亚洲精品在线观看| 天堂va蜜桃一区二区三区| 不卡视频在线|