最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis foreach 批量更新實(shí)例

 更新時(shí)間:2021年01月25日 09:31:51   作者:Monicase  
這篇文章主要介紹了MyBatis foreach 批量更新實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

在做配置選項(xiàng)(設(shè)備類型,所屬樓層等)的時(shí)候,當(dāng)刪除某配置的時(shí)候,我需要檢驗(yàn)該配置是否已被刪除。

@Override
 public BaseVO deleteOptionDetail(Integer id) {
 
  // 合法性驗(yàn)證
  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("配置正在使用不能刪除,請(qǐng)先刪除使用配置的地方");
  }
 
  // 合法性通過
  configOptionDetail.setIsDeleted(1);
  configOptionDetail.setGmtModefied(Calendar.getInstance().getTime());
  configOptionDetailMapper.updateById(configOptionDetail);
 
  // 更新內(nèi)存配置
  ConfigOptionConstruct.updateOption();
  return SuccessVO.getInstance();
 }

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

使用情況:

我需要批量刪除房間, 刪除房間的同時(shí),room對(duì)象中使用到了所屬樓層的配置選項(xiàng),我需要將他們的引用減少

@Override
 public BaseVO deleteRoomByIds(Integer[] ids) {
  if (null == ids) {
   return ParamErrorVO.getInstance();
  }
  EntityWrapper<Room> entityWrapper = new EntityWrapper<>();
  entityWrapper.where("isdelete={0}", 0);
  // 核查刪除的房間中是否存在正在使用的設(shè)備
  List<Integer> notDelete = deviceInfoService.checkRoomIds(ids);
  if (null != notDelete && 0 != notDelete.size()) {
   // 存在仍在使用設(shè)備的房間
   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 + " 房間存在未刪除的設(shè)備,請(qǐng)先刪除設(shè)備");
  }
 
  // 房間沒有設(shè)備在使用
  List<Integer> idList = new ArrayList<>();
  idList.addAll(Arrays.asList(ids));
  // 查詢需要?jiǎng)h除的房間
  entityWrapper.in("id", idList);
  List<Room> roomList = roomMapper.selectList(entityWrapper);
  if (null == roomList || idList.size() != roomList.size()) {
   return new ErrorVO("存在錯(cuò)誤的房間");
  }
  // ******************************************************************************************** 重點(diǎn)
  // 可以邏輯刪除
  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()));
  // 移除所屬樓層配置選項(xiàng)的使用
  configOptionDetailService.removeUseCount(optionIdsMap);
  ConfigOptionConstruct.updateOption();
  if (count == idList.size()) {
   return SuccessVO.getInstance();
  } else {
   return new ErrorVO("部分刪除失敗");
  } 
 }

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

上面我紅字標(biāo)明他們,是因?yàn)椋绻块gA 是一樓, 房間B 也是一樓, 那么我應(yīng)該將一樓的引用減 2。

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

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

查看MyBatis文檔:

foreach

動(dòng)態(tài) SQL 的另外一個(gè)常用的操作需求是對(duì)一個(gè)集合進(jìn)行遍歷,通常是在構(gòu)建 IN 條件語句的時(shí)候。比如:

<select id="selectPostIn" 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 元素的功能非常強(qiáng)大,它允許你指定一個(gè)集合,聲明可以在元素體內(nèi)使用的集合項(xiàng)(item)和索引(index)變量。它也允許你指定開頭與結(jié)尾的字符串以及在迭代結(jié)果之間放置分隔符。這個(gè)元素是很智能的,因此它不會(huì)偶然地附加多余的分隔符。

注意 你可以將任何可迭代對(duì)象(如 List、Set 等)、Map 對(duì)象或者數(shù)組對(duì)象傳遞給 foreach 作為集合參數(shù)。當(dāng)使用可迭代對(duì)象或者數(shù)組時(shí),index 是當(dāng)前迭代的次數(shù),item 的值是本次迭代獲取的元素。當(dāng)使用 Map 對(duì)象(或者 Map.Entry 對(duì)象的集合)時(shí),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>

補(bǔ)充:mybatis 用<foreach>根據(jù)ID批量更新時(shí)的一個(gè)注意點(diǎn)。

看接口。傳入一個(gè)Long型的List。

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

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

<update id="updateReadCount" 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>

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

問題就出在這個(gè)item,item 表示集合中每一個(gè)元素進(jìn)行迭代時(shí)的別名。

List<Long> topicIdList 因?yàn)闀r(shí)Long型(不是entity封裝著的),就不需要?jiǎng)e名了。改為如下就可以跑通了。

<update id="updateReadCount" 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>

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Java之Default關(guān)鍵字的兩種使用方式

    Java之Default關(guān)鍵字的兩種使用方式

    Java關(guān)鍵字default主要有兩種使用場(chǎng)景:一是在switch語句中作為默認(rèn)執(zhí)行的分支;二是在接口中定義默認(rèn)方法,這是Java 8新增的特性,允許接口包含具體實(shí)現(xiàn)的方法,在switch中,當(dāng)沒有匹配的case時(shí),執(zhí)行default分支
    2024-09-09
  • 使用RestTemplate調(diào)用https接口跳過證書驗(yàn)證

    使用RestTemplate調(diào)用https接口跳過證書驗(yàn)證

    這篇文章主要介紹了使用RestTemplate調(diào)用https接口跳過證書驗(yàn)證,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Netty分布式NioEventLoop優(yōu)化selector源碼解析

    Netty分布式NioEventLoop優(yōu)化selector源碼解析

    這篇文章主要介紹了Netty分布式NioEventLoop優(yōu)化selector源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • java 學(xué)習(xí)筆記(入門篇)_java程序helloWorld

    java 學(xué)習(xí)筆記(入門篇)_java程序helloWorld

    安裝配置完Java的jdk,下面就開始寫第一個(gè)java程序--hello World.用來在控制臺(tái)輸出“Hello World”,接下來詳細(xì)介紹,感興趣的朋友可以參考下
    2013-01-01
  • SpringBoot中配置Web靜態(tài)資源路徑的方法

    SpringBoot中配置Web靜態(tài)資源路徑的方法

    這篇文章主要介紹了SpringBoot中配置Web靜態(tài)資源路徑的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringBoot接口接收json參數(shù)解析

    SpringBoot接口接收json參數(shù)解析

    這篇文章主要介紹了SpringBoot接口接收json參數(shù)解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java 高并發(fā)編程之最實(shí)用的任務(wù)執(zhí)行架構(gòu)設(shè)計(jì)建議收藏

    Java 高并發(fā)編程之最實(shí)用的任務(wù)執(zhí)行架構(gòu)設(shè)計(jì)建議收藏

    高并發(fā)(High Concurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一,它通常是指,通過設(shè)計(jì)保證系統(tǒng)能夠同時(shí)并行處理很多請(qǐng)求,高并發(fā)相關(guān)常用的一些指標(biāo)有響應(yīng)時(shí)間(Response Time),吞吐量(Throughput),每秒查詢率QPS(Query Per Second),并發(fā)用戶數(shù)等
    2021-10-10
  • 使用Spring Data Jpa的CriteriaQuery一個(gè)陷阱

    使用Spring Data Jpa的CriteriaQuery一個(gè)陷阱

    使用Spring Data Jpa的CriteriaQuery進(jìn)行動(dòng)態(tài)條件查詢時(shí),可能會(huì)遇到一個(gè)陷阱,當(dāng)條件為空時(shí),查詢不到任何結(jié)果,并不是期望的返回所有結(jié)果。這是為什么呢?
    2020-11-11
  • Sping?Security前后端分離兩種實(shí)戰(zhàn)方案

    Sping?Security前后端分離兩種實(shí)戰(zhàn)方案

    這篇文章主要介紹了Sping?Security前后端分離兩種方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Java變量的初始化及靜態(tài)方法的實(shí)現(xiàn)

    Java變量的初始化及靜態(tài)方法的實(shí)現(xiàn)

    這篇文章主要介紹了Java變量的初始化及靜態(tài)方法的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10

最新評(píng)論

崇左市| 娱乐| 涿州市| 陆丰市| 株洲市| 米泉市| 贡觉县| 安仁县| 平利县| 萨嘎县| 台江县| 辽阳市| 兖州市| 泸溪县| 中牟县| 邢台市| 临夏县| 综艺| 自贡市| 平泉县| 双柏县| 湘阴县| 莲花县| 龙游县| 贺州市| 新田县| 容城县| 阳曲县| 唐河县| 高邑县| 盐城市| 鄢陵县| 定州市| 靖边县| 乐山市| 聂拉木县| 游戏| 喀喇| 秭归县| 徐州市| 衡阳市|