mybatis批量新增、删除、查询和修改方式

目录

  • 前期说明:
    • 主要有一下3种情况:
  • (1)mybatis批量新增
    • (2)mybatis批量删除
      • (3)mybatis批量查询
        • (4)mybatis批量修改
          • mySql Case函数
          • 动态批量修改:DeviceMapper.xml
          • 动态批量修改:DeviceMapper.java
          • 控制层(xxxxController)
        每次写批量的时候,都要在网上搜索一下,虽然都做过多次了,但具体的自己还是记不住(汗颜),所以索性今天就记录下来。

        前期说明: 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
        insert intoel_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(#{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})

        mapper:
        /*** 批量插入** @param list* @return*/int createBatchUserInfoList(List list); serviceImpl实现类:try {ListuserList = new ArrayList(); if (CollectionUtils.isNotEmpty(list)) {//组织idLong orgId = elAppInfoService.getOrg().getOrgId(); for (int i = 0; i < list.size(); i++) {Map 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和EmployeeIduserInfoMapper.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:
        delete from t_user where id in (#{id}) delete from t_user where id in #{id}

        mapper:
        int batchDeleteUser(int[] ids);


        (3)mybatis批量查询 mapper.xml:
        selectfrom el_position_infowhere roleCode in#{item.roleCode}

        mapper:
        List getPostionListIdsByRoleCode(List list);


        (4)mybatis批量修改 mybatis批量修改 (update的值也是动态的)
        最近公司有个业务:统计设备app的在线状态,写了个心跳,每分钟获取app的状态,主要是分为:
        (1)内网在线
        (2)外网在线
        (3)第三方网络
        (4)离线
        放在集合里,然后我在批量修改每个设备的onlineState的标识状态。这就要动态的批量修改onlineState中的值,但是mybatis并不支持 set onlineState = ? 的修改(onlineState是动态的)。然后通过查阅相关资料,通过mysql的case when then 来实现的。具体的实现如下:

        mySql Case函数
        SELECTSUM(population), CASE country WHEN '中国'THEN '亚洲' WHEN '印度'THEN '亚洲' WHEN '日本'THEN '亚洲' WHEN '美国'THEN '北美洲' WHEN '加拿大'THEN '北美洲' WHEN '墨西哥'THEN '北美洲' ELSE '其他' END FROMTable_A


        动态批量修改:DeviceMapper.xml
        update t_device set online_state = case device_noWHEN #{item.deviceNo} THEN #{item.onlineState}END where device_no in #{device.deviceNo}


        动态批量修改:DeviceMapper.java
        int updateBatchOnlineState(List list);


        控制层(xxxxController)
        //在线设备编号前端300秒调用一次 ,服务端640秒认为过期List deviceNos = DeviceCache.getDeviceNo(640); List list = new ArrayList(); 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("批量修改成功,已实时获取设备在线状态!"); }} else {logger.debug("目前没有设备在线!"); deviceService.modifyAllNotOnline(); }

        【mybatis批量新增、删除、查询和修改方式】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

          推荐阅读