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

MyBatis中主键回填的两种实现方式

主键回填其实是一个非常常见的需求,特别是在数据添加的过程中,我们经常需要添加完数据之后,需要获取刚刚添加的数据 id,无论是 Jdbc 还是各种各样的数据库框架都对此提供了相关的支持,本文我就来和和大家分享下数据库主键回填在 MyBatis 中的两种实现思路。

框架来源于我们学过的基础知识,主键回填实际上是一个在 JDBC 中就被支持的写法,有的小伙伴可能不知道这一点,因此这里我先来说说在 JDBC 中如何实现主键回填。

JDBC 中实现主键回填其实非常容易,主要是在构造 PreparedStatement 时指定需要主键回填,然后在插入成功后,查询刚刚插入数据的 id ,示例代码如下:

public int insert(Person person) {Connection con = null;PreparedStatement ps = null;ResultSet rs = null;con = DBUtils.getConnection();ps = con.prepareStatement("INSERT INTO person(username,password,money) VALUES(?,?,?)", PreparedStatement.RETURN_GENERATED_KEYS);ps.setObject(1, person.getUsername());ps.setObject(2, person.getPassword());ps.setObject(3, person.getMoney());int i = ps.executeUpdate();rs = ps.getGeneratedKeys();int id = -1;if (rs.next()) {id = rs.getInt(1);}return id;
}

和普通的插入 SQL 不同之处主要体现在两个地方:

  1. 第一个是构造 PreparedStatement 时,多了一个参数,指定了需要主键回填。
  2. 在更新操作执行完成之后,调用 getGeneratedKeys ,然后又会获取到一个 ResultSet 对象,从这个游标集中就可以获取到刚刚插入数据的id。

这个是原生的写法,在 MyBatis 中,对此需求提供了两种不同的实现方案,下面分别来看。

框架写法

一般情况下,主键有两种生成方式:

  1. 主键自增长
  2. 自定义主键(一般可以使用UUID,或者类UUID)

如果是第二种,主键一般是在Java代码中生成,然后传入数据库执行插入操作,如果是第一个主键自增长,此时,Java 可能需要知道数据添加成功后的主键。

MyBatis 的基本用法就无需多说了,这也不是本文的重点,我们还是来看看 MyBatis 中主键回填的两种不同实现方式吧!

方式一

第一种方式比较简单,也是比较推荐的一种实现方式:

<insert >insert into t_book (b_name,author) values (#{name},#{author});
</insert>

这种方式比较简单,就是在插入节点上添加 useGeneratedKeys 属性,同时设置接收回传主键的属性。配置完成后,我们执行一个插入操作,插入时传入一个对象,插入完成后,这个对象的 id 就会被自动赋值,值就是刚刚插入成功的id。

推荐大家使用这种方式,原因很简单,这种方式实现简便省事。

方式二

第二种方式则是利用MySQL自带的 last_insert_id() 函数查询刚刚插入的id,示例代码如下:

language-java"><insert ><selectKey keyProperty="id" resultType="java.lang.Integer">SELECT LAST_INSERT_ID()</selectKey>insert into t_book (b_name,author) values (#{name},#{author});
</insert>

这种方式是在 insert 节点中添加 selectKey 来实现主键回填,实际上这种方式的功能更加丰富,因为 selectKey 节点中的 SQL 我们既可以在插入之前执行,也可以在插入之后执行(通过设置节点的 Order 属性为 AFTER 或者 BEFORE 可以实现),具体什么时候执行,还是要看具体的需求,如果是做主键回填,我们当然需要在插入 SQL 执行之后执行 selectKey 节点中的 SQL。

注意第二种方式一样也要通过设置 keyProperty 来指定将查询到的数据绑定到哪个属性上。

相关文章:

MyBatis中主键回填的两种实现方式

主键回填其实是一个非常常见的需求&#xff0c;特别是在数据添加的过程中&#xff0c;我们经常需要添加完数据之后&#xff0c;需要获取刚刚添加的数据 id&#xff0c;无论是 Jdbc 还是各种各样的数据库框架都对此提供了相关的支持&#xff0c;本文我就来和和大家分享下数据库主…...

Windows11如何打开ie浏览器

目录1.背景&#xff1a;2.方法一&#xff1a;在 edge 中配置使用 ie 模式3.方法二&#xff1a;通过 Internet 选项 打开1.背景&#xff1a; 昨天电脑自动从win10升级为win11了&#xff0c;突然发现电脑找不到ie浏览器了&#xff0c;打开全都是直接跳转到 edge 浏览器&#xff0…...

Linux:进程间通信

目录 进程间通信目的 进程间通信分类 管道 System V IPC POSIX IPC 什么是管道 站在文件描述符角度-深度理解管道 管道使用 管道通信的四种情况 管道通信的特点 进程池管理 命名管道 创建一个命名管道 命名管道的打开规则 命名管道通信实例 匿名管道与命名管道的…...

【java】将LAC改造成Elasticsearch分词插件

目录 为什么要将LAC改造成ES插件&#xff1f; 怎么将LAC改造成ES插件&#xff1f; 确认LAC java接口能work 搭建ES插件开发调试环境 编写插件 生成插件 安装、运行插件 linux版本的动态链接库生成 总结 参考文档 为什么要将LAC改造成ES插件&#xff1f; ES是著名的非…...

TPM 2.0实例探索3 —— LUKS磁盘加密(5)

接前文&#xff1a;TPM 2.0实例探索3 —— LUKS磁盘加密&#xff08;4&#xff09; 本文大部分内容参考&#xff1a; Code Sample: Protecting secret data and keys using Intel Platform... 二、LUKS磁盘加密实例 4. 将密码存储于TPM的PCR 现在将TPM非易失性存储器中保护…...

mybatisplus复习(黑马)

学习目标能够基于MyBatisPlus完成标准Dao开发能够掌握MyBatisPlus的条件查询能够掌握MyBatisPlus的字段映射与表名映射能够掌握id生成策略控制能够理解代码生成器的相关配置一、MyBatisPlus简介MyBatisPlus&#xff08;简称MP&#xff09;是基于MyBatis框架基础上开发的增强型工…...

【数据聚类|深度聚类】Deep Comprehensive Correlation Mining for Image Clustering(DCCM)论文研读

Abstract 翻译 最近出现的深度无监督方法使我们能够联合学习表示和对未标记数据进行聚类。这些深度聚类方法主要关注样本之间的相关性,例如选择高精度对来逐步调整特征表示,而忽略了其他有用的相关性。本文提出了一种新的聚类框架,称为深度全面相关挖掘(DCCM),从三个方面…...

CE认证机构有哪些机构?

CE认证机构有哪些机构&#xff1f; 所有出口欧盟的产品都需要办理CE证明&#xff0c;而电子电器以及玩具是强制性要做CE认证。很多人以为只有办理欧盟NB公告机构的CE认证才可以被承认&#xff0c;实际上并不是。那么&#xff0c;除了NB公告上的机构&#xff0c;还有哪些认证机…...

MYSQL5.7:Access denied for user ‘root‘@‘localhost‘ (using password:YES)解决方法

一、打开MySQL目录下的my.ini文件&#xff0c;在文件的[mysqld]下面添加一行 skip-grant-tables&#xff0c;保存并关闭文件;skip-grant-tables &#xff1a;跳过密码登录&#xff0c;登录时无需密码。my.ini &#xff1a;一般在和bin同目录下&#xff0c;如果没有的话可自己创…...

单目运算符、双目运算符、三目运算符

单目运算符是什么 单目运算符是指运算所需变量为一个的运算符 又叫一元运算符&#xff0c;其中有逻辑非运算符&#xff1a;&#xff01;、按位取 反运算符&#xff1a;~、自增自减运算符&#xff1a;&#xff0c;-等。 逻辑非运算符【&#xff01;】、按位取反运算符【~】、 自…...

离线数据仓库项目搭建——准备篇

文章目录&#xff08;一&#xff09;什么是数据仓库&#xff08;二&#xff09;数据仓库基础知识&#xff08;三&#xff09;数据仓库建模方式&#xff08;1&#xff09;星行模型&#xff08;2&#xff09;雪花模型&#xff08;3&#xff09;星型模型 VS 雪花模型&#xff08;四…...

十七、本地方法接口的理解

什么是本地方法? 1.简单来讲&#xff0c;一个Ntive method 就是一个Java调用非Java代码的接口.一个Native Method 是这样一个Java方法:该方法的实现由非Java语言实现&#xff0c;比如C,这个特征并非Java所特有&#xff0c;很多其他的编程语言都由这一机制&#xff0c;比如在C中…...

【halcon】模板匹配参数之金字塔级数

背景 今天&#xff0c;在使用模板匹配的时候&#xff0c;突然程序卡死&#xff0c;CPU直接飙到100%。最后排查发现是模板匹配其中一个参数 NumLevels 导致的&#xff1a; NumLevels: The number of pyramid levels used during the search is determined with numLevels. If n…...

jupyter lab安装和配置

jupyter lab 安装和配置 一、jupyter lab安装并配置 安装jupyterlab pip install jupyterlab启动 Jupyter lab默认会打开实验环境的&#xff0c;也可以自己在浏览器地址栏输入127.0.0.1:8888/lab 汉化 pip install jupyterlab-language-pack-zh-CN刷新一下网页&#xff0…...

用Docker搭建yolov5开发环境

拉取镜像 sudo docker pull pytorch/pytorch:latest 创建容器 sudo docker run -it -d --gpus "device0" pytorch/pytorch bash 查看所有容器 sudo docker ps -a 查看运行中的容器 sudo docker ps 进入容器 docker start -i 容器ID 将依赖包全都导入到requiremen…...

Apache Pulsar 云原生消息中间件之王

一、简介 pulsar&#xff0c;消息中间件&#xff0c;是一个用于服务器到服务器的消息系统&#xff0c;具有多租户、高性能等优势。 pulsar采用发布-订阅的设计模式&#xff0c;producer发布消息到topic&#xff0c;consumer订阅这些topic处理流入的消息&#xff0c;并当处理完…...

精选博客系列|公用事业中的VMware:在边缘重新定义价值

VMware 已经成为公用事业行业的核心。您可以在那里找到例如 VMware vSphere&#xff08;包括基础 Hypervisor ESXi 和 VMware vCenter 建立的整体控制平面&#xff09;的核心产品。来自软件定义的基础架构带来的诸多好处使 IT 团队将其先前基于硬件的系统转变为 VMware Cloud F…...

数字档案室测评的些许感悟

我是甲方&#xff0c;明明我家是档案“室”&#xff0c;为什么申请的是数字档案“馆”&#xff1f; 笔者正对着手里的一份方案苦笑&#xff0c;甲方爸爸是某机关单位档案室&#xff0c;方案最后的附件赫然写着几个大字&#xff1a;“申请国家级数字档案馆……“。这样的事屡见…...

Java 函数式编程实例

一、函数式编程概念 函数式编程是一种编程的范式和编程的方法论(programming paradigm)&#xff0c;它属于结构化编程的一种&#xff0c;主要的思想是把运算的过程尽量通过一组嵌套的函数来实现。 函数式编程的几个特点&#xff1a; 函数可以作为变量、参数、返回值和数据类…...

Ant design Chart onReady函数使用外部变量问题

一、问题描述封装了一个Chart组件&#xff0c;它接收一个boolean类型的props&#xff0c;根据这个boolean的true或false执行不同的操作。经过console.log验证&#xff0c;onReady函数只会在组件初次渲染时取到props值&#xff0c;不管后面的props变化成什么都无法重新取值。二、…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...