背景
在项目中经常需要获取到插入数据的主键来保障后续操作,数据库中主键一般我们使用自增或者uuid()的方式自动生成。
使用
插入数据的时候就得到这个主键,就需要使用
useGeneratedKeys=“true” keyProperty=“id”
useGeneratedKeys设置为 true 时,表示如果插入的表id以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键id返回。
useGeneratedKeys参数只针对 insert 语句生效,默认为 false;
当useGeneratedKeys为true时,如果插入的表id以自增列为主键时,将会把该自增id返回。
代码
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into dish (name, category_id, price, image, description, create_time, update_time, create_user,update_user, status)
values (#{name}, #{categoryId}, #{price}, #{image}, #{description}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser}, #{status})
</insert>
</mapper>
也就是说在执行上面这个 insert 添加记录之后,我们就可以在代码中获取到数据库自动生成的主键ID
再接着看controller实现的时候的应用。
public void saveWithFlavor(DishDTO dishDTO) {
Dish dish = new Dish();
BeanUtils.copyProperties(dishDTO, dish);
//向菜品表插入1条数据
dishMapper.insert(dish);
//获取insert语句生成的主键值!!//
Long dishId = dish.getId();
List<DishFlavor> flavors = dishDTO.getFlavors();
if (flavors != null && flavors.size() > 0) {
flavors.forEach(dishFlavor -> {
dishFlavor.setDishId(dishId);
});
//向口味表插入n条数据
dishFlavorMapper.insertBatch(flavors);//后绪步骤实现
}
}
}
如果我们没有在xml中 在插入dish的时候使用
useGeneratedKeys="true" keyProperty="id"
那么我们在controller中,也就是下面这个代码,是没有办法获取到自动生成的Id的;
//获取insert语句生成的主键值!!//
Long dishId = dish.getId();