一、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进行修改
- 在service中 继承IService<对应的实体类>
public interface VppConsShuntDataService extends IService<VppConsShuntDataEntity> {}
- 在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);