一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - mybatis批量新增、刪除、查詢和修改方式

mybatis批量新增、刪除、查詢和修改方式

2022-01-24 12:59xuforeverlove Java教程

這篇文章主要介紹了mybatis批量新增、刪除、查詢和修改方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

每次寫批量的時候,都要在網上搜索一下,雖然都做過多次了,但具體的自己還是記不?。ê诡仯?,所以索性今天就記錄下來。

前期說明:

foreach的主要用在構建in條件中,它可以在SQL語句中進行迭代一個集合。foreach元素的屬性主要有 item,index,collection,open,separator,close。

item表示集合中每一個元素進行迭代時的別名,index指 定一個名字,用于表示在迭代過程中,每次迭代到的位置,open表示該語句以什么開始,separator表示在每次進行迭代之間以什么符號作為分隔 符,close表示以什么結束,在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況 下,該屬性的值是不一樣的

主要有一下3種情況:

1.如果傳入的是單參數且參數類型是一個List的時候,collection屬性值為list

2.如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值為array

3.如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可以封裝成map,實際上如果你在傳入參數的時候,在breast里面也是會把它封裝成一個Map的,map的key就是參數名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map里面的key

(1)mybatis批量新增

mapper.xml

?
1
2
3
4
5
6
7
8
9
<insert id="createBatchUserInfoList" useGeneratedKeys="true" parameterType="java.util.List" >
        insert into
            el_user_info (id,user_name,user_tel,pass_word,user_sex,del_mark,position_id,agency_id,create_date,update_date,role_id,employee_id,org_id)
        values
        <foreach collection="list" item="item" index="index" separator="," >
            (#{item.id},#{item.userName},#{item.userTel}, #{item.passWord},#{item.userSex},
             #{item.delMark},#{item.positionId},#{item.agencyId},#{item.createDate},#{item.updateDate},#{item.roleId},#{item.employeeId},#{item.orgId})
        </foreach>
    </insert>

mapper:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/**
     * 批量插入
     *
     * @param list
     * @return
     */
    int createBatchUserInfoList(List<ElUserInfo> list);
serviceImpl實現類:
try {
            List<ElUserInfo>  userList = new ArrayList<ElUserInfo>();
            if (CollectionUtils.isNotEmpty(list)) {
                //組織id
                Long orgId = elAppInfoService.getOrg().getOrgId();
                for (int i = 0; i < list.size(); i++) {
                    Map<String, Object> map = list.get(i);
                    String userSex = map.get("userSex").toString().trim();
                    String userName = map.get("userName").toString().trim();
                    String userTel = map.get("userTel").toString().trim();
                    String key = userName + userTel;
 
                    String redisCacheByKey = redisCacheService.getRedisCacheByKey(key);
                    log.info(redisCacheByKey);
                    if (!StringUtils.isEmpty(redisCacheByKey)) {
                       //redisCacheService.deleteRedisCacheByKey(key);
                            continue;
                    }
                    if ("男".equals(userSex)) {
                        userSex = "0";
                    } else if ("女".equals(userSex)){
                        userSex = "1";
                    }
                    ElUserInfo user = new ElUserInfo();
                    user.setUserName(userName);
                    user.setUserTel(userTel);
                    user.setPassWord(MD5(map.get("passWord").toString().trim()));
                    user.setUserSex(userSex);
                    user.setPositionId(postionId);
                    user.setAgencyId(agencyId);
                    user.setCreateDate(new Date());
                    user.setUpdateDate(new Date());
                    user.setDelMark(0);
                    user.setRoleId(1L);
                    user.setEmployeeId(0L);
                    user.setOrgId(orgId);
                    userList.add(user);
                }
                if (CollectionUtils.isNotEmpty(userList)) {
                    //先持久化本地
                    row = userInfoMapper.createBatchUserInfoList(userList);
                    if (row > 0) {
                        //持久化成功后同步組織平臺
                        String add = orgEmployeeService.addOrganRoleUserToPlatform(userList, "add");
                        if (!StringUtils.isEmpty(add) && !"-1".equals(add) && !"null".equals(add)) {
                            //以用戶手機號碼為唯一標示,批量修改OrgId和EmployeeId
                            userInfoMapper.updateBatchOrgId(userList);
                        }
                        log.info(this.getClass().getName()+"的UserInfoThread"+add.toString());
                    }
                }
            }
        } catch (Exception e) {
            log.error("elPositionInfoServiceImpl的UserInfoThread方法error"+e.getMessage(),e);
        }

(2)mybatis批量刪除

mapper.xml:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<delete id="batchDeleteUser">
        delete from t_user where id in (
        <foreach collection="ids" item="id" separator=",">
            #{id}
        </foreach>
        
 </delete>
<!-- 第二種批量刪除的寫法 -->
<!-- open表示該語句以什么開始,close表示以什么結束 -->
<delete id="">
        delete from t_user where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
</delete>

mapper:

?
1
int batchDeleteUser(int[] ids);

(3)mybatis批量查詢

mapper.xml:

?
1
2
3
4
5
6
7
8
9
<select id="getPostionListIdsByRoleCode" resultType="com.xxx.bean.ElPositionInfo" parameterType="java.util.List">
   select
         <include refid="Base_Column_List" />
   from el_position_info
   where roleCode in
   <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
        #{item.roleCode}
   </foreach>
 </select>

mapper:

?
1
List<ElPositionInfo> getPostionListIdsByRoleCode(List<ElPositionInfo> list);

(4)mybatis批量修改

mybatis批量修改 (update的值也是動態(tài)的)

最近公司有個業(yè)務:統計設備app的在線狀態(tài),寫了個心跳,每分鐘獲取app的狀態(tài),主要是分為:

(1)內網在線

(2)外網在線

(3)第三方網絡

(4)離線

放在集合里,然后我在批量修改每個設備的onlineState的標識狀態(tài)。這就要動態(tài)的批量修改onlineState中的值,但是mybatis并不支持 set onlineState = ? 的修改(onlineState是動態(tài)的)。然后通過查閱相關資料,通過mysql的case when then 來實現的。具體的實現如下:

mySql Case函數

?
1
2
3
4
5
6
7
8
9
10
SELECT  SUM(population),
        CASE country
                WHEN '中國'     THEN '亞洲'
                WHEN '印度'     THEN '亞洲'
                WHEN '日本'     THEN '亞洲'
                WHEN '美國'     THEN '北美洲'
                WHEN '加拿大'  THEN '北美洲'
                WHEN '墨西哥'  THEN '北美洲'
        ELSE '其他' END
FROM    Table_A

動態(tài)批量修改:DeviceMapper.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- 批量修改設備在線狀態(tài) -->
   <update id="updateBatchOnlineState" parameterType="java.util.List">
    update t_device
      set online_state = case device_no
       <foreach collection="list" item="item"
           WHEN #{item.deviceNo} THEN #{item.onlineState} 
      </foreach>
      END
    where
     device_no in
  <foreach collection="list" open="(" separator="," close=")" item="device">
   #{device.deviceNo}
  </foreach>
  </update>

動態(tài)批量修改:DeviceMapper.java

?
1
int updateBatchOnlineState(List<Device> list);

控制層(xxxxController)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//在線設備編號  前端300秒調用一次 ,服務端640秒認為過期
  List<String> deviceNos = DeviceCache.getDeviceNo(640);
  List<Device> list = new ArrayList<Device>();
  if (CollectionUtils.isNotEmpty(deviceNos)) {
   for (String str : deviceNos) {
    Device device = new Device();
    int indexOf = str.lastIndexOf("-");
    String deviceNo = str.substring(0, indexOf);
    String type = str.substring(indexOf+1, str.length());
    device.setDeviceNo(deviceNo);
    device.setOnlineState(Integer.valueOf(type));
    list.add(device);
   }
   int row = deviceService.updateBatchOnlineState(list);
   if (row < 1) {
    logger.debug("批量修改失??!");
   } else {
    logger.debug("批量修改成功,已實時獲取設備在線狀態(tài)!");
   }
  } else {
   logger.debug("目前沒有設備在線!");
   deviceService.modifyAllNotOnline();
  }

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/xuforeverlove/article/details/80743625

延伸 · 閱讀

精彩推薦
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 日本一区二区免费在线观看 | 视频二区 素人 欧美 日韩 | 99热最新 | 日本道在线播放 | www.亚洲视频| 香蕉精品国产高清自在自线 | 99国产国人青青视频在线观看 | 欧美在线高清 | 精品国产一区二区三区久久久狼 | 亚洲精品久久久久福利网站 | 亚洲四虎永久在线播放 | 秋霞午夜视频在线观看 | 免费叼嘿视频 | 久久re热在线视频精99 | 国产日韩精品一区二区在线观看播放 | les在宿舍吃她奶 | 99热精品成人免费观看 | 国产成人精品免费视频软件 | 欧亚专线欧洲m码可遇不可求 | 亚欧毛片基地国产毛片基地 | yellow最新视频2019| 国产v日韩v欧美v精品专区 | 亚洲高清国产拍精品动图 | 我的青梅竹马是消防员2季未增删免费 | 日本指交| 丫鬟粗大狠狠贯穿h | 深夜免费看 | 草草视频免费观看 | 久久人妻少妇嫩草AV无码 | 蜜臀91 | 国产成人一区二区三区在线视频 | 国产九九热视频 | 欧式午夜理伦三级在线观看 | 欧美三级免费观看 | 丁香婷婷在线视频 | 国内在线播放 | 欧美香蕉人人人人人人爱 | 果冻传媒天美传媒乌鸦传媒 | 日韩视频免费 | 国产高清露脸学生在线观看 | 免费一级欧美片在线观免看 |