一、使用JDBC方式返回主键id
在MyBatis中,我们可以通过使用keyProperty和useGeneratedKeys属性实现在执行插入操作时返回主键id。但是,这种方式适用于支持JDBC 3.0或更高版本,并且我们必须使用支持自动键生成的数据库。
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
insert into user (username, password, phone) values (#{username}, #{password}, #{phone})
</insert>
上述示例代码中,我们通过keyProperty="id"指定了返回id值,并且useGeneratedKeys="true"告诉MyBatis使用自动生成的主键值。
二、使用Mapper接口方法返回主键id
除了使用JDBC方式返回主键id,我们还可以通过Mapper接口方法实现。具体做法是在Mapper接口中定义一个返回主键id的方法,并在对应的XML映射文件中实现该方法。
例如,我们可以在UserMapper接口中定义以下方法:
int addUser(User user);
在XML映射文件中,我们可以使用selectKey元素实现返回主键id。如下所示:
<insert id="addUser" parameterType="User">
insert into user (username, password, phone) values
(#{username}, #{password}, #{phone})
<selectKey keyProperty="id" order="AFTER" resultType="Long">
select LAST_INSERT_ID()
</selectKey>
</insert>
上述示例代码中,我们在插入操作完成后,使用<selectKey>元素获取插入的主键值,并将其赋值给keyProperty="id"指定的属性。
三、使用@Options注解返回主键id
在MyBatis 3.4.2及以后的版本中,我们还可以使用@Options注解实现返回主键id。具体做法是在Mapper接口方法上添加@Options注解,并指定对应属性值即可。
例如,在UserMapper接口中,我们可以添加以下注解:
@Insert("insert into user (username, password, phone) values (#{username}, #{password}, #{phone})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int addUser(User user);
上述示例代码中,我们使用@Options注解指定useGeneratedKeys = true告诉MyBatis使用自动生成的主键值,并指定keyProperty和keyColumn属性分别指定返回主键值的属性和数据库表中主键id的列名。
四、小结
以上是在MyBatis中正确返回主键id的三种常用方法。我们可以根据实际情况选择合适的方式,并通过合理的配置来提高代码的可维护性和可读性。