亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis foreach 批量更新實例

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

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

@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);
 
  // 更新內存配置
  ConfigOptionConstruct.updateOption();
  return SuccessVO.getInstance();
 }

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

使用情況:

我需要批量刪除房間, 刪除房間的同時,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 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 元素的功能非常強大,它允許你指定一個集合,聲明可以在元素體內使用的集合項(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 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>

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

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

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

<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>

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

相關文章

  • Spring Boot 異步框架的使用詳解

    Spring Boot 異步框架的使用詳解

    這篇文章主要介紹了Spring Boot 異步框架的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • java實現(xiàn)文件上傳功能

    java實現(xiàn)文件上傳功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • springboot hazelcast緩存中間件的實例代碼

    springboot hazelcast緩存中間件的實例代碼

    這篇文章主要介紹了springboot hazelcast緩存中間件的實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • MybatisPlus實現(xiàn)數(shù)據(jù)攔截的使用示例

    MybatisPlus實現(xiàn)數(shù)據(jù)攔截的使用示例

    在MyBatis-Plus中,可以通過自定義攔截器來實現(xiàn)對SQL語句的攔截和修改,本文就來介紹一下如何使用,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • 解決子線程中獲取不到HttpServletRequest對象的問題

    解決子線程中獲取不到HttpServletRequest對象的問題

    這篇文章主要介紹了解決子線程中獲取不到HttpServletRequest對象的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Spring容器注入bean的五種方法逐個解析

    Spring容器注入bean的五種方法逐個解析

    依賴注入(Dependency Injection)和控制反轉(Inversion of Control)是同一個概念。具體含義是:當某個角色(可能是一個Java實例,調用者)需要另一個角色(另一個Java實例,被調用者)的協(xié)助時,在傳統(tǒng)的程序設計過程中,通常由調用者來創(chuàng)建被調用者的實例
    2023-02-02
  • 使用Java獲取List交集數(shù)據(jù)的實現(xiàn)方案小結

    使用Java獲取List交集數(shù)據(jù)的實現(xiàn)方案小結

    今天遇到一個小需求,當用戶上傳了一個關于用戶數(shù)據(jù)的列表,我們需要將其與數(shù)據(jù)庫中已有的用戶數(shù)據(jù)進行比較,所以本文給大家介紹了使用Java獲取List交集數(shù)據(jù)的實現(xiàn)方案小結,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-03-03
  • Docker?快速部署Springboot項目超詳細最新版

    Docker?快速部署Springboot項目超詳細最新版

    這篇文章主要介紹了Docker?快速部署Springboot項目超詳細最新版的相關資料,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • java圖形界面編程實戰(zhàn)代碼

    java圖形界面編程實戰(zhàn)代碼

    這篇文章主要介紹了java圖形界面編程實戰(zhàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Java SpringBoot容器注入對象詳解

    Java SpringBoot容器注入對象詳解

    本文通過實例代碼給大家詳解了springboot獲取ioc容器中注入的bean問題,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-09-09

最新評論