【MyBatis】useGeneratedKeys&keyProperty属性

发布于:2024-11-29 ⋅ 阅读:(10) ⋅ 点赞:(0)

在 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 映射文件中定义插入操作,并使用 useGeneratedKeyskeyProperty 属性:

<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()); 
    } 
}