Mybatis 之useGeneratedKeys注意点

news2024/10/2 22:27:45

一.例子

Order.java

public class Order {
	private Long id;
	private String serial;
}



orderMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" 
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.vic.mybatis.dao.OrderDao">
	<insert id="createOrder" useGeneratedKeys="true" keyProperty="id">
		insert into t_order(serial) values (#{serial})
	</insert>
</mapper>



OrderDao.java
@Mapper
public interface OrderDao {
    public int createOrder(Order order);
}



OrderServiceImpl.java
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {

    @Resource
    private OrderDao orderDao;

    @Override
    public int createOrder(Order order) {
    	// 这个result是否就是插入数据成功后返回的主键ID?
    	int id = orderDao.createOrder(order);
    	log.info(" *****插入数据后返回的id: " + id + " *****");
    	log.info(" *****插入数据后返回的id: " + order.getId() + " *****");
        return result;
    }
}

大家应该懂得都懂哈,下面就围绕useGeneratedKeys探讨上面这两行输出的内容

若数据库支持自动生成主键(比如 MySQL 和 SQL Server),则可以设置 useGeneratedKeys=“true”,表明使用自增主键获取主键值策略,然后再利用 keyProperty 属性指定对应的主键属性,也就是 Mybatis 获取到主键值后,将这个值封装给 JavaBean 的哪个属性。

前提就是你的数据库的的那个字段必须是自增的字段 然后你的mybatis 才可以设置这个字段是一个自增的字段

二. 官网说明

mybatis对于mapper中 useGeneratedKey的描述

(insert and update only) This tells MyBatis to use the JDBC getGeneratedKeys method to retrieve keys generated internally by the database (e.g. auto increment fields in RDBMS like MySQL or SQL Server). Default: false.

mybatis对于Configuration中useGeneratedKey的描述

Allows JDBC support for generated keys. A compatible driver is required. This setting forces generated keys to be used if set to true, as some drivers deny compatibility but still work (e.g. Derby). Default: false.

mybatis对于注解映射中useGeneratedKey

@Options This annotation provides access to the wide range of switches and configuration options that are normally present on the mapped statement as attributes

@Options注解提供了对广泛开关和配置选项的访问,这些开关和配置选项通常作为属性出现在映射语句中,就是也就是说这个配置了后,它会直接作为属性出现在映射语句中,会覆盖上面Configuration(setting)中的配置

三.Mybatis中的useGeneratedKeys

3.1、对于Configuration(setting)中useGeneratedKey
<settings>
	<setting name="useGeneratedKeys" value="true" />
</settings>

在执行insert成功之后可以获取到数据库自动生成的主键ID,因为在settings元素中设置useGeneratedKeys是全局生效的,但实际是只会对接口映射器(没有同时配置@Options注解情况下)产生影响,对xml映射器不起效。

3.2、对于mapper中useGeneratedKey
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" 
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.vic.mybatis.dao.OrderDao">
	<insert id="createOrder" useGeneratedKeys="true" keyProperty="id">
		insert into t_order(serial) values (#{serial})
	</insert>
</mapper>

在mapper(xml)中配置的useGeneratedKeys属性只会对当前mapper(xml映射器)产生影响,且在settings元素中设置的全局useGeneratedKeys参数值对于mapper(xml映射器)不产生任何作用。

3.3、对于注解映射中useGeneratedKey
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert into t_order(serial) values(#{serial})")
Integer createOrder(Order order);

在同时在Configuration(setting) 和 接口映射器中都添加了useGeneratedKeys属性, 无论属性值是否相同, 接口映射器的优先级会高于Configuration(setting) 的优先级;

也就说,不管你在Configuration(setting) 中设置useGeneratedKeys 为 true 或者 false,只要你在接口映射器中设置了@Options(useGeneratedKeys = true), 那么就会返回主键ID,如果@Options(useGeneratedKeys = false),那么就不会返回主键ID

四.总结前面的问题

设置了useGeneratedKeys = true的情况下,执行insert(或者update)后,会返回主键ID,那么我在问题中上面OrderServiceImpl.java中输出两个信息里面, 第一个输出是执行状态,第二是主键ID。
那么在执行完createOrder方法后返回的到底是什么?

在这里插入图片描述
所以说第一个打印返回的是影响行数

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

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

相关文章

java学习--多线程

多线程 了解多线程 ​ 多线程是指从软件或者硬件上实现多个线程并发执行的技术。 ​ 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程&#xff0c;提升性能。 并发和并行 并行&#xff1a;在同一时刻&#xff0c;有多个指令在CPU上同时执行并发&#xff1…

20230217使AIO-3399J开发板上跑通Android11系统

20230217使AIO-3399J开发板上跑通Android11系统 2023/2/17 15:45 1、解压缩SDK&#xff1a;rk3399-android-11-r20211216.tar.xzrootrootrootroot-X99-Turbo:~$ tar xvf rk3399-android-11-r20211216.tar.xz 2、编译U-boot&#xff1a; rootrootrootroot-X99-Turbo:~/rk3399-a…

没有接口文档的怎样进行接口测试

前言&#xff1a; 在进行接口测试之前&#xff0c;一般开发会提供接口文档&#xff0c;给出一些接口参数和必要熟悉&#xff0c;便于我们编写接口脚本。但如果没有提供接口开发文档的请求下&#xff0c;我们该如何编写接口测试脚本呢&#xff1f;在编写测试脚本前要做哪些必要…

一台电脑安装26个操作系统(windows,macos,linux)

首先看看安装了哪些操作系统1-4: windows系统 四个5.Ubuntu6.deepin7.UOS家庭版8.fydeOS9.macOS10.银河麒麟11.红旗OS12.openSUSE Leap13.openAnolis14.openEuler(未安装桌面UI)15.中标麒麟&#xff08;NeoKylin&#xff09;16.centos17.debian Edu18.fedora19.oraclelinux20.R…

CCNP350-401学习笔记(1-50题)

1、Which function does a fabric edge node perform in an SD-Access deployment?A. Connects endpoints to the fabric and forwards their traffic. B. Encapsulates end-user data traffic into LISP. C. Connects the SD-Access fabric to another fabric or external La…

YOLOv5:GitHub两万八Star项目

来源&#xff1a;投稿 作者&#xff1a;王同学 编辑&#xff1a;学姐 Yolov5详解 官方源码仓库&#xff1a;https://github.com/ultralytics/yolov5 相关论文&#xff1a;未发表&#xff08;改进点都被你们抢先发了&#xff09; 0 前言 截止到2022年7月&#xff0c;Yolov5项…

docker目录迁移流程

概述 在安装测试最新版本的HOMER7的过程中&#xff0c;docker作为基础工具碰到一些问题&#xff0c;针对问题进行总结。 docker的默认工作目录在/var目录&#xff0c;而在我们的环境中&#xff0c;/var目录空间预留不足&#xff0c;随着docker的运行&#xff0c;/var目录空间…

WiFi网络带宽、流量监控管理

当您的组织拥有越来越多的有线和无线设备时&#xff0c;有必要在预算、性能和安全性之间取得准确的平衡。尽管无线设备可以为用户提供灵活性&#xff0c;但鉴于其动态性质&#xff0c;发现和管理这些设备可能极具挑战性。 为用户提供功能性无线网络性能&#xff0c;同时确保没…

Spire.Office 8.2.2 for NET 开年之喜

Spire.Office for .NET对文档的操作包括打开&#xff0c;创建&#xff0c;修改&#xff0c;转换&#xff0c;打印&#xff0c;浏览 Word、Excel、PowerPoint 和 PDF 文档&#xff0c;以及将数据从数据源导出为常用的文档格式&#xff0c;如&#xff1a;Word&#xff0c;Excel&a…

每天10个前端小知识 【Day 16】

&#x1f469; 个人主页&#xff1a;不爱吃糖的程序媛 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域新星创作者、CSDN内容合伙人&#xff0c;专注于前端各领域技术&#xff0c;成长的路上共同学习共同进步&#xff0c;一起加油呀&#xff01; ✨系列专栏&#xff1a;前端…

【老王读Spring Transaction-6】spring-tx与DataSource连接池整合的原理

06spring-tx与DataSource连接池的原理前言Spring 版本正文事物连接: Spring-managed transactional Connectionsspring-tx 与 DataSource 的整合SpringBoot 默认使用的 DataSource 连接池是 Hikari事物连接的关闭/释放: 并不是真正的关闭小结前言 javax.sql.DataSource 是 jav…

2月,还是不要跳槽

新年已经过去&#xff0c;马上就到金三银四跳槽季了&#xff0c;一些不满现状&#xff0c;被外界的“高薪”“好福利”吸引的人&#xff0c;一般就在这时候毅然决然地跳槽了。 在此展示一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;还是挺有必…

十四、vue3项目如何使用three.js

近期在开发过程中&#xff0c;因为项目已经接近尾声&#xff0c;就需要对项目中的数据进行整合&#xff0c;而数据看板不失为一个比较直观的展现形式。在数据看板中3D的展现形式是比较流行的展现形式&#xff0c;那么如何在项目引入一个大的场景&#xff0c;并且能够和后台发生…

【NGINX入门指北】Nginx Web 架构实验

Nginx Web 架构实验 文章目录Nginx Web 架构实验一、动态网站结构二、LNMP 动态网站环境部署三、fastcgi & php-fpm&#xff1a;四、php-fpm初始化配置五、Nginx Location、六、Nginx Rewrite七、CA&HTTPS八、Nginx 的平滑升级一、动态网站结构 资源 资源文件识别——…

数据结构---时间复杂度

专栏&#xff1a;数据结构 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;开学数据结构&#xff0c;接下来会慢慢坑新数据结构的内容&#xff01;&#xff01;&#xff01;&#xff01; 时间复杂度前言1.算法效率1.1如何衡量一个算法的好坏1.2算法的复杂度2.时间复杂度2.1大…

Leetcode力扣秋招刷题路-0073

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 73. 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;mat…

Seata1.5.2安装配置(nacos)+部署

一、seata服务端下载&#xff0c;下载方式介绍两种入口&#xff0c;如下&#xff1a; 1. seata官网 (http://seata.io/zh-cn/blog/download.html) 下载中心 找到对应版本&#xff0c;下载 binary 即可。 下载包名为&#xff1a;seata-server-1.5.2.zip 2. github上下载 Rel…

HIVE 基础(一)

目录 启动hive 方式一 方式二 修改hdfs上给定文件执行的读写权限 创建数据库 查看数据库 查看数据库详细信息 查看当前数据库 创建表 查看建表语句 查看表信息 删除表 添加数据 查看表数据 删除数据库 强制删除数据库 启动hive 方式一 [roothadoop1 ~]# hive 方…

遥感数字图像处理

遥感数字图像处理 来源&#xff1a;慕课北京师范大学朱文泉老师的课程 遥感应用&#xff1a;遥感制图、信息提取 短期内了解知识结构–>有选择的剖析经典算法原理–>系统化知识结构、并尝试实践应用 跳出算法&#xff08;尤其是数学公式&#xff09; 关注原理及解决问…

PowerShell中的对象是神马?

在PowerShell中,无处不在体现出一个概念,这个概念是什么呢?就是对象,对象是面向对象的语言中非常重要的概念,PowerShell的底层是.net,也是面向对象的语言,因此它也继承了面向对象的语言的语法特性。但是很多人在使用PowerShell 语言的时候会觉得有些疑惑,到底什么是Pow…