电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

MyBatis foreach 批量更新實例

瀏覽:2日期:2023-10-20 10:35:12

在做配置選項(設備類型,所屬樓層等)的時候,當刪除某配置的時候,我需要檢驗該配置是否已被刪除。

@Override public BaseVO deleteOptionDetail(Integer id) { // 合法性驗證 if (null == id) { return ParamErrorVO.getInstance(); } ConfigOptionDetail configOptionDetail = configOptionDetailMapper.selectById(id); if (null == configOptionDetail || 1 == configOptionDetail.getIsDeleted()) { return new ErrorVO('該配置不存在'); } if (configOptionDetail.getSystem() == 1) { return new ErrorVO('系統(tǒng)屬性不能刪除'); } if (configOptionDetail.getUseCount() = 0) { return new ErrorVO('配置正在使用不能刪除,請先刪除使用配置的地方'); } // 合法性通過 configOptionDetail.setIsDeleted(1); configOptionDetail.setGmtModefied(Calendar.getInstance().getTime()); configOptionDetailMapper.updateById(configOptionDetail); // 更新內(nèi)存配置 ConfigOptionConstruct.updateOption(); return SuccessVO.getInstance(); }

思考之后我決定采用,給配置選項設備一個use_count字段,代表該配置被引用的次數(shù)。 只有當該字段值為 0 時,該配置選項記錄才可被刪除。

MyBatis foreach 批量更新實例

使用情況:

我需要批量刪除房間, 刪除房間的同時,room對象中使用到了所屬樓層的配置選項,我需要將他們的引用減少

@Override public BaseVO deleteRoomByIds(Integer[] ids) { if (null == ids) { return ParamErrorVO.getInstance(); } EntityWrapper<Room> entityWrapper = new EntityWrapper<>(); entityWrapper.where('isdelete={0}', 0); // 核查刪除的房間中是否存在正在使用的設備 List<Integer> notDelete = deviceInfoService.checkRoomIds(ids); if (null != notDelete && 0 != notDelete.size()) { // 存在仍在使用設備的房間 entityWrapper.in('id', notDelete); // 查詢這些房間 List<Room> roomList = roomMapper.selectList(entityWrapper); // 獲取房間的名稱 StringBuilder stringBuilder = new StringBuilder(roomList.stream().map(Room::getName).collect(Collectors.toList()).toString()); System.out.println(stringBuilder); // TODO: 2018/4/8 可能需要修改提示語 return new ErrorVO(stringBuilder + ' 房間存在未刪除的設備,請先刪除設備'); } // 房間沒有設備在使用 List<Integer> idList = new ArrayList<>(); idList.addAll(Arrays.asList(ids)); // 查詢需要刪除的房間 entityWrapper.in('id', idList); List<Room> roomList = roomMapper.selectList(entityWrapper); if (null == roomList || idList.size() != roomList.size()) { return new ErrorVO('存在錯誤的房間'); } // ******************************************************************************************** 重點 // 可以邏輯刪除 int count = roomMapper.logicDeleteByIds(idList); List<Long> optionIds = roomList.stream().map(room -> Long.parseLong(room.getRoomPosition())).collect(Collectors.toList()); Map<Long, Long> optionIdsMap = optionIds.stream().collect(Collectors.groupingBy(p -> p,Collectors.counting())); // 移除所屬樓層配置選項的使用 configOptionDetailService.removeUseCount(optionIdsMap); ConfigOptionConstruct.updateOption(); if (count == idList.size()) { return SuccessVO.getInstance(); } else { return new ErrorVO('部分刪除失敗'); } }

optionIds 是從roomList 房間集合中,通過stream, 所引用的配置選項id集合

上面我紅字標明他們,是因為,如果房間A 是一樓, 房間B 也是一樓, 那么我應該將一樓的引用減 2。

所以我將optionIds 分組轉成Map<配置選項id, 需要減少引用的次數(shù)>

最后一步,也是最重要的進行數(shù)據(jù)庫操作,我希望可以批量更新減少這些引用。

查看MyBatis文檔:

foreach

動態(tài) SQL 的另外一個常用的操作需求是對一個集合進行遍歷,通常是在構建 IN 條件語句的時候。比如:

<select resultType='domain.blog.Post'> SELECT * FROM POST P WHERE ID in <foreach item='item' index='index' collection='list' open='(' separator=',' close=')'> #{item} </foreach></select>

foreach 元素的功能非常強大,它允許你指定一個集合,聲明可以在元素體內(nèi)使用的集合項(item)和索引(index)變量。它也允許你指定開頭與結尾的字符串以及在迭代結果之間放置分隔符。這個元素是很智能的,因此它不會偶然地附加多余的分隔符。

注意 你可以將任何可迭代對象(如 List、Set 等)、Map 對象或者數(shù)組對象傳遞給 foreach 作為集合參數(shù)。當使用可迭代對象或者數(shù)組時,index 是當前迭代的次數(shù),item 的值是本次迭代獲取的元素。當使用 Map 對象(或者 Map.Entry 對象的集合)時,index 是鍵,item 是值。

<update id='addUseCountByIds'> update config_option_detail set gmt_modified = #{gmtModified}, use_count = use_count + <foreach item='item' index='index' collection='list' open=' case id ' separator=' ' close=' end'> when #{index} then #{item} </foreach> where id in <foreach item='item' index='index' collection='list' open='(' separator=',' close=')'> #{index} </foreach></update>

補充:mybatis 用<foreach>根據(jù)ID批量更新時的一個注意點。

看接口。傳入一個Long型的List。

int updateReadCount(@Param(value = 'topicIdList') List<Long> topicIdList);

xml里面循環(huán)update.

<update parameterType='java.util.List'> update CTS set read_count = read_count + 1 where topic_id in <foreach item='item' index='index' collection='topicIdList' open='(' close=')' separator=','> #{item.topicId} </foreach> </update>

就是直接復制了別人的代碼,改了一改。怎么都跑不通。。。。。。。

問題就出在這個item,item 表示集合中每一個元素進行迭代時的別名。

List<Long> topicIdList 因為時Long型(不是entity封裝著的),就不需要別名了。改為如下就可以跑通了。

<update parameterType='java.util.List'> update CTS set read_count = read_count + 1 where topic_id in <foreach item='topicId' index='index' collection='topicIdList' open='(' close=')' separator=','> #{topicId} </foreach> </update>

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。如有錯誤或未考慮完全的地方,望不吝賜教。

相關文章:
主站蜘蛛池模板: 成都LED显示屏丨室内户外全彩led屏厂家方案报价_四川诺显科技 | 蓝米云-专注于高性价比香港/美国VPS云服务器及海外公益型免费虚拟主机 | 南京办公用品网-办公文具用品批发-打印机耗材采购 | 菏泽商标注册_菏泽版权登记_商标申请代理_菏泽商标注册去哪里 | DWS物流设备_扫码称重量方一体机_快递包裹分拣机_广东高臻智能装备有限公司 | 破碎机_上海破碎机_破碎机设备_破碎机厂家-上海山卓重工机械有限公司 | 中央空调温控器_风机盘管温控器_智能_液晶_三速开关面板-中央空调温控器厂家 | 民用音响-拉杆音响-家用音响-ktv专用音响-万昌科技 | 冷藏车-东风吸污车-纯电动环卫车-污水净化车-应急特勤保障车-程力专汽厂家-程力专用汽车股份有限公司销售二十一分公司 | 产业规划_产业园区规划-产业投资选址及规划招商托管一体化服务商-中机院产业园区规划网 | 东莞猎头公司_深圳猎头公司_广州猎头公司-广东万诚猎头提供企业中高端人才招聘服务 | 合金耐磨锤头_破碎机锤头_郑州市德勤建材有限公司 | 东莞海恒试验仪器设备有限公司| 车辆定位管理系统_汽车GPS系统_车载北斗系统 - 朗致物联 | 软文发布-新闻发布推广平台-代写文章-网络广告营销-自助发稿公司媒介星 | 珠光砂保温板-一体化保温板-有釉面发泡陶瓷保温板-杭州一体化建筑材料 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 | 压缩空气冷冻式干燥机_吸附式干燥机_吸干机_沪盛冷干机 | 电液推杆生产厂家|电动推杆|液压推杆-扬州唯升机械有限公司 | 定制/定做衬衫厂家/公司-衬衫订做/订制价格/费用-北京圣达信 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 沈阳建筑设计公司_加固改造设计_厂房设计_设计资质加盟【金辉设计】 | 制冷采购电子商务平台——制冷大市场 | 医养体检包_公卫随访箱_慢病随访包_家签随访包_随访一体机-济南易享医疗科技有限公司 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 法兰螺母 - 不锈钢螺母制造厂家 - 万千紧固件--螺母街 | AGV叉车|无人叉车|AGV智能叉车|AGV搬运车-江西丹巴赫机器人股份有限公司 | 玻璃瓶厂家_酱菜瓶厂家_饮料瓶厂家_酒瓶厂家_玻璃杯厂家_徐州东明玻璃制品有限公司 | 雨水收集系统厂家-雨水收集利用-模块雨水收集池-徐州博智环保科技有限公司 | 发光字|标识设计|标牌制作|精神堡垒 - 江苏苏通广告有限公司 | 北京乾茂兴业科技发展有限公司| 联系我们-腾龙公司上分客服微信19116098882 | NMRV减速机|铝合金减速机|蜗轮蜗杆减速机|NMRV减速机厂家-东莞市台机减速机有限公司 | 隔爆型防爆端子分线箱_防爆空气开关箱|依客思 | 深圳彩钢板_彩钢瓦_岩棉板_夹芯板_防火复合彩钢板_长鑫 | 光纤测温-荧光光纤测温系统-福州华光天锐光电科技有限公司 | 丽陂特官网_手机信号屏蔽器_Wifi信号干扰器厂家_学校考场工厂会议室屏蔽仪 | 深圳货架厂_仓库货架公司_重型仓储货架_线棒货架批发-深圳市诺普泰仓储设备有限公司 | 拉力测试机|材料拉伸试验机|电子拉力机价格|万能试验机厂家|苏州皖仪实验仪器有限公司 | 深圳APP开发_手机软件APP定制外包_小程序开发公司-来科信 |