MyBatis中的循環(huán)插入insert foreach問(wèn)題
MyBatis循環(huán)插入insert foreach
分析問(wèn)題
在后端數(shù)據(jù)需要的循環(huán)插入數(shù)據(jù)庫(kù)中時(shí),不要在實(shí)現(xiàn)類ServiceImpl中使用foreach語(yǔ)句
這樣會(huì)導(dǎo)致每次插入一條數(shù)據(jù)就會(huì)查詢一次數(shù)據(jù)庫(kù),導(dǎo)致性能極低
解決方法
在MyBatis中的Mapper.xml使用insert foreach實(shí)現(xiàn)數(shù)據(jù)的循環(huán)插入
這樣就可以查詢一次數(shù)據(jù)庫(kù),將所有數(shù)據(jù)循環(huán)插入
<insert id="saveList"> insert into table ( id , column )values <foreach collection="list" item="item" index="index" separator="," > ( #{item.id}, #{item.column} ) </foreach> </insert>
心得:
研究MyBatis框架,熟悉相關(guān)便捷開發(fā)的語(yǔ)法以及操作
MyBatis批量添加(foreach標(biāo)簽)
delete from xxx_table where id in <foreach collection="list" item="item" index="index" open="(" separator="," close=")"> #{item} </foreach> => (1,2,3,4)
foreach標(biāo)簽:主要應(yīng)用于批量刪除與批量插入操作。
foreach標(biāo)簽包含的的常用屬性有collection,item,index,open,separator,close
- collection:表示迭代集合的名稱,自定義名稱,可以使用@Param注解指定
- 只有一個(gè)List/Array/Map類型參數(shù)時(shí),如果不加@Param注解,collection分別必須填:list、array、map中的key屬性
- 有多個(gè)參數(shù)時(shí),不加@Param注解,collection和默認(rèn)參數(shù)名稱一致
- 如果加@Param注解,都和注解定義一致
- item:表示本次迭代獲取的元素,自定義名稱;表示本次迭代獲取的元素,若collection為L(zhǎng)ist、Set或者數(shù)組,則表示其中的元素;若collection為map,則代表key-value的value,該參數(shù)為必選
- separator:分隔符,mybatis會(huì)在每次迭代后給sql語(yǔ)句append上separator屬性指定的字符,該參數(shù)為可選項(xiàng)
- open:表示該語(yǔ)句以什么開始,最常用的是左括弧’(’,注意:mybatis會(huì)將該字符拼接到整體的sql語(yǔ)句之前,并且只拼接一次,該參數(shù)為可選項(xiàng)
- close:表示該語(yǔ)句以什么開始,最常用的是左括弧’(’,注意:mybatis會(huì)將該字符拼接到整體的sql語(yǔ)句之前,并且只拼接一次,該參數(shù)為可選項(xiàng)
- index:在list、Set和數(shù)組中,index表示當(dāng)前迭代的位置,在map中,index代指是元素的key,該參數(shù)是可選項(xiàng)。
在使用foreach的時(shí)候最關(guān)鍵的也是最容易出錯(cuò)的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:
1.如果傳入的是單參數(shù)且參數(shù)類型是一個(gè)List的時(shí)候,collection屬性值為list
2.如果傳入的是單參數(shù)且參數(shù)類型是一個(gè)array數(shù)組的時(shí)候,collection的屬性值為array
3.如果傳入的參數(shù)是多個(gè)的時(shí)候,我們就需要把它們封裝成一個(gè)Map了,當(dāng)然單參數(shù)也可以封裝成map,實(shí)際上如果你在傳入?yún)?shù)的時(shí)候,在MyBatis里面也是會(huì)把它封裝成一個(gè)Map的,map的key就是參數(shù)名,所以這個(gè)時(shí)候collection屬性值就是傳入的List或array對(duì)象在自己封裝的map里面的key。
使用示例
對(duì)于前兩種情況的使用非常簡(jiǎn)單易懂,這里我們對(duì)第三種情況進(jìn)行簡(jiǎn)單的使用,來(lái)進(jìn)行一個(gè)批量插入。
controller層
LocalDateTime localDateTime = LocalDateTime.now(); teacherCourseList.setCreate_time(localDateTime); teacherCourseList.setUpdate_time(localDateTime); log.info("入?yún)?======"+teacherCourseList); Map<String,Object> map=new HashMap<>(); map.put("username",teacherCourseList.getUsername()); map.put("CourseList",teacherCourseList.getCourseList()); map.put("create_time",teacherCourseList.getCreate_time()); map.put("update_time",teacherCourseList.getUpdate_time()); courseService.batchInsert(map);
xml
<insert id="batchInsert"> insert into ref_teacher_course (teacher_id,course_id,create_time,update_time) values <foreach collection="teacherCourseList.CourseList" item="item" index="index" separator=","> (#{teacherCourseList.username}, #{item}, #{teacherCourseList.create_time}, #{teacherCourseList.update_time}) </foreach> </insert>
mapper
void batchInsert(@Param("teacherCourseList") Map map);
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java并發(fā)編程專題(十)----(JUC原子類)基本類型詳解
這篇文章主要介紹了java JUC原子類基本類型詳解的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07MyBatis測(cè)試報(bào)錯(cuò):Cannot?determine?value?type?from?string?&a
這篇文章主要給大家介紹了關(guān)于MyBatis測(cè)試報(bào)錯(cuò):Cannot?determine?value?type?from?string?'xxx'的解決辦法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02詳解IDEA中類加載器調(diào)用getResourceAsStream()方法需注意的問(wèn)題
這篇文章主要介紹了詳解IDEA中類加載器調(diào)用getResourceAsStream()方法需注意的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02java中javamail收發(fā)郵件實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了java中javamail收發(fā)郵件實(shí)現(xiàn)方法,實(shí)例分析了javamail的使用方法與相關(guān)注意事項(xiàng),非常具有實(shí)用價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02FasfDFS整合Java實(shí)現(xiàn)文件上傳下載功能實(shí)例詳解
這篇文章主要介紹了FasfDFS整合Java實(shí)現(xiàn)文件上傳下載功能實(shí)例詳解,需要的朋友可以參考下2017-08-08SpringBoot中@RequestBody不能和Multipart同時(shí)傳遞的問(wèn)題解決
本文主要介紹了SpringBoot中@RequestBody不能和Multipart同時(shí)傳遞的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04springboot集成mybatis?plus和dynamic-datasource注意事項(xiàng)說(shuō)明
這篇文章主要介紹了springboot集成mybatis?plus和dynamic-datasource注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Java中使用異或語(yǔ)句實(shí)現(xiàn)兩個(gè)變量的互換
這篇文章主要介紹了Java中使用異或語(yǔ)句實(shí)現(xiàn)兩個(gè)變量的互換,本文直接給出代碼實(shí)例以及運(yùn)行結(jié)果,需要的朋友可以參考下2015-06-06