在 MyBatis 中,处理插入操作时获取主键的返回值是一个常见的需求。MyBatis 提供了几种方法来获取插入操作后生成的主键(如自动递增的主键)。
1. 通过 useGeneratedKeys
获取主键
最常用的方式是使用 useGeneratedKeys
属性,它能够自动获取数据库插入操作生成的主键并将其返回。
步骤:
-
在 Mapper XML 中配置
useGeneratedKeys
:- 在
<insert>
标签中,设置useGeneratedKeys="true"
,并指定keyProperty
属性,表示将生成的主键映射到哪个对象的属性上。
- 在
-
在实体类中定义一个主键字段,用来接收生成的主键值。
示例:
假设我们有一个 User
实体类和对应的 UserMapper
:
1. 实体类(User.java)
public class User {
private int id;
// 主键字段 private String name;
private int age;
// getters and setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2. Mapper 接口(UserMapper.java)
public interface UserMapper {
// 插入用户,并返回生成的主键
int insertUser(User user);
}
3. Mapper XML 配置(UserMapper.xml)
在 MyBatis 的 XML 映射文件中,配置 useGeneratedKeys
和 keyProperty
属性:
<mapper namespace="com.example.mapper.UserMapper">
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (name, age) VALUES (#{name}, #{age})
</insert>
</mapper>
useGeneratedKeys="true"
:表示 MyBatis 将自动获取插入操作生成的主键。keyProperty="id"
:表示将生成的主键值返回并映射到User
对象的id
属性。
4. 调用插入操作并获取主键
在 Service 或 DAO 层调用 insertUser
方法:
public class UserService {
@Autowired
private UserMapper userMapper;
public void addUser(User user) {
userMapper.insertUser(user);
// 插入后,user.getId() 将包含自动生成的主键值
System.out.println("插入的用户 ID:" + user.getId());
}
}
总结:
- 使用
useGeneratedKeys="true"
来启用主键返回。 - 通过
keyProperty
来指定返回的主键映射到哪个实体类的属性。
2. 使用 @Options
注解获取主键
如果你使用的是注解方式定义 SQL 语句,可以通过 @Options
注解来指定主键返回。
示例:
public interface UserMapper {
@Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUser(User user);
}
@Options(useGeneratedKeys = true, keyProperty = "id")
:表示插入操作生成的主键会自动回写到User
对象的id
属性。
3. 通过 SELECT LAST_INSERT_ID()
获取主键
如果你的数据库没有启用自动生成主键,或者你希望手动获取主键,你可以执行一个查询语句来获取最后插入的主键。这个方法通常与其他方法一起使用,但它不如 useGeneratedKeys
方法直接和高效。
示例:
在 MySQL 中,插入数据后可以通过 SELECT LAST_INSERT_ID()
获取最后插入的主键:
<mapper namespace="com.example.mapper.UserMapper">
<insert id="insertUser"> INSERT INTO users (name, age) VALUES (#{name}, #{age});
</insert>
<select id="getLastInsertId" resultType="int"> SELECT LAST_INSERT_ID();
</select>
</mapper>
然后在代码中使用 getLastInsertId()
获取主键:
public interface UserMapper {
void insertUser(User user);
int getLastInsertId();
}
使用时,在插入数据后调用 getLastInsertId()
来获取主键:
public class UserService {
@Autowired
private UserMapper userMapper;
public void addUser(User user) {
userMapper.insertUser(user);
int id = userMapper.getLastInsertId();
System.out.println("插入的用户 ID:" + id);
}
}
4. 通过返回值获取主键
某些情况下,如果你希望直接通过返回的 int
或 long
来获取主键(例如插入一条记录后,直接返回生成的主键),可以在 insert
方法中直接返回主键值。
示例:
<mapper namespace="com.example.mapper.UserMapper">
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
INSERT INTO users (name, age) VALUES (#{name}, #{age});
</insert>
</mapper>
public interface UserMapper {
@Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUser(User user);
}
这里 insertUser
会返回生成的主键值(int
类型)。
总结
useGeneratedKeys
是最常用的方法,MyBatis 会自动处理主键生成并返回。- 使用
@Options
注解来配置返回主键(适用于注解方式)。 - 通过
SELECT LAST_INSERT_ID()
或其他手动方式,可以在一些特定场景下获取主键。