32. MyBatis中的selectKey标签是什么?如何实现主键回填?

ops/2024/9/20 2:23:15/ 标签: mybatis

<selectKey>标签是MyBatis中用于在插入数据之前或之后生成主键并将其回填到对象中的一个功能标签。这个标签通常用于处理那些不支持自动生成主键的数据库,或者在需要使用复杂的逻辑来生成主键的场景。

1. <selectKey>标签的作用

  • 主键生成:通过<selectKey>标签,可以在插入操作前或插入操作后执行一条SQL语句,用于生成主键值。

  • 主键回填:生成的主键值会自动回填到插入数据对应的对象属性中,以便在后续的业务逻辑中使用。

2. <selectKey>标签的属性

  • keyProperty:指定要回填主键的对象属性名。

  • resultType:指定主键的返回类型,如intlongstring等。

  • order:指定主键生成的时机,BEFORE表示在执行插入SQL语句之前生成主键,AFTER表示在执行插入SQL语句之后生成主键。

  • statementType:指定SQL语句的类型,默认为STATEMENT,也可以设置为PREPARED

3. <selectKey>标签的使用场景

3.1 在插入前生成主键

假设我们使用一个数据库序列(如Oracle的sequence)来生成主键,可以通过在插入操作之前生成主键并回填。

示例:使用Oracle的sequence在插入前生成主键

  • 数据库表结构

    • users表:包含idusernameemail字段。

  • Java实体类

    public class User {private Integer id;private String username;private String email;// Getters and Setters
    }
  • MyBatis映射文件

    <insert id="insertUser"><selectKey keyProperty="id" resultType="int" order="BEFORE">SELECT seq_users.NEXTVAL FROM DUAL</selectKey>INSERT INTO users(id, username, email)VALUES(#{id}, #{username}, #{email})
    </insert>
  • 解释

    • keyProperty="id":表示生成的主键值将被设置到User对象的id属性中。

    • resultType="int":表示生成的主键值的类型为int

    • order="BEFORE":表示在执行插入操作之前生成主键。

    • SELECT seq_users.NEXTVAL FROM DUAL:这是Oracle的序列生成语句,用于获取下一个主键值。

3.2 在插入后生成主键

在某些数据库(如MySQL)中,主键可以在插入数据后由数据库自动生成,例如通过自增字段。这时可以通过<selectKey>在插入操作后获取生成的主键值并回填。

示例:使用MySQL的自增主键在插入后获取主键

  • 数据库表结构

    • users表:包含id(自增)、usernameemail字段。

  • Java实体类

    public class User {private Integer id;private String username;private String email;// Getters and Setters
    }
  • MyBatis映射文件

    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">INSERT INTO users(username, email)VALUES(#{username}, #{email})
    </insert>
  • 解释

    • useGeneratedKeys="true":表示使用JDBC的getGeneratedKeys方法来获取数据库自动生成的主键。

    • keyProperty="id":表示将生成的主键值回填到User对象的id属性中。

使用<selectKey>获取自增主键的示例

有时可能希望使用<selectKey>来手动获取自增主键:

<insert id="insertUser">INSERT INTO users(username, email)VALUES(#{username}, #{email})<selectKey keyProperty="id" resultType="int" order="AFTER">SELECT LAST_INSERT_ID()</selectKey>
</insert>
  • 解释:

    • order="AFTER":表示在插入操作完成后获取主键。

    • SELECT LAST_INSERT_ID():用于获取MySQL数据库中最后插入记录的自增主键值。

4. 主键回填的过程

<selectKey>标签被使用时,MyBatis会在插入操作前后执行指定的SQL语句,并将生成的主键值自动回填到对应的对象属性中。这一过程的典型步骤如下:

  1. 执行<selectKey>标签内的SQL:如果orderBEFORE,在执行插入操作之前执行<selectKey>中的SQL语句,并将生成的主键值设置到对象中。如果orderAFTER,则在插入操作完成后执行SQL。

  2. 回填主键:将生成的主键值回填到指定的Java对象属性中。

  3. 执行插入操作:将回填主键的对象插入到数据库中。

5. 使用<selectKey>的优缺点

优点:

  • 灵活性高:可以使用复杂的逻辑生成主键,支持各种数据库特性,如Oracle的sequence

  • 跨数据库支持:适用于不支持自动主键生成的数据库。

  • 控制力强:可以精确控制主键生成的时机和方式,满足各种业务需求。

缺点:

  • 额外的SQL查询:在order="BEFORE"的情况下,会在插入操作前额外执行一条SQL语句,可能会稍微影响性能。

  • 复杂度增加:使用<selectKey>需要手动配置SQL语句和主键映射,增加了配置的复杂度。

总结

<selectKey>标签在MyBatis中提供了一种灵活的方式来生成和回填主键,适用于各种场景,包括使用数据库序列、自增主键、UUID等。根据具体需求,可以选择在插入操作之前或之后生成主键,并自动将主键值回填到对象中。合理使用<selectKey>可以帮助我们更好地管理数据库中的主键,确保数据的一致性和完整性。


http://www.ppmy.cn/ops/113206.html

相关文章

15.3 JDBC数据库编程

15.3 JDBC数据库编程 15.3.1 创建数据库和表 创建一个名为webstore的数据库&#xff0c;并向其中添加数据&#xff0c;代码如下: 1.创建数据库 CREATE TABLE products( id int PRIMARY KEY, pname VARCHAR(20) brand VARCHAR(20), price FLOAT(7,2), stock SMALLINT, ) …

[Python数据可视化] Plotly:交互式数据可视化的强大工具

引言&#xff1a; 在数据分析和可视化的世界中&#xff0c;Plotly 是一颗耀眼的明星。它是一个开源的交互式图表库&#xff0c;支持多种编程语言&#xff0c;包括 Python、R 和 JavaScript。Plotly 的强大之处在于它能够创建出既美观又具有高度交互性的图表&#xff0c;使得数据…

AWS Lambda 与 Java

AWS Lambda 与 Java&#xff1a;在无服务器计算中构建高效的云端应用 一、AWS Lambda 简介 AWS Lambda 是 Amazon Web Services&#xff08;AWS&#xff09;提供的一种无服务器计算服务&#xff0c;它允许开发者在无需管理服务器的情况下运行代码。AWS Lambda 的核心思想是“…

Java 中使用 Redis 的几种方式优缺点对比

一、为什么选择 Redis&#xff1f; 在分析 Java 中使用 Redis 的不同方式之前&#xff0c;我们需要了解为什么 Redis 在分布式应用中如此重要。以下是 Redis 在 Java 项目中常见的应用场景&#xff1a; 缓存&#xff1a;通过将热点数据缓存到 Redis&#xff0c;可以减少数据库…

安卓逆向之NDK内存管理

一&#xff1a;内存管理 在 JNI 中&#xff0c;内存管理是一个重要的主题&#xff0c;尤其是在处理 Java 和 C 之间的对象时。以下是一些关键点和最佳实践&#xff0c;以确保有效的内存管理。 1. 局部引用管理 局部引用&#xff1a;在 JNI 中&#xff0c;调用 Java 方法时会…

【自动化测试】常见的自动化遍历工具以及如何选择合适的自动化遍历工具

引言 自动化遍历测试通常依赖于特定的工具来实现应用的自动操作和测试 文章目录 引言一、常见的自动化遍历工具1.1 Appium1.2 Selenium1.3 Calabash1.4 Robot Framework1.5 Espresso1.6 XCTest1.7 Macaca1.8 TestComplete1.9 UiAutomator1.10 总结 二、如何选择合适的自动化遍历…

Spring Boot- 数据库相关问题

Spring Boot 与数据库相关问题及其解决方案 1. 引言 Spring Boot简化了Java企业级应用的开发&#xff0c;尤其在与数据库交互方面提供了诸多便利。Spring Boot提供了多种数据库集成方案&#xff0c;涵盖关系型数据库&#xff08;如MySQL、PostgreSQL等&#xff09;与非关系型…

好用的ai写作有哪些?5个软件帮助你快速进行ai写作

好用的ai写作有哪些&#xff1f;5个软件帮助你快速进行ai写作 AI写作工具正变得越来越流行&#xff0c;能够帮助用户更快速、高效地完成各种写作任务&#xff0c;包括生成文章、写小说、改进语法等。以下是5个非常好用的AI写作软件&#xff0c;它们可以帮助你快速进行AI写作&a…

面试—多线程

目录 线程的创建方式 线程的生命周期 线程同步的方法 多线程内存可见性 线程安全问题 线程的创建方式 继承Therad类 定义一个类继承Therad类 重写run()方法&#xff08;线程实际执行的逻辑&#xff09; 创建类的对象&#xff0c;调用start()方法开启线程 实现Runnable接口…

云计算实训48——k8s环境搭建(详细版)

1.创建主机、设置ip、设置hostname 2.设置免密登录 # 生成私钥 [rootk8s-master ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa already exists. Overwrite (y/n)? y Enter passphr…

App结合3D形象的技术实现选择

在为App添加3D人物交互效果时&#xff0c;可以采用多种技术&#xff0c;具体选择取决于你的目标平台&#xff08;iOS、Android、跨平台&#xff09;以及项目的复杂性和需求。 以下是几种常用技术及其特点&#xff1a; 游戏引擎技术 游戏引擎提供了强大的3D图形渲染和交互功能&…

区块链学习笔记3--以太坊

智能合约&#xff1a;跑在以太坊系统中的代码合同&#xff0c;其实质是一段代码。目前已经存在180多万个智能合约。 智能合约能表达&#xff1a;规则明确&#xff0c;不受主观因素影响的业务。 智能合约能表达&#xff1a;规则不轻易修改的业务 如果业务的规则经常变化&#x…

【C++】关键字、命名空间、输入和输出、缺省参数的深入了解

目录 一、C关键字二、命名空间2.1 为什么存在命名空间&#xff1f;2.2 命名空间定义2.3 命名空间使用 三、C输入&输出四、缺省函数4.1 缺省函数分类 总结 一、C关键字 C一共有63个关键字 其中红色圈出来的32个关键字同时也是C语言的 二、命名空间 2.1 为什么存在命名空间…

.net core8 使用JWT鉴权(附当前源码)

说明 该文章是属于OverallAuth2.0系列文章&#xff0c;每周更新一篇该系列文章&#xff08;从0到1完成系统开发&#xff09;。 该系统文章&#xff0c;我会尽量说的非常详细&#xff0c;做到不管新手、老手都能看懂。 说明&#xff1a;OverallAuth2.0 是一个简单、易懂、功能强…

【Vmware16安装教程】

&#x1f4d6;Vmware16安装教程 ✅1.下载✅2.安装 ✅1.下载 官网地址&#xff1a;https://www.vmware.com/ 百度云盘&#xff1a;Vmware16下载 123云盘&#xff1a;Vmware16下载 ✅2.安装 1.双击安装包VMware-workstation-full-16.1.0-LinuxProbe.Com.exe&#xff0c;点击…

requests-html的具体使用方法有哪些?

‌requests-html是一个功能强大的Python库&#xff0c;用于发送HTTP请求和解析HTML内容。它的使用方法包括安装库、基本使用、发送带有参数的请求、图片抓取实战案例、解析网页内容、执行JavaScript代码、使用CSS选择器来查找元素、继续跟踪链接并获取内容等。‌ ‌安装request…

Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)

题目&#xff1a;*18.29(某个目录下的文件数目) 编写一个程序&#xff0c;提示用户输入一个目录&#xff0c;然后显示该目录下的文件数。 和上一题(18.28)的思路差不多&#xff0c;把找到文件后累加大小到变量变成计数1即可。 Java语言程序设计基础篇_编程练习题*18.28 (非递…

Leetcode Hot 100刷题记录 -Day14(矩阵置0)

矩阵置0 问题描述&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a;…

STL模板库

一、模板 1、什么是模板 C语言中提供一种自动生成代码的技术&#xff0c;这种技术可以让程序员在编程时不需要考虑数据类型&#xff0c;而专注思考业务逻辑和算法&#xff0c;程序员只需要编写好代码的整体框架&#xff0c;具体的数据类型由使用者提供&#xff0c;这就叫模板…

JavaDS —— 图

图的概念 图是由顶点集合以及顶点之间的关系组成的一种数据结构&#xff1a;G &#xff08;V&#xff0c;E&#xff09; 其中 V 表示的是顶点集合 &#xff1a; V { x | x 属于某个数据对象集} 是有穷非空集合 E 叫做边的集合 &#xff1a; E {(x, y) | x, y 属于 V} 或者 …