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

您的位置:首頁技術文章
文章詳情頁

Fluent Mybatis 批量更新的使用

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

背景描述

通常需要一次更新多條數據有兩個方式

在業務代碼中循環遍歷,逐條更新一次性更新所有數據, 采用批量sql方式,一次執行。

更準確的說是一條sql語句來更新所有數據,逐條更新的操作放到數據庫端,在業務代碼端展現的就是一次性更新所有數據。

這兩種方式各有利弊,程序中for循環實現就不說了,這里主要介紹第二種方式在fluent mybatis中的實現,以及和mybatis實現的對比。

java中for循環實現方式

public class UpdateBatchTest extends BaseTest { @Autowired private StudentMapper mapper; @Test public void testBatchJavaEach() {/** 構造多個更新 **/List<IUpdate> updates = this.newListUpdater();for (IUpdate update : updates) { mapper.updateBy(update);} }/** * 構造多個更新操作 */ 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); }}

這種方式在大批量更新時, 最大的問題就是效率,逐條更新,每次都會連接數據庫,然后更新,再釋放連接資源。

一條SQL,服務端逐條更新mybatis實現方式

通過mybatis提供的循環標簽,一次構造多條update的sql,一次提交服務器進行執行。

<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);}

執行測試驗證

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);/** 驗證SQL參數 **/db.table(ATM.table.student).query().eqDataMap(ATM.dataMap.student.table(2) .id.values(23L, 24L) .userName.values('user name23', 'user name24')); }}使用FluentMybatis實現方式

使用fluent mybatis進行批量更新很簡單,只需要在#updateBy方法中傳入 IUpdate數組即可

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);/** 驗證SQL語句 **/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);/** 驗證SQL參數 **/db.table(ATM.table.student).query().eqDataMap(ATM.dataMap.student.table(2) .id.values(23L, 24L) .userName.values('user name23', 'user name24')); }}

要實現批量更新,首先得設置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語句使用mysql的case when then語法實現的批量更新3條記錄,并且根據id的值不同,設置不同的address值。

mybatis原生實現方式

如果使用mybatis的xml語法來實現,xml文件就需要表達為下面方式:

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);}

驗證

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)));/** 驗證執行的SQL語句 **/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實現方式

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);/** 驗證執行的SQL語句 **/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語句,和對應的參數(對應case when語句中的預編譯占位符’?’)

如果業務入口傳入的是Entity List或者Map List,可以使用java8的stream功能處理成數組,示例如下:

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);// 驗證SQL語句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);// 驗證參數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無需額外編寫xml文件和mapper(使用框架生成的Mapper文件就夠了)。在業務邏輯上不至于因為有額外的xml文件,而產生割裂感。

批量更新不同的表數據

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

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

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();/** 執行不同表的批量更新 **/mapper.updateBy(update1, update2); /** 驗證實際執行的預編譯SQL語句**/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'));/** 驗證實際執行預編譯SQL入參值 **/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文檔

到此這篇關于Fluent Mybatis 批量更新的使用的文章就介紹到這了,更多相關Fluent Mybatis 批量更新內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲一区二区三区中文字幕在线观看| 天堂av一区| 亚洲精品黄色| 久久aⅴ国产紧身牛仔裤| 国产专区一区| 国产精品av久久久久久麻豆网| 欧美日韩国产在线观看网站 | 国产毛片久久| 99热免费精品| 蜜臀精品久久久久久蜜臀| 免费中文字幕日韩欧美| 蜜桃视频第一区免费观看| 婷婷视频一区二区三区| 日韩一区二区三区免费视频| 欧美亚洲国产日韩| 欧美日本不卡高清| 精品国产成人| 久久精品影视| 石原莉奈一区二区三区在线观看| 日韩精彩视频在线观看| 国产精品日韩精品在线播放 | 国产成人精品福利| 日韩欧美一区二区三区在线观看 | 水蜜桃久久夜色精品一区| 国产综合色区在线观看| 亚洲女同中文字幕| 日韩动漫一区| 蜜臀国产一区| 石原莉奈在线亚洲二区| 国产精品丝袜在线播放| 亚洲精品.com| 午夜久久av | 欧美13videosex性极品| 日韩一区二区久久| 亚洲精品一区二区在线播放∴| 国产精品成人一区二区网站软件| 欧美男人天堂| 日韩在线中文| 日韩美女精品| 久久国产毛片| 日本a级不卡| 影视先锋久久| 久久国产精品色av免费看| 中文字幕高清在线播放| 亚洲午夜久久| 亚洲成av在线| 日韩国产高清在线| 亚洲国产专区| 国产精品99久久久久久董美香| 成人污污视频| 综合激情网站| 欧美一区久久久| 日韩精品免费一区二区夜夜嗨 | 国产精品av久久久久久麻豆网| 日本成人中文字幕| 人在线成免费视频| 日本亚洲欧美天堂免费| 欧美成人a交片免费看| 中文精品电影| 天堂а√在线最新版中文在线| 日本少妇精品亚洲第一区| 国产精品99一区二区三| 亚洲在线久久| 欧美日韩中文一区二区| 国产伦理一区| 日韩专区欧美专区| 国产高潮在线| 国产精品日本一区二区不卡视频| 狠狠色狠狠色综合日日tαg| 日韩.com| 欧美aa在线视频| 日韩一区二区三区在线看| 在线看片不卡| 国产麻豆久久| 精品久久不卡| 欧美1区2区3| 老牛国产精品一区的观看方式| 国产91在线播放精品| 日韩激情综合| 最新国产精品| 中文欧美日韩| 国产韩日影视精品| 成人看片网站| 欧美日韩在线观看首页| 精品午夜视频| 国产麻豆精品久久| 日本强好片久久久久久aaa| 六月婷婷一区| 中文亚洲欧美| 99在线|亚洲一区二区| 亚洲高清成人| www在线观看黄色| 国产一区二区三区日韩精品| 欧美a一区二区| 国产精品成人自拍| 日本特黄久久久高潮| 亚洲精品日韩久久| 中文字幕日韩高清在线| 视频在线观看一区| 亚洲综合不卡| 石原莉奈一区二区三区在线观看 | 日韩激情综合| 视频一区日韩| 视频一区二区不卡| 久久高清国产| 亚洲综合激情在线| 丝袜美腿成人在线| 亚洲欧洲美洲国产香蕉| 蜜桃传媒麻豆第一区在线观看| 免费人成精品欧美精品| 蜜桃一区二区三区在线观看| 久久国产高清| 最新国产精品| 欧美日韩在线精品一区二区三区激情综合 | 麻豆国产欧美一区二区三区| 国产精品亚洲综合在线观看| 国产日韩三级| 国产精品4hu.www| 国产成人免费| 日韩久久精品| 精品一区免费| 天堂成人免费av电影一区| 深夜福利一区| 国产精品一区二区精品| 精品日韩一区| 亚洲爱爱视频| 免费中文字幕日韩欧美| 日韩av中文字幕一区二区| 91精品国产自产精品男人的天堂| 欧美日韩午夜电影网| 精品九九在线| 久久亚洲专区| 亚洲乱码一区| 另类欧美日韩国产在线| 国产精品伦理久久久久久| 久久久777| 视频一区二区三区在线| 日本午夜精品久久久| 精品国产一区二区三区av片| 亚洲成人不卡| 在线精品一区二区| 国产精品尤物| 亚洲福利一区| 亚洲精品系列| 久久久久久网| 亚洲制服欧美另类| 久久久亚洲欧洲日产| 四虎884aa成人精品最新| 亚洲一区亚洲| 久久精品国产精品亚洲毛片| 欧美69视频| 欧美久久亚洲| 欧美成人综合| 国产欧美一区二区三区精品观看| 国产一区二区三区探花| 午夜欧美精品| 欧美精品1区| 午夜欧美理论片| 91精品尤物| 亚洲二区视频| 久久麻豆视频| 亚洲久久在线| 蜜桃视频在线网站| 日韩视频1区| 欧美成a人免费观看久久| 日本伊人久久| 人人香蕉久久| 国产乱论精品| 国产精品社区| 免费在线小视频| 国产精品hd| 三级一区在线视频先锋| 欧美天堂视频| 日本不卡视频一二三区| 欧洲亚洲一区二区三区| 欧美日韩一区自拍| 欧美日韩视频一区二区三区| 国产精品magnet| 美女久久一区| 成人片免费看| 国产精品v一区二区三区| 视频一区中文字幕国产| 亚洲风情在线资源| 国产精品美女在线观看直播| 久久夜色精品| 尤物在线精品| 国产精品99一区二区| 欧美三级网址| 国产精品1区| 97精品久久| 日韩在线电影| 综合日韩在线| 亚洲精品无播放器在线播放| 在线综合亚洲| 欧美特黄一区| 欧美日韩国产综合网| 伊人精品一区| 国产一区日韩一区| 欧美综合另类| 免费国产自久久久久三四区久久|