目录
问题背景
通常我们会将数据库表的主键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);
}
}