批量查询,修改,插入

一、mysql批量查询,根据多个字段查询多条数据,用list接收

<select id="selectShuntDataByCodeAndType" parameterType="java.util.List" resultType="com.cqlvc.vpp.domain.entity.record.VppConsShuntDataEntity">
        select <include refid="baseColumn"></include> from vpp_cons_shunt_data where (vpp_code,cons_no,shunt_code) in
        <if test="list != null and list.size() > 0">
            <foreach collection="list" item="consData" open="(" separator="," close=")">
                (#{consData.vppCode},
                #{consData.consNo},
                #{consData.shuntCode}
                )
            </foreach>
        </if>
    </select>

collection:对应mapper里面的方法参数,如果不是list,map和数组这三种,必须和方法的参数名一致;没有使用@Param的情况下,当传递的参数为数组时 需要将collection属性设置为 array;当传递的参数为List时 需要将collection属性设置为 list
item: 表示迭代过程中每个元素的别名,比如List里面封装的实体对象;
index:在list、array中,index为元素的序号索引。但是在Map中,index为遍历元素的key值,该参数为可选项;
open:前缀
close:后缀
separator:分隔符,表示迭代时每个元素之间以什么分隔。
二、批量修改,根据多个字段修改对应多条数据;

比如根据 vppCode,consNo,shuntCode这三个字段,修改
因为vpp_cons_shunt_data这个表的主键是id,使用雪花算法自动生成。所以使用这种方法进行修改。

<update id="updateAll" parameterType="java.util.List">
        update vpp_cons_shunt_data set (vpp_code,cons_no,shunt_name,shunt_code,shunt_type,shunt_volt_code,shunt_resource_type)
        values
        <if test="list != null and list.size() > 0">
        <foreach collection="list" item="vppConsShuntDataEntity" open="(" separator="," close=")">
            (#{vppConsShuntDataEntity.vppCode},
            #{vppConsShuntDataEntity.consNo},
            #{vppConsShuntDataEntity.shuntName},
            #{vppConsShuntDataEntity.shuntCode},
            #{vppConsShuntDataEntity.shuntType},
            #{vppConsShuntDataEntity.shuntVoltCode},
            #{vppConsShuntDataEntity.shuntResourceType})
        </foreach>
        </if>
        where 1=1 and (vpp_code,cons_no,shunt_code) in
        <if test="list != null and list.size() > 0">
            <foreach collection="list" item="consData" open="(" separator="," close=")">
                (#{consData.vppCode},
                #{consData.consNo},
                #{consData.shuntCode}
                )
            </foreach>
        </if>

    </update>

这方法只适用于字段较少的表,如过表字段比较多,可以通过这几个字段批量查询到list,遍历要修改的list,将查询出来的主键id赋值给需要修改的list,再使用mybatisPlus进行修改

  1. 在service中 继承IService<对应的实体类>
public interface VppConsShuntDataService extends IService<VppConsShuntDataEntity> {}
  1. 在serviceImpl中继承ServiceImpl<对应的mapper, 对应的实体类>
public class VppConsShuntDataServiceImpl extends ServiceImpl<VppConsShuntDataMapper, VppConsShuntDataEntity> implements VppConsShuntDataService {
@Override
    public ResponseData updateConsShuntData(ObjDataDTO objDataDTO) {
        List<VppConsShuntDataEntity> vppConsShuntDataEntityList = new ArrayList<>();
        objDataDTO.getConsShuntDataVo().stream().forEach(consShuntDataVO -> {
            consShuntDataVO.getShuntDataVo().stream().forEach(shuntDataVo -> {
                VppConsShuntDataEntity vppConsShuntDataEntity = new VppConsShuntDataEntity();
                BeanUtil.copyProperties(shuntDataVo, vppConsShuntDataEntity);
                vppConsShuntDataEntity.setVppCode(objDataDTO.getVppCode());
                vppConsShuntDataEntity.setConsNo(consShuntDataVO.getConsNo());
                vppConsShuntDataEntityList.add(vppConsShuntDataEntity);
                if (consShuntDataVO.getShuntDevDataVo() != null && consShuntDataVO.getShuntDevDataVo().size() > 0) {
                    objDataDTO.setShuntDevDataVo(consShuntDataVO.getShuntDevDataVo());
                    vppShuntDevDataService.updateVppShuntDevData(objDataDTO);
                }
            });
        });
//上面不重要,vppConsShuntDataEntityList是前端传的需要修改的数据参数。
        //先查询出要修改的数据的list,将id添加到要修改的数据的list,再根据主键修改
        List<VppConsShuntDataEntity> vppConsShuntDataEntityList1 = vppConsShuntDataMapper.selectShuntDataByCodeAndType(vppConsShuntDataEntityList);
        vppConsShuntDataEntityList1.stream().forEach(vppConsShuntDataEntity1 -> {
            vppConsShuntDataEntityList.stream().forEach(vppConsShuntDataEntity -> {
                if (vppConsShuntDataEntity.getConsNo().equals(vppConsShuntDataEntity1.getConsNo()) &&
                        vppConsShuntDataEntity.getVppCode().equals(vppConsShuntDataEntity1.getVppCode()) &&
                        vppConsShuntDataEntity.getShuntCode().equals(vppConsShuntDataEntity1.getShuntCode())) {
                    vppConsShuntDataEntity.setId(vppConsShuntDataEntity1.getId());
                }
            });
        });
        //如果存在就修改,不存在就添加
        if (this.saveOrUpdateBatch(vppConsShuntDataEntityList)) {
            return ResponseData.success();
        }
        return ResponseData.fail();
    }
}

上面就是使用mybatis进行批量修改

三、批量插入数据
1.获取需要插入的list,使用mybatisplus的saveBatch方法

 @Override
    public ResponseData addConsShuntData(ObjDataDTO objDataDTO) {
        List<VppConsShuntDataEntity> vppConsShuntDataEntityList = new ArrayList<>();
        objDataDTO.getConsShuntDataVo().stream().forEach(consShuntDataVO -> {
            consShuntDataVO.getShuntDataVo().stream().forEach(shuntDataVo -> {
                VppConsShuntDataEntity vppConsShuntDataEntity = new VppConsShuntDataEntity();
                BeanUtil.copyProperties(shuntDataVo, vppConsShuntDataEntity);
                vppConsShuntDataEntity.setVppCode(objDataDTO.getVppCode());
                vppConsShuntDataEntity.setConsNo(consShuntDataVO.getConsNo());
                vppConsShuntDataEntityList.add(vppConsShuntDataEntity);
                if (consShuntDataVO.getShuntDevDataVo() != null && consShuntDataVO.getShuntDevDataVo().size() > 0) {
                    objDataDTO.setShuntDevDataVo(consShuntDataVO.getShuntDevDataVo());
                    vppShuntDevDataService.addVppShuntDevData(objDataDTO);
                }
            });
        });
//上面不重要
        if (this.saveBatch(vppConsShuntDataEntityList)) {
            return ResponseData.success();
        }
        return ResponseData.fail();
    }

注意:在使用this.的时候,@Transactional事务会失效,所以可以在使用的类里注入自己,然后用自己来调用,

//比如上面的可以改成这样
@Autowired
VppConsShuntDataService vppConsShuntDataService;
vppConsShuntDataService.saveBatch(vppConsShuntDataEntityList);
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值