在 MyBatis 中,useGeneratedKeys="true"
和 keyProperty="id"
这两个属性是可选的,但它们的使用与否会影响插入操作后如何处理生成的主键。下面详细解释这两个属性可以不写时的情况:
1. 如果不写 useGeneratedKeys="true"
- 行为: 如果不设置此属性并且你的数据库表的主键是自增的,那么 MyBatis 将不会自动获取生成的主键值。即使你执行了插入操作,主键的值仍然为
null
或默认值。 - 后果: 你将无法在插入后直接得到生成的主键值,因此需要额外的步骤来查询该主键(例如,通过根据其他字段查找插入的记录)。
2. 如果不写 keyProperty="id"
- 行为: 如果不设置此属性,即使你启用了
useGeneratedKeys
,MyBatis 无法知道在哪个对象的哪个属性中保存生成的主键值。 - 后果: 主键将不会被赋值到任何对象属性中,你将没有办法在 Java 对象中访问这个主键。
示例
不使用 useGeneratedKeys
<insert id="insert">
INSERT INTO users (name) VALUES (#{name})
</insert>
在这种情况下,即便你插入了一条新记录,生成的主键不会被存储到 Java 对象中
使用 useGeneratedKeys
但不使用 keyProperty
<insert id="insert" useGeneratedKeys="true"> INSERT INTO users (name) VALUES (#{name}) </insert>
在这里,虽然你尝试使用了 useGeneratedKeys,但由于没有指定 keyProperty,生成的主键依然无法被访问
结论
- 可以不写: 这两个属性都可以选择不写,但这样做会导致无法获取插入操作后生成的主键值。
- 建议: 如果希望在插入之后能够获得生成的主键,强烈建议同时使用这两个属性。这样可以确保生成的主键能够正确地被赋值到对应的 Java 对象中,避免后续的查询和复杂性。
总之,在实际开发中,如果涉及到需要使用生成主键的场景,最好明确设置这两个属性,以达到最佳效果。
场景(模拟)
当然可以!下面是一个简单的场景例子,帮助你理解在什么情况下应该使用 useGeneratedKeys="true"
和 keyProperty="id"
这两个属性。
场景背景
假设我们正在开发一个用户管理系统,需要向数据库插入新用户的信息。用户表(users
)的结构如下:
CREATE TABLE users (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
在这个表中,id
是主键且为自增类型。这意味着每次插入新用户时,数据库会自动生成一个唯一的 id
。
Java 实体类
首先,我们定义一个 User
类来表示用户对象:
public class User {
private Long id; // 主键
private String name; // Getter 和 Setter 方法
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
MyBatis XML 映射文件
接下来,我们在 MyBatis XML 映射文件中定义插入操作,并使用 useGeneratedKeys
和 keyProperty
属性:
<mapper namespace="com.example.UserMapper">
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (name) VALUES (#{name})
</insert>
</mapper>
在服务层或控制器中,我们可以调用插入方法并查看生成的主键:
import com.example.User;
import com.example.UserMapper;
org.springframework.beans.factory.annotation.Autowired;
public class UserService {
@Autowired
private UserMapper userMapper;
public void addUser(String userName) {
User user = new User(); user.setName(userName);
userMapper.insert(user);
System.out.println("Generated User ID: " + user.getId());
}
}