数据库中主键基本都设置为自增,当我们要插入一条数据想要获取这条数据的 Id 时,就可使用 Mybatis 中的 useGeneratedKeys 属性。
背景
这里以 苍穹外卖 中的 新增菜品 功能为例,有 菜品表(dish table)和 口味表(dish_flavor table),两表的字段如下所示。
dish表
dish_flavor表
其中 dish_id 为逻辑外键,当新增菜品时,纪要插入菜品信息,也要保存对应的口味信息。因为当插入数据时无法直接获取到菜品的主键(dish表中的id值),所以无法给逻辑外键(dish_flavor 中的dish_id 字段)赋值,此时就可以通过 useGeneratedKeys 来操作。
代码
DishMapper.xml
<mapper namespace="com.sky.mapper.DishMapper">
<!--useGeneratedKeys表示要返回自增主键, 返回结果保存到 id 字段中-->
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into dish
(name, category_id, price, image, description, status, create_time, update_time, create_user, update_user)
values
(#{name}, #{categoryId}, #{price}, #{image}, #{description}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})
</insert>
</mapper>
DishFlavorMapper.xml
<mapper namespace="com.sky.mapper.DishFlavorMapper">
<insert id="insertBatch">
insert into dish_flavor(dish_id, name, value) values
<foreach collection="flavors" item="flavor" separator=",">
(#{flavor.dishId}, #{flavor.name}, #{flavor.value})
</foreach>
</insert>
</mapper>