一,需求
今天遇到问题的需求是:当添加一栋楼时,把它包括的单元和楼层全部插入数据库中。
二,问题
批量添加已经很久没用过了,刚接到的时候一脸蒙,还好有度娘,经过一番搜索,批量添加的写出来了,上代码
<insert id="insertManyEsBFloor">
insert into es_b_floor (floor_id, unit_id, floor_c) values
<foreach collection="list" item="floor" separator=",">
(#{floor.floorId}, #{floor.unitId}, #{floor.floorC})
</foreach>
</insert>
但是又遇到一个问题,添加的楼层是和楼有联系的,即每一条都有一个楼的id,但是楼也是刚添加上去的,并且id是自增长,所以前端传过来数据中并没有楼的id,如果先插入的话没有id也无法正确的查询出来刚才插入的楼是哪个。
最后还是解决了,感谢度娘
<insert id="insertEsBuildReturnId" parameterType="EsBuild" useGeneratedKeys = "true" keyProperty = "buildId">
insert into es_build
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="buildId != null">build_id,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="buildId != null">#{buildId},</if>
</trim>
</insert>
添加时insert标签加上useGeneratedKeys = "true" keyProperty = "buildId"这两个属性(貌似只有主键并且自增长才有用)
调用esBuild.getBuildId()直接可以得到id(便于观察,删掉不相关的代码)
@Override
public int insertManyEsBuild(EsBuild esBuild)
{
esBuild.getBuildId();
return esBFloorMapper.insertManyEsBFloor(floors);
}
三,补充
今天跟前端对接口猛然发现,原来楼栋也是批量添加的,那么就需要批量添加并返回id了,其实跟一个差不多,上代码
<insert id="insertManyEsBuild" useGeneratedKeys="true" keyProperty="list.buildId">
insert into es_build (build_id) values
<foreach collection="list" item="build" separator=",">
(#{build.buildId})
</foreach>
</insert>
(无关紧要的部分已删除)
只有一个区别就是keyProperty="list.buildId",表明返回的id是哪个字段(传过来的集合名字叫list)
mapper层
public int insertManyEsBuild(List<EsBuild> list);
然后你只需要在service层里插入,再循环这个list就可以得到id了
@Override
public int insertManyEsBuild(EsBuild esBuild) {
//将传过来的数字、字母转成ascII码,相减确定插入多少栋楼
int range=Integer.valueOf(esBuild.getEnd())-Integer.valueOf(esBuild.getBegin())+1;
int begin=Integer.valueOf(esBuild.getBegin());
//楼栋集合、单元集合、楼层集合
List<EsBuild> builds=new ArrayList<>();
List<EsBUnit> units=new ArrayList<>();
List<EsBFloor> floors = new ArrayList<>();
//循环插入条数次,每循环一次就在楼栋集合中添加一个,这些楼栋只有名字不一样
for(int i=1;i<=range;i++){
EsBuild build = new EsBuild();
//注意这里需要新建个对象的,否则插入到楼栋集合的是相同的楼栋
BeanUtils.copyProperties(esBuild,build);
//将ASII码转成String类型作为名字插入楼栋
String name=String.valueOf((char)(begin+i-1));
build.setBuildNum(name);
builds.add(build);
}
//批量插入数据库
esBuildMapper.insertManyEsBuild(builds);
//循环刚刚插入的楼栋集合此时就可以用getBuildId()方法得到id了
for(EsBuild build : builds){
for(int j=1;j<=Integer.parseInt(build.getUnitNum());j++){
EsBUnit unit =new EsBUnit();
unit.setBuildId(build.getBuildId());
units.add(unit);
}
}
}
//无关此问题的代码以及删掉