mybatis使用雙層<foreach>循環(huán)嵌套方式
mybatis使用雙層<foreach>循環(huán)嵌套
有個需求,要用到mybatis的雙層循環(huán)嵌套插入數(shù)據(jù),當(dāng)然,可以使用單層,在業(yè)務(wù)代碼層面循環(huán)插入,那樣會多出很多次IO數(shù)據(jù)庫,如果并發(fā)量高了,性能將會很低;
所以,這里我們在mybatis層面使用雙層循環(huán)嵌套來減少數(shù)據(jù)庫IO帶來的性能消耗問題。
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)嶓w類
@Data public class UpdateSchDataByShiftParam { /** * mybatis循環(huán)條件集合 */ private List<SchRuleIdParam> schRuleIdParams; /** * 表名 */ private String tableName; /** * 班次ID */ private Long shiftId; /** * 上班時段:1一天一次上下班,2一天二次上下班 */ private Integer shiftFlag; /** * 工作時長 */ private String hours; /** * 遲到計算:遲到幾分鐘算遲到,默認為 1 */ private Integer lateCal; /** * 早退計算:早退幾分鐘算早退,默認為 1 */ private Integer leaveEarlyCal; /** * 曠工計算:遲到幾分鐘算曠工,默認為121 */ private Integer absCalLate; /** * 曠工計算:早退幾分鐘算曠工,默認為121 */ private Integer absCalLeaveEarly; /** * 上班1:上班時間 */ private String goTimeOne; /** * 上班1:上班時間 有效打卡范圍開始時間 */ private String goTimeOneStartTime; /** * 上班1:上班時間 有效打卡范圍結(jié)束時間 */ private String goTimeOneEndTime; /** * 上班1:上班時間 是否必須打卡:0必須打卡,1不是必須打卡 */ private Integer goTimeOneStatus; /** * 下班1:下班時間 */ private String offTimeOne; /** * 下班1:下班時間 有效打卡范圍開始時間 */ private String offTimeOneStartTime; /** * 下班1:下班時間 有效打卡范圍結(jié)束時間 */ private String offTimeOneEndTime; /** * 下班1:下班時間 是否必須打卡:0必須打卡,1不是必須打卡 */ private Integer offTimeOneStatus; /** * 上班2:上班時間 */ private String goTimeTwo; /** * 上班2:上班時間 有效打卡范圍開始時間 */ private String goTimeTwoStartTime; /** * 上班2:上班時間 有效打卡范圍結(jié)束時間 */ private String goTimeTwoEndTime; /** * 上班2:上班時間 是否必須打卡:0必須打卡,1不是必須打卡 */ private Integer goTimeTwoStatus; /** * 下班2:下班時間 */ private String offTimeTwo; /** * 下班2:下班時間 有效打卡范圍開始時間 */ private String offTimeTwoStartTime; /** * 下班2:下班時間 有效打卡范圍結(jié)束時間 */ private String offTimeTwoEndTime; /** * 下班2:下班時間 是否必須打卡:0必須打卡,1不是必須打卡 */ private Integer offTimeTwoStatus; /** * 有效打卡范圍結(jié)束時間是否是第二日:0否,1是 */ private Integer endTimeStatus; /** * 當(dāng)前日期 */ private String nowTime; /** * 創(chuàng)建人ID */ private Long createId; /** * 創(chuàng)建人姓名 */ private String createName; }
這里說明一下,實體類中有基本字段屬性,還有集合字段屬性。
循環(huán)時用實體類中的集合字段當(dāng)最外層循環(huán)體,實體類的集合里面的實體還有一個層集合,這樣mapper.xml里面就有雙層集合。
實體類映射時,mybatis會自動映射SQL字段,只要實體類的基本字段與循環(huán)體里面的字段不相同,就可以在循環(huán)體里面也映射實體類的基本字段。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(詳解)
下面小編就為大家?guī)硪黄趕pring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06Spring boot JPA實現(xiàn)分頁和枚舉轉(zhuǎn)換代碼示例
這篇文章主要介紹了Spring boot JPA實現(xiàn)分頁和枚舉轉(zhuǎn)換代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09Java連接并操作Sedna XML數(shù)據(jù)庫的方法
這篇文章主要介紹了Java連接并操作Sedna XML數(shù)據(jù)庫的方法,較為詳細的說明了Sedna XML數(shù)據(jù)庫的原理與功能,并給出了基于java操作Sedna XML數(shù)據(jù)庫的方法,需要的朋友可以參考下2015-06-06SpringBoot整合token實現(xiàn)登錄認證的示例代碼
本文主要介紹了SpringBoot整合token實現(xiàn)登錄認證的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07SpringBoot 圖書管理系統(tǒng)(刪除、強制登錄、更新圖書)詳細代碼
在企業(yè)開發(fā)中,通常不采用delete語句進行物理刪除,而是使用邏輯刪除,邏輯刪除通過修改標識字段來表示數(shù)據(jù)已被刪除,方便數(shù)據(jù)恢復(fù),本文給大家介紹SpringBoot 圖書管理系統(tǒng)實例代碼,感興趣的朋友跟隨小編一起看看吧2024-09-09springboot使用logback文件查看錯誤日志過程詳解
這篇文章主要介紹了springboot使用logback文件查看錯誤日志過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09