当前位置: 首页 > article >正文

【MyBatis】useGeneratedKeyskeyProperty属性

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


http://www.kler.cn/a/407586.html

相关文章:

  • 分公司如何纳税
  • 第一个autogen与docker项目
  • Spark——安装步骤详细教程
  • 使用pandoc将latex转换成word(带参考文献)
  • Flink-Source的使用
  • C# NetworkStream用法
  • 积分商品编辑规格里积分未会显问题处理
  • Bugku CTF_Web——my-first-sqli
  • 使用Python生成F分布表并导出为Excel文件
  • linux从0到1——shell编程7
  • WPF绑定Bind方法合集,实时更新
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-transformer.py
  • 麒麟网络负载均衡与高可用方案实践
  • 【数据结构OJ】【图论】货币套汇(图路径)
  • 十、事件类型(鼠标事件、焦点.. 、键盘.. 、文本.. 、滚动..)、事件对象、事件流(事件捕获、事件冒泡、阻止冒泡和默认行为、事件委托)
  • 【Python入门第七讲】列表(List)
  • Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图
  • chinaskills_cloud_iaas.iso镜像
  • 数据库【锁】的分类
  • Typora+PicGo+云服务器搭建博客图床
  • Github 2024-11-23 Rust开源项目日报 Top10
  • KVM虚拟机拷贝与迁移
  • 【强化学习的数学原理】第03课-贝尔曼最优公式-笔记
  • uniapp记录在微信小程序端修改复选框的样式
  • 大数据面试题每日练习--HDFS是如何工作的?
  • 如何通过OpenSSL来创建自签名的CA证书?