关于批量添加遇到的坑

一,需求

今天遇到问题的需求是:当添加一栋楼时,把它包括的单元和楼层全部插入数据库中。

二,问题

批量添加已经很久没用过了,刚接到的时候一脸蒙,还好有度娘,经过一番搜索,批量添加的写出来了,上代码

<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);
            }
        }
    }
//无关此问题的代码以及删掉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值