MyBatis中的循環(huán)插入insert foreach問題
MyBatis循環(huán)插入insert foreach
分析問題
在后端數(shù)據(jù)需要的循環(huán)插入數(shù)據(jù)庫中時,不要在實現(xiàn)類ServiceImpl中使用foreach語句
這樣會導(dǎo)致每次插入一條數(shù)據(jù)就會查詢一次數(shù)據(jù)庫,導(dǎo)致性能極低
解決方法
在MyBatis中的Mapper.xml使用insert foreach實現(xiàn)數(shù)據(jù)的循環(huán)插入
這樣就可以查詢一次數(shù)據(jù)庫,將所有數(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ā)的語法以及操作
MyBatis批量添加(foreach標簽)
delete from xxx_table where id in
<foreach collection="list" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach> => (1,2,3,4)foreach標簽:主要應(yīng)用于批量刪除與批量插入操作。
foreach標簽包含的的常用屬性有collection,item,index,open,separator,close
- collection:表示迭代集合的名稱,自定義名稱,可以使用@Param注解指定
- 只有一個List/Array/Map類型參數(shù)時,如果不加@Param注解,collection分別必須填:list、array、map中的key屬性
- 有多個參數(shù)時,不加@Param注解,collection和默認參數(shù)名稱一致
- 如果加@Param注解,都和注解定義一致
- item:表示本次迭代獲取的元素,自定義名稱;表示本次迭代獲取的元素,若collection為List、Set或者數(shù)組,則表示其中的元素;若collection為map,則代表key-value的value,該參數(shù)為必選
- separator:分隔符,mybatis會在每次迭代后給sql語句append上separator屬性指定的字符,該參數(shù)為可選項
- open:表示該語句以什么開始,最常用的是左括弧’(’,注意:mybatis會將該字符拼接到整體的sql語句之前,并且只拼接一次,該參數(shù)為可選項
- close:表示該語句以什么開始,最常用的是左括弧’(’,注意:mybatis會將該字符拼接到整體的sql語句之前,并且只拼接一次,該參數(shù)為可選項
- index:在list、Set和數(shù)組中,index表示當前迭代的位置,在map中,index代指是元素的key,該參數(shù)是可選項。
在使用foreach的時候最關(guān)鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:
1.如果傳入的是單參數(shù)且參數(shù)類型是一個List的時候,collection屬性值為list
2.如果傳入的是單參數(shù)且參數(shù)類型是一個array數(shù)組的時候,collection的屬性值為array
3.如果傳入的參數(shù)是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數(shù)也可以封裝成map,實際上如果你在傳入?yún)?shù)的時候,在MyBatis里面也是會把它封裝成一個Map的,map的key就是參數(shù)名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map里面的key。
使用示例
對于前兩種情況的使用非常簡單易懂,這里我們對第三種情況進行簡單的使用,來進行一個批量插入。
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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
避免多個jar通過maven打包導(dǎo)致同名配置文件覆蓋沖突問題
這篇文章主要介紹了避免多個jar通過maven打包導(dǎo)致同名配置文件覆蓋沖突問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
SQL注入攻擊及其在SpringBoot中使用MyBatisPlus的防范策略的方法
本文介紹了如何使用SpringBoot整合JavaDeeplearning4j構(gòu)建一個文本摘要生成系統(tǒng),該系統(tǒng)能夠自動從長篇文本中提取關(guān)鍵信息,生成簡潔的摘要,幫助用戶快速了解文本的主要內(nèi)容,系統(tǒng)使用LSTM神經(jīng)網(wǎng)絡(luò)模型進行訓(xùn)練,并通過SpringBoot創(chuàng)建RESTful?API進行調(diào)用2024-11-11
Java SSL證書錯誤:No subject alternative name
本文深入解析Java SSL證書錯誤'No subject alternative names present'的解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-03-03
SpringBoot啟動流程SpringApplication準備階段源碼分析
這篇文章主要為大家介紹了SpringBoot啟動流程SpringApplication準備階段源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04
Spring源碼學(xué)習(xí)之動態(tài)代理實現(xiàn)流程
這篇文章主要給大家介紹了關(guān)于Spring源碼學(xué)習(xí)之動態(tài)代理實現(xiàn)流程的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
啟用springboot security后登錄web頁面需要用戶名和密碼的解決方法
這篇文章主要介紹了啟用springboot security后登錄web頁面需要用戶名和密碼的解決方法,也就是使用默認用戶和密碼登錄的操作方法,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-02-02

