数据库主键ID自增,两种方法获取插入数据库那条数据自动生成的主键ID值

目录

1. 前言

2. 适用于 MyBatis 框架

2.1 获取单条插入语句生成的ID

2.2 获取集合插入生成的多条数据的ID

3. 适用于 MyBatisPlus 框架

3.1 获取单条数据插入生成的ID

3.2 获取集合插入数据生成的多条数据的ID

4. 小结


1. 前言

在开发过程中,我们可能会遇到这样的一种情况,我们保存一条数据。

如果这条数据的主键ID是由用户决定的,这样我们在获取主键ID的时候,只需要让前端的同时传递给我们就可以了;

如果主键ID设置为自增,是在用户新增数据操作时自动生成的,在后续业务逻辑中需要使用生成的主键ID值,我们又该如何获取呢?本篇我们就来说说两种常用方法获取自动生成的主键ID;

2. 适用于 MyBatis 框架

2.1 获取单条插入语句生成的ID

在SQL映射文件中添加 useGeneratedKeys="true" keyProperty="id"

如下,我定义一个插入Product 实体接口

// @Mapper 注释标注当前类为数据访问层接口
@Mapper
public interface ProductMapper {// 定义一个插入接口Integer insertProduct(@Param("product") Product product);}

在对应的 ProductMappper.xml SQL映射语句中,只需要在 <insert> 中添加 useGeneratedKeys="true" keyProperty="id" 这两个属性即可。

SQL语句中并没有传入ID。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.haust.mapper.ProductMapper"><insert id="insertProduct" useGeneratedKeys="true" keyProperty="id" parameterType="com.haust.entity.Product">insert into product (`name`,`price`,`color`) values (#{product.productName},#{product.productPrice},#{product.productColor})</insert></mapper>

我们来做个测试,可以看到,创建的实体对象中我并没有传入ID值,只传递了 name,price,color 三个属性值

    @Testpublic void testInsertProduct(){Product product = new Product();product.setProductName("电视机");product.setProductPrice(2000.00);product.setProductColor("red");productMapper.insertProduct(product);System.out.println(product);}

运行测试方法,就可以在控制台看到打印的商品信息,如下图,数据库自动生成的ID=14;

2.2 获取集合插入生成的多条数据的ID

在 ProductMapper 接口中自定义 insertAll 插入多条数据接口

@Mapper
public interface ProductMapper extends BaseMapper<Product> {Integer insertAll(@Param("productList") List<Product> productList);
}

 在对应的 ProductMapper.xml 文件中编写对应的 SQL 语句,使用动态SQL语句的写法

<insert id="insertAll" parameterType="com.haust.entity.Product" useGeneratedKeys="true" keyProperty="id">insert into product (name,price,color)values<foreach collection="productList" item="product" separator="," >(#{product.productName},#{product.productPrice},#{product.productColor})</foreach>
</insert>

编写测试类

    @Testpublic void testInsert(){ArrayList<Product> list = new ArrayList<Product>();Product product = new Product();product.setProductName("电脑");product.setProductPrice(5999.00);product.setProductColor("white");list.add(product);Product product2 = new Product();product2.setProductName("洗衣机");product2.setProductPrice(999.00);product2.setProductColor("red");list.add(product2);Product product3 = new Product();product3.setProductName("冰箱");product3.setProductPrice(1999.00);product3.setProductColor("black");list.add(product3);productMapper.insertAll(list);System.out.println(list);// 获取ID集合ArrayList<Long> ids = new ArrayList<Long>();list.forEach(item ->{ids.add(item.getId());});System.out.println(ids);}

运行方法,可以在控制台看到批量插入成功,并通过遍历获取到自动生成的ID集合; 

3. 适用于 MyBatisPlus 框架

3.1 获取单条数据插入生成的ID

MyBatisPlus 框架自带的插入方法会在插入成功之后将方法回写到实体对象参数中;

我们都知道,MyBatisPlus 为提供了单表的增上改查方法,在MyBatis框架的基础上做了增强,我们仍以刚才的 Product 表为例,使用MyBatisPLus 实现获取自动生成主键ID。

第一步:修改实体类,添加注释

@Data
@TableName("product") // @TableName 注释是MyBatisPlus提供的注释,用于标注当前实体类对应数据库的哪张表
public class Product {// @TableId("id") 指定数据主键为 id,类型type为自增@TableId(value = "id", type = IdType.AUTO)private Long id;// @TableField("name") 标注当前String字段name为普通字段,对应product数据库表中的字段name,下方同理@TableField("name")private String productName;@TableField("price")private Double productPrice;@TableField("color")private String productColor;@TableField("production_date")private Date productionDate;
}

第二步:修改Mapper接口,继承BaseMappper接口

@Mapper
public interface ProductMapper extends BaseMapper<Product> {
}

单表增上改查接口都在BaseMapper接口中定义好了,直接继承使用即可,不需要写xml文件,除非是自定义新增接口需要额外写;

    @Testpublic void testInsert(){Product product = new Product();product.setProductName("电脑");product.setProductPrice(6999.00);product.setProductColor("black");int insert = productMapper.insert(product);System.out.println(product);}

运行测试方法,打印 product 商品信息,可以发现我们没有传入主键ID的值,数据自动生成的ID=15,并写入到了 product 对象中,我们打印 product 就会显示出来ID,接上了刚才的14。

在实际的开发过程中,如果需要使用ID,在执行完插入操作之后,直接调用 product.getId() 即可获取到生成的主键ID值。

3.2 获取集合插入数据生成的多条数据的ID

MyBatisPlus 提供了多条插入数据,但是在 Service 业务层接口方法,mapper 层只提供了单条数据插入接口,要使用集合插入,需要继承 IService 接口,泛型为实体泛型 Product。

public interface ProductService extends IService<Product> {
}

实现类继承 ServiceImpl 类并添加两个泛型,第一个泛型填写对应的 Mapper 接口,第二个泛型填写对应的实体类 Product 泛型;

@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
}

书写测试类

    @Testpublic void testInsert(){ArrayList<Product> list = new ArrayList<Product>();Product product = new Product();product.setProductName("电脑");product.setProductPrice(6999.00);product.setProductColor("black");list.add(product);Product product2 = new Product();product2.setProductName("洗衣机");product2.setProductPrice(999.00);product2.setProductColor("black");list.add(product2);Product product3 = new Product();product3.setProductName("冰箱");product3.setProductPrice(1999.00);product3.setProductColor("black");list.add(product3);productService.saveBatch(list);System.out.println(list);// 获取ID集合ArrayList<Long> ids = new ArrayList<Long>();list.forEach(item ->{ids.add(item.getId());});}

运行测试类,打印 list 集合,如果要获取所有ID,遍历 list 集合即可,代码中我已经写好了,运行如下图,可以看到获取到了生成的ID集合。

 

4. 小结

其实上述两种方法没有本质区别,只是框架不一样。

如果在实际开发过程中,你的公司没有使用 MyBatisPlus 框架,那就选择第一种方法加入 useGeneratedKeys="true" keyProperty="id" 即可;

如果你的公司使用了 MyBatisPlus 框架,基本不需要做额外操作,因为实际开发过程中也很少会有插入语句需要去自定义的,直接使用 MyBatisPlus 提供的足以应对业务需求;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/2898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCompass 大模型评测实战——作业

OpenCompass 大模型评测实战——作业 一、基础作业1.1、使用 OpenCompass 评测 internlm2-chat-1_8b 模型在 C-Eval 数据集上的性能1.1.1、安装基本环境1.1.2、解压数据集1.1.3、查看支持的数据集和模型1.1.4、启动评测 二、进阶作业2.1、将自定义数据集提交至OpenCompass官网 …

2024春季春日主题活动策划方案

2024解冻派对“春日浪漫”主题活动策划方案-32P 方案页码&#xff1a;32页 文件格式&#xff1a;pptx 方案简介&#xff1a; 春来一季&#xff0c;新生欢喜 花香丨微风丨阳光 活动唤起【春日浪漫记忆】&#xff01; 年轻人不一样的派对活动 可以与朋友/小朋友/家人互动…

深度学习-线性代数

目录 标量向量矩阵特殊矩阵特征向量和特征值 标量由只有一个元素的张量表示将向量视为标量值组成的列表通过张量的索引来访问任一元素访问张量的长度只有一个轴的张量&#xff0c;形状只有一个元素通过指定两个分量m和n来创建一个形状为mn的矩阵矩阵的转置对称矩阵的转置逻辑运…

03-JAVA设计模式-访问者模式

访问者模式 什么是访问者模式 访问者模式&#xff08;Visitor Pattern&#xff09;是软件设计模式中的一种行为模式&#xff0c;它用于将数据结构中的元素与操作这些元素的操作解耦。这种模式使得可以在不修改数据结构的情况下添加新的操作。 在访问者模式中&#xff0c;我们…

图文教程 | Git安装配置、常用命令大全以及常见问题

前言 因为多了一台电脑&#xff0c;平时写一些代码&#xff0c;改一些文件&#xff0c;用U盘存着转来转去特别麻烦。于是打算用Git管理我的文件&#xff0c;方便在两个终端之间传输数据啥的。也正好给新电脑装好Git。 &#x1f4e2;博客主页&#xff1a;程序源⠀-CSDN博客 &…

HFSS端口介绍2---波端口

前面我们讨论了Lumped Port设定相关的内容,这节我们继续讨论Wave Port(波端口)使用相关的问题。 波端口使用范围 封闭结构:如波导、同轴电缆等 包含多个传播模式的模型 端口平面在求解区域外的模型 模型中包含均匀的波导或者传输线结构 波端口的大小 对于封闭的传输线结构:边…

视频教程下载:用ChatGPT的 API 开发AI应用指南

通过这门关于 OpenAI API 和 ChatGPT API 的全面课程&#xff0c;在您的应用中释放人工智能的力量。随着人工智能技术的快速发展&#xff0c;比以往任何时候都更重要的是保持领先地位&#xff0c;并为您的项目利用这些尖端工具。在本课程中&#xff0c;您将深入了解人工智能驱动…

物联网硬件设计开发全攻略:十大关键阶段深度解析

为物联网应用设计开发高效稳定的硬件系统本身是一项既复杂又精细的艰巨任务。看似小巧的物联网设备一般由软件、固件和硬件组件组成&#xff0c;其中&#xff0c;硬件组件更是占据了约80%的成本与开发挑战。那么&#xff0c;为何硬件部分如此棘手&#xff1f;在这篇文章中&…

x汽车登陆网站登陆rsa加密逆向

声明&#xff1a; 本文章内容仅供学习交流&#xff0c;不用于其他其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c; 各位看官好哇&#xff0c;今天给大家带来一篇web自动化逆向的文章&#xff0c;如下图当前我…

芯科科技大大简化面向无电池物联网的能量采集产品的开发

芯科科技推出其迄今最高能量效率且支持能量采集功能的无线SoC 中国&#xff0c;北京 – 2024年4月22日 – 致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;…

超星图书转成PDF格式

转为pdf 为避免浪费您的时间&#xff0c;本篇转载文章不值得花费您的宝贵时间阅读 方法一 感谢医学插画动画杜鹏 Roison An两位提供的方法&#xff0c;经试验后简化了一下&#xff0c;得出以下方法:1、使用超星打开你想要转换的图书2、依次打开本书的所有页面&#xff0c;不要…

Property ‘auth‘ does not exist on type ‘AGCApi‘.

Property ‘auth’ does not exist on type ‘AGCApi’. 解决 清理项目重新运行模拟器就可以了

CentOS-7安装clickhouse并允许其他主机登录

一、通用设置 1、配置主机名 hostnamectl set-hostname --static 主机名2、修改hosts文件 vim /etc/hosts 输入&#xff1a; 192.168.15.129 master 192.168.15.133 node1 192.168.15.134 node2 192.168.15.136 node33、 保持服务器之间时间同步 yum install -y ntpdate &…

Java | Leetcode Java题解之第42题接雨水

题目&#xff1a; 题解&#xff1a; class Solution {public int trap(int[] height) {int n height.length;if (n 0) {return 0;}int[] leftMax new int[n];leftMax[0] height[0];for (int i 1; i < n; i) {leftMax[i] Math.max(leftMax[i - 1], height[i]);}int[] …

云南旅游攻略

丽江景点 Day1 ——丽江古城 丽江古城是一个充满文化和历史的地方&#xff0c;拥有丰富的景点和活动。 推荐游玩&#xff1a; 参观标志性建筑&#xff1a;大水车是丽江古城的标志性建筑&#xff0c;可以在这里拍照留念。 探索中心广场&#xff1a;四方街是古城的中心&#xf…

【第6节】Lagent AgentLego 智能体应用搭建

目录 1 基础课程2 安装环境2.1 教程要求2.2 安装 Lagent 和 AgentLego 3 实践操作3.1 Lagent&#xff1a;轻量级智能体框架3.1.1 Lagent Web Demo 使用3.1.2 用 Lagent 自定义工具 3.2 AgentLego&#xff1a;组装智能体“乐高”3.2.1 AgentLego 直接使用部分3.2.2 AgentLego We…

C++笔记:类和对象(一)->封装

类和对象 认识类和对象 先来回忆一下C语言中的类型和变量&#xff0c;类型就像是定义了数据的规则&#xff0c;而变量则是根据这些规则来实际存储数据的容器。类是我们自己定义的一种数据类型&#xff0c;而对象则是这种数据类型的一个具体实例。类就可以理解为类型&#xff0c…

二维码存储图片如何实现?相册二维码的制作技巧

如何将照片生成二维码后存储展示&#xff1f;现在很多人会将图片生成二维码以后&#xff0c;用于分享或者储存的用途&#xff0c;减少个人内存的占用量&#xff0c;而且分享照片也会更加的方便&#xff0c;只需要扫描二维码就可以让其他人查看图片。 想要制作图片二维码的步骤…

CLHLS交叉滞后模型和广义估计方程一起用发文2区 | 公共数据库周报(4.10)

零基础CHARLS发论文&#xff0c;不容错过&#xff01; 长期回放更新指导&#xff01;适合零基础&#xff0c;毕业论文&#xff0c;赠送2011-2020年CHARLS清洗后的数据全套代码 CHARLS公共数据库 CHARLS数据库简介中国健康与养老追踪调查(China Health and Retirement Longitudi…

C. Inhabitant of the Deep Sea

本题链接&#xff1a;Problem - C - Codeforces 题目&#xff1a; 样例&#xff1a; 输入 6 4 5 1 2 4 3 4 6 1 2 4 3 5 20 2 7 1 8 2 2 2 3 2 2 15 1 5 2 7 5 2输出 2 3 5 0 2 2 思路&#xff1a; 数学模拟。 根据题意&#xff0c;一前一后的攻击&#xff0c;攻击k次后&…