关于批量添加遇到的坑

一,需求

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

二,问题

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


        insert into es_b_floor (floor_id, unit_id, floor_c) values
        
            (#{floor.floorId}, #{floor.unitId}, #{floor.floorC})
        

但是又遇到一个问题,添加的楼层是和楼有联系的,即每一条都有一个楼的id,但是楼也是刚添加上去的,并且id是自增长,所以前端传过来数据中并没有楼的id,如果先插入的话没有id也无法正确的查询出来刚才插入的楼是哪个。

最后还是解决了,感谢度娘


        insert into es_build
        
            build_id,
        
        
            #{buildId},
        
    

添加时insert标签加上useGeneratedKeys = "true" keyProperty = "buildId"这两个属性(貌似只有主键并且自增长才有用)

调用esBuild.getBuildId()直接可以得到id(便于观察,删掉不相关的代码)

 @Override
    public int insertManyEsBuild(EsBuild esBuild)
    {
        esBuild.getBuildId();
        return esBFloorMapper.insertManyEsBFloor(floors);
    }

三,补充

今天跟前端对接口猛然发现,原来楼栋也是批量添加的,那么就需要批量添加并返回id了,其实跟一个差不多,上代码


        insert into es_build (build_id) values
        
            (#{build.buildId})
        
    
(无关紧要的部分已删除)

只有一个区别就是keyProperty="list.buildId",表明返回的id是哪个字段(传过来的集合名字叫list)

mapper层

public int insertManyEsBuild(List 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 builds=new ArrayList<>();
        List units=new ArrayList<>();
        List 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);
            }
        }
    }
//无关此问题的代码以及删掉

你可能感兴趣的:(mybatis,java,开发语言)