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

/**
     * 批量插入
     *
     * @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:

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

int batchDeleteUser(int[] ids);

(3)mybatis批量查询

mapper.xml:

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

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

(4)mybatis批量修改

mybatis批量修改 (update的值也是动态的)

最近公司有个业务:统计设备app的在线状态,写了个心跳,每分钟获取app的状态,主要是分为:

(1)内网在线

(2)外网在线

(3)第三方网络

(4)离线

放在集合里,然后我在批量修改每个设备的onlineState的标识状态。这就要动态的批量修改onlineState中的值,但是mybatis并不支持 set onlineState = ? 的修改(onlineState是动态的)。然后通过查阅相关资料,通过mysql的case when then 来实现的。具体的实现如下:

mySql Case函数

SELECT  SUM(population),
        CASE country
                WHEN '中国'     THEN '亚洲'
                WHEN '印度'     THEN '亚洲'
                WHEN '日本'     THEN '亚洲'
                WHEN '美国'     THEN '北美洲'
                WHEN '加拿大'  THEN '北美洲'
                WHEN '墨西哥'  THEN '北美洲'
        ELSE '其他' END
FROM    Table_A

动态批量修改:DeviceMapper.xml

<!-- 批量修改设备在线状态 -->
   <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>

动态批量修改:DeviceMapper.java

int updateBatchOnlineState(List<Device> list);

控制层(xxxxController)

//在线设备编号  前端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("批量修改成功,已实时获取设备在线状态!");
   }
  } else {
   logger.debug("目前没有设备在线!");
   deviceService.modifyAllNotOnline();
  }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Mybatis 条件查询 批量增删改查功能

    模糊查询: @Select({ "SELECT * FROM account where account like CONCAT('%',#{query},'%') or email like CONCAT('%',#{query},'%')" }) Account findAccountByAccountOrMail(@Param("query") String query); 批量添加: @Insert({ "<script>"

  • MyBatis 实现数据的批量新增和删除的操作

    在项目的开发中,我们经常需要对数据进行批量的操作,如:批量新增.批量删除等.下面将介绍MyBatis如何实现数据的批量新增和删除操作. 创建UserMapper接口(用户信息Mapper动态代理接口),实现用户信息的批量新增.批量删除.批量查询. package com.pjb.mapper; import com.pjb.entity.UserInfo; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.

  • mybatisplus添加真正的批量新增、批量更新的实现

    使用mybatis-plus来进行批量新增和更新时,你会发现其实是一条条sql执行,下面进行优化. 1.添加InsertBatchMethod和UpdateBatchMethod类 import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.metadata.TableInfo; import lombok.extern.slf4j.Slf4j; import

  • MyBatis批量添加、修改和删除

    废话不多说了,直接步入正题了. 1.批量添加元素session.insert(String string,Object o) public void batchInsertStudent(){ List<Student> ls = new ArrayList<Student>(); for(int i = 5;i < 8;i++){ Student student = new Student(); student.setId(i); student.setName("

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

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

  • MyBatisPlus-QueryWrapper多条件查询及修改方式

    目录 gt.ge.lt.le.isNull.isNotNull eq.ne between.notBetween allEq like.notLike.likeLeft.likeRight in.notIn.inSql.notinSql.exists.notExists or.and 嵌套 or.嵌套 and orderBy.orderByDesc.orderByAsc last 指定要查询的列 set.setSql gt.ge.lt.le.isNull.isNotNull 大于 > 例: gt

  • layui table表格数据的新增,修改,删除,查询,双击获取行数据方式

    layui table利用参数新增,修改,删除,查询,双击数据行获取本行数据等.模块化使用layui table表格,通过二次封装实现语法上的解耦使用layui table,使用参数就可以以及外部的方法调用即可实现对layui table表格的操作,通过封装,把更多自主权交给页面自定义,layui:v:2.3.0.感谢layui的作者贤心. 演示效果如下: 以上json显示不完整是录屏的原因,请见谅! var Table = function(ops){ this.dataList = [];

  • MyBatis批量插入/修改/删除MySql数据

    前言 由于项目需要生成多条数据,并保存到数据库当中,在程序中封装了一个List集合对象,然后需要把该集合中的实体插入到数据库中,项目使用了Spring+MyBatis,所以打算使用MyBatis批量插入,应该要比循环插入的效果更好,由于之前没用过批量插入,在网上找了一些资料后最终实现了,把详细过程贴出来.供以后查阅和学习. java代码: 注意:这里循环的时候需new 出来新的对象,而不能通过循环改变属性的值就认为这是一个新的对象了,通俗的说就是new ReddemCode()要放在for循环的

  • Mybatis批量修改联合主键数据的两种方法

    最近遇上需要批量修改有联合主键的表数据,网上找了很多文章,最终都没找到比较合适的方法,有些只能支持少量数据批量修改,超过十几条就不行了. 最终自己摸索总结了两种方式可以批量修改数据. 第一种: <update id="updateMoreEmpOrg" parameterType="java.util.List"> update hr_emp_org <trim prefix="set" suffixOverrides=&quo

  • 详解MyBatis直接执行SQL查询及数据批量插入

    一.直接执行SQL查询: 1.mappers文件节选 <resultMap id="AcModelResultMap" type="com.izumi.InstanceModel"> <result column="instanceid" property="instanceID" jdbcType="VARCHAR" /> <result column="insta

  • Mybatis批量修改的操作代码

    1.修改的字段值都是一样的,id不同 <update id="batchUpdate" parameterType="String"> update cbp_order set status=1 where id in <foreach item="id" collection="array" open="(" separator="," close=")&q

  • mybatis学习之路mysql批量新增数据的方法

    接下来两节要探讨的是批量插入和批量更新,因为这两种操作在企业中也经常用到. mysql新增语句 insert into 表名(字段,字段...) values ( 值,值 ...):此种适合单条插入. 批量插入,一种可以在代码中循环着执行上面的语句,但是这种效率太差,下面会有对比,看看它有多差. 另一种,可以用mysql支持的批量插入语句, insert into 表名(字段,字段...) values ( 值,值 ...),( 值,值 ...),( 值,值 ...).... 这种方式相比起来,

  • 详解mybatis多对一关联查询的方式

    根据ID查询学生信息,要求该学生的教师和班级信息一并查出 第一种关联方式 1.修改实体类Student,追加关联属性,用于封装关联的数据 修改完以后重新生成get set方法还有toString方法 private Teacher teacher; private Classes classes; 2.修改TeacherMapper相关配置 1.接口类 增加 Teacher selectTeacherById(Integer tid); 2.xml映射文件 增加 <sql id="para

随机推荐