Mybatis的主键返回

目录

问题背景

实现方法

业务实现

问题背景

通常我们会将数据库表的主键id设为自增。在我们新插入一条数据时,我们不需要手动设置其主键id,而让数据库自动生成该条记录的主键id,那么在插入一条记录后,如何得到数据库自动生成的这条记录的主键id呢?

例如:我们在进行一次新增数据库表的操作时,需要同时修改两张表,第二张表中插入的数据中含有第一张表中的主键ID,但是由于整个新增操作还没有完成,所以我们无法get其属性得到第一张表中的新增的数据的主键ID值。

那么我们该怎么做呢???

实现方法

第一个表中数据新增成功后,返回其主键:使用useGeneratedKeys(作用:需要主键值)keyProperty属性(作用:它的值是第一张表中我们希望赋值给第二张表中的数据)

例:

<!--    新增一条菜品分类   -->
    <insert id="insert" useGeneratedKeys="true" keyProperty="id"><!--useGeneratedKeys可以获得insert语句插入时所生成的主键值并赋值给传进来的参数的“id”属性 -->
    insert into dish (dish.name,category_id,dish.price, dish.image, dish.description, dish.status,dish.create_time, dish.update_time, dish.create_user, dish.update_user)
values (#{name},#{categoryId},#{price},#{image},#{description},#{status},#{createTime},#{updateTime},#{createUser},#{updateUser})

    </insert>

业务实现

@Autowired
    private DishMapper dishMapper;
    @Autowired
    private DishFlavorMapper dishFlavorMapper;
    //新增菜品和对应的口味
    @Override
    @Transactional //事务性注解,要么全成功、要么全失败
    public void saveWithFlavor(DishDTO dishDTO) {

        Dish dish = new Dish();
        //通过对象属性拷贝
        BeanUtils.copyProperties(dishDTO,dish);

        //菜品表插入1条数据
        dishMapper.insert(dish);

        //获取insert语句生成的主键值(主键返回)
        Long dishId = dish.getId();

        //向口味表插入n条数据
        List<DishFlavor> flavors = dishDTO.getFlavors();
        if(flavors != null && flavors.size() > 0){
            flavors.forEach(dishFlavor -> {
                dishFlavor.setDishId(dishId);
            });

            //批量插入这个集合对象
            dishFlavorMapper.insertBatch(flavors);
        }


    }

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值