mybatis使用雙層<foreach>循環(huán)嵌套方式
mybatis使用雙層<foreach>循環(huán)嵌套
有個(gè)需求,要用到mybatis的雙層循環(huán)嵌套插入數(shù)據(jù),當(dāng)然,可以使用單層,在業(yè)務(wù)代碼層面循環(huán)插入,那樣會(huì)多出很多次IO數(shù)據(jù)庫(kù),如果并發(fā)量高了,性能將會(huì)很低;
所以,這里我們?cè)趍ybatis層面使用雙層循環(huán)嵌套來(lái)減少數(shù)據(jù)庫(kù)IO帶來(lái)的性能消耗問(wèn)題。
mapper接口
void updateSchDataByShiftAuto(UpdateSchDataByShiftParam param);
mapper.xml
<update id="updateSchDataByShiftAuto" parameterType="net.crisps.hr.time.param.UpdateSchDataByShiftParam"> <foreach collection="schRuleIdParams" item="item" separator=";"> update ${tableName} set `shift_id` = #{item.newSchRuleId}, `shift_flag` = #{shiftFlag},`hours` = #{hours},`late_cal` = # {lateCal},`leave_early_cal` = #{leaveEarlyCal}, `abs_cal_late` = #{absCalLate},`abs_cal_leave_early` = #{absCalLeaveEarly},`go_time_one` = #{goTimeOne}, `go_time_one_start_time` = #{goTimeOneStartTime},`go_time_one_end_time` = #{goTimeOneEndTime}, `go_time_one_status` = #{goTimeOneStatus},`off_time_one` = #{offTimeOne},`off_time_one_start_time` = #{offTimeOneStartTime}, `off_time_one_end_time` = #{offTimeOneEndTime},`off_time_one_status` = #{offTimeOneStatus},`go_time_two` = #{goTimeTwo}, `go_time_two_start_time` = #{goTimeTwoStartTime},`go_time_two_end_time` = #{goTimeTwoEndTime},`go_time_two_status` = #{goTimeTwoStatus}, `off_time_two` = #{offTimeTwo},`off_time_two_start_time` = #{offTimeTwoStartTime},creater_id = #{createId},creater_name = #{createName},create_time = #{nowTime}, `off_time_two_end_time` = #{offTimeTwoEndTime},`off_time_two_status` = #{offTimeTwoStatus},`end_time_status` = #{endTimeStatus} where `shift_id` = #{item.oldSchRuleId} <if test="item.dates != null and item.dates.size() >0 "> and `sch_date` in <foreach collection="item.dates" item="flag" separator="," open="(" close=")"> #{flag} </foreach> </if> </foreach> </update>
入?yún)?shí)體類
@Data public class UpdateSchDataByShiftParam { /** * mybatis循環(huán)條件集合 */ private List<SchRuleIdParam> schRuleIdParams; /** * 表名 */ private String tableName; /** * 班次ID */ private Long shiftId; /** * 上班時(shí)段:1一天一次上下班,2一天二次上下班 */ private Integer shiftFlag; /** * 工作時(shí)長(zhǎng) */ private String hours; /** * 遲到計(jì)算:遲到幾分鐘算遲到,默認(rèn)為 1 */ private Integer lateCal; /** * 早退計(jì)算:早退幾分鐘算早退,默認(rèn)為 1 */ private Integer leaveEarlyCal; /** * 曠工計(jì)算:遲到幾分鐘算曠工,默認(rèn)為121 */ private Integer absCalLate; /** * 曠工計(jì)算:早退幾分鐘算曠工,默認(rèn)為121 */ private Integer absCalLeaveEarly; /** * 上班1:上班時(shí)間 */ private String goTimeOne; /** * 上班1:上班時(shí)間 有效打卡范圍開(kāi)始時(shí)間 */ private String goTimeOneStartTime; /** * 上班1:上班時(shí)間 有效打卡范圍結(jié)束時(shí)間 */ private String goTimeOneEndTime; /** * 上班1:上班時(shí)間 是否必須打卡:0必須打卡,1不是必須打卡 */ private Integer goTimeOneStatus; /** * 下班1:下班時(shí)間 */ private String offTimeOne; /** * 下班1:下班時(shí)間 有效打卡范圍開(kāi)始時(shí)間 */ private String offTimeOneStartTime; /** * 下班1:下班時(shí)間 有效打卡范圍結(jié)束時(shí)間 */ private String offTimeOneEndTime; /** * 下班1:下班時(shí)間 是否必須打卡:0必須打卡,1不是必須打卡 */ private Integer offTimeOneStatus; /** * 上班2:上班時(shí)間 */ private String goTimeTwo; /** * 上班2:上班時(shí)間 有效打卡范圍開(kāi)始時(shí)間 */ private String goTimeTwoStartTime; /** * 上班2:上班時(shí)間 有效打卡范圍結(jié)束時(shí)間 */ private String goTimeTwoEndTime; /** * 上班2:上班時(shí)間 是否必須打卡:0必須打卡,1不是必須打卡 */ private Integer goTimeTwoStatus; /** * 下班2:下班時(shí)間 */ private String offTimeTwo; /** * 下班2:下班時(shí)間 有效打卡范圍開(kāi)始時(shí)間 */ private String offTimeTwoStartTime; /** * 下班2:下班時(shí)間 有效打卡范圍結(jié)束時(shí)間 */ private String offTimeTwoEndTime; /** * 下班2:下班時(shí)間 是否必須打卡:0必須打卡,1不是必須打卡 */ private Integer offTimeTwoStatus; /** * 有效打卡范圍結(jié)束時(shí)間是否是第二日:0否,1是 */ private Integer endTimeStatus; /** * 當(dāng)前日期 */ private String nowTime; /** * 創(chuàng)建人ID */ private Long createId; /** * 創(chuàng)建人姓名 */ private String createName; }
這里說(shuō)明一下,實(shí)體類中有基本字段屬性,還有集合字段屬性。
循環(huán)時(shí)用實(shí)體類中的集合字段當(dāng)最外層循環(huán)體,實(shí)體類的集合里面的實(shí)體還有一個(gè)層集合,這樣mapper.xml里面就有雙層集合。
實(shí)體類映射時(shí),mybatis會(huì)自動(dòng)映射SQL字段,只要實(shí)體類的基本字段與循環(huán)體里面的字段不相同,就可以在循環(huán)體里面也映射實(shí)體類的基本字段。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(詳解)
下面小編就為大家?guī)?lái)一篇基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06Spring boot JPA實(shí)現(xiàn)分頁(yè)和枚舉轉(zhuǎn)換代碼示例
這篇文章主要介紹了Spring boot JPA實(shí)現(xiàn)分頁(yè)和枚舉轉(zhuǎn)換代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Kotlin 和 Java 混合開(kāi)發(fā)入門(mén)教程
這篇文章主要介紹了入門(mén) Kotlin 和 Java 混合開(kāi)發(fā),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Java的Spring框架中AOP項(xiàng)目的一般配置和部署教程
這篇文章主要介紹了Java的Spring框架中AOP項(xiàng)目的一般配置和部署教程,AOP面向方面編程的項(xiàng)目部署結(jié)構(gòu)都比較類似,因而也被看作是Spring的一種設(shè)計(jì)模式使用,需要的朋友可以參考下2016-04-04Java連接并操作Sedna XML數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Java連接并操作Sedna XML數(shù)據(jù)庫(kù)的方法,較為詳細(xì)的說(shuō)明了Sedna XML數(shù)據(jù)庫(kù)的原理與功能,并給出了基于java操作Sedna XML數(shù)據(jù)庫(kù)的方法,需要的朋友可以參考下2015-06-06SpringBoot整合token實(shí)現(xiàn)登錄認(rèn)證的示例代碼
本文主要介紹了SpringBoot整合token實(shí)現(xiàn)登錄認(rèn)證的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07SpringBoot 圖書(shū)管理系統(tǒng)(刪除、強(qiáng)制登錄、更新圖書(shū))詳細(xì)代碼
在企業(yè)開(kāi)發(fā)中,通常不采用delete語(yǔ)句進(jìn)行物理刪除,而是使用邏輯刪除,邏輯刪除通過(guò)修改標(biāo)識(shí)字段來(lái)表示數(shù)據(jù)已被刪除,方便數(shù)據(jù)恢復(fù),本文給大家介紹SpringBoot 圖書(shū)管理系統(tǒng)實(shí)例代碼,感興趣的朋友跟隨小編一起看看吧2024-09-09springboot使用logback文件查看錯(cuò)誤日志過(guò)程詳解
這篇文章主要介紹了springboot使用logback文件查看錯(cuò)誤日志過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09