场景介绍
开发过程中,我们经常性的会用到许多的中间表,用于数据之间的对应和关联。这个时候我们关联最多的就是ID,在一张表中插入数据后级联增加到关联表中。我们熟知的MyBatis在插入数据后返回的是插入成功的条数,那么这个时候我们想要得到相应的这条新增数据的ID,该怎么办呢?
例如:用户和角色的对应关系,在新增一个用户的时候就给他分配一个默认的角色。此时,需要先增加用户,获取新增完返回的用户id;然后根据角色id,一起插入到对应的用户角色表中(sys_user_role)。
编码实现
一、通过XML的形式,获取自增主键
<insert id="insert" parameterType="com.xxx.xxx.model.User" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
INSERT INTO
sys_user(login_name, password, salt, del_flag)
VALUES(
#{loginName,jdbcType=VARCHAR},
#{password,jdbcType=VARCHAR},
#{salt,jdbcType=VARCHAR},
#{delFlag,jdbcType=TINYINT}
)
</insert>
useGeneratedKeys为true,表示返回主键id的值。
keyProperty代表数据库中主键字段名。
keyColumn代表Java对象的成员属性名。
二、通过接口注解方式
// 返回主键字段id值
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("INSTER INTO sys_user (login_name, password, salt, del_flag) VALUES(#{loginName}, #{password}, #{salt}, #{delFlag})")
void insert(User user);
通过注解@Options分别设置参数useGeneratedKeys,keyProperty,keyColumn值
注意事项
在MyBatis中添加操作返回的是记录数并非记录主键id。因此,如果需要获取新添加记录的主键值,需要在执行添加操作之后,通过Java对象的xxx.getId()方法获取即可。
int row = userMapper.insert(user);
// 返回影响的行数
System.out.println("row = " + row);
// 通过Java对象获取主键属性值
System.out.println("id = " + user.getId());
扩展
如果是批量添加用户,那该如何获取主键呢?同样,可以使用XML的方法进行映射。
<insert id="insert" parameterType="com.xxx.xxx.model.User" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
INSERT INTO
sys_user(login_name, password, salt, del_flag)
VALUES
<foreach collection="list" separator="," item="item">
(
#{item.loginName,jdbcType=VARCHAR},
#{item.password,jdbcType=VARCHAR},
#{item.salt,jdbcType=VARCHAR},
#{item.delFlag,jdbcType=TINYINT}
)
</foreach>
</insert>