Mybatis useGeneratedKeys 填充自增主键值(使用Mysql)的原理分析
一、Mybatis配置
<insert id="insert" parameterType="com.test.TestDO"
keyProperty="id" useGeneratedKeys="true">
useGeneratedKeys=“true”时 , mybatis会将自增ID值 填充到 TestDO对象中的 id (keyProperty指定)属性。
二、JDBC
java.sql.Statement对象 执行 executeUpdate
int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException;
其中, returnGenerateKeys 的枚举定义在java.sql.Statement中
int RETURN_GENERATED_KEYS = 1; int NO_GENERATED_KEYS = 2;
指定为 RETURN_GENERATED_KEYS时,JDBC 协议要求JDBC实现能返回 自增主键的值。
通过java.sql.Statement对象的 getGeneratedKeys()方法可以取得 包含自增主键值的 ResultSet对象。
三、Mysql
Mysql JDBC 在执行 executeUpdate 时,
mysql server服务器返回的数据包(ResultSetImpl对象)中 包含了两个相关的值:
/** How many rows were affected by UPDATE/INSERT/DELETE? */
protected long updateCount; /** Value generated for AUTO_INCREMENT columns */
protected long updateId = -1; //此次插入的第一个自增ID值(单条插入,批量插入相同)
有了这两个值, 在getGeneratedKeys()时, 从updateId 开始 ,加 updateCount 次,便得到了此次
插入的所有自增ID值。
比如: 数据库自增ID 当前是 99, 通过JDBC批量插入5条数据,执行插入后,updateId值为100, updateCount为5;
那么getGeneratedKeys()返回的ResultSet对象中包含的自增ID 为 100,101,102,103,104 。
单条插入的好理解一点,对于批量插入的如何理解 值的连续性呢 ?
对于Mysql, 包含自增主键的表 对 有一个特殊的表锁,可以理解为自增主键列锁,insert语句执行前需要获取该锁(不影响update操作),
也就是当批量插入(insert ..values 形式 或 Statement.executeBatch() )时,不会有别的插入操作会进来,所以可以保证 批量插入的自增ID值是连续的。
四、Mybatis
Mybatis 利用 JDBC协议中 该机制,在批量插入(接收List<TestDO>对象) 时,根据getGeneratedKeys()的返回接口,顺序写入List中的TestDO对象中。
时间比较仓促,写的比较粗糙,不够详细,不过 大致 原理逻辑 理清楚了。
至于JDBC为何要规定单独接口获取自增主键ID, 又为何在executeUpdate中将 是否返回自增主键值 作为附加参数,
Mysql 如何封装JDBC协议数据包, 如何实现自增主键的表级锁等等,还请见谅。
文中有不当之处,还望各位大佬斧正。
Mybatis useGeneratedKeys 填充自增主键值(使用Mysql)的原理分析的更多相关文章
- MyBatis映射文件1(增删改、insert获取自增主键值)
增删改 Mybatis为我们提供了<insert>.<update>.<delete>标签来对应增删改操作 在接口中写增删改的抽象方法 void addEmp(Em ...
- Mybatis获取数据库自增主键
一般我们都为将表中主键列设置为自增,当我们执行插入语句时,比如这样 //测试添加 Employee employee = new Employee(null, "jerry4",n ...
- 深入分析Mybatis 使用useGeneratedKeys获取自增主键
摘要 我们经常使用useGenerateKeys来返回自增主键,避免多一次查询.也会经常使用on duplicate key update,来进行insertOrUpdate,来避免先query 在i ...
- mybatis插入数据并获取主键值
有时候我们的主键是自增的,但是我们想要在插入一条数据以后获取这条数据的主键值,而我们知道,mybatis执行完插入操作以后返回的是生效的记录数.那如何才能获取这个主键值呢. 1.在配置文件mapper ...
- MySQL 插入与自增主键值相等的字段 与 高并发下保证数据准确的实验
场景描述: 表t2 中 有 自增主键 id 和 字段v 当插入记录的时候 要求 v与id 的值相等(按理来说这样的字段是需要拆表的,但是业务场景是 只有某些行相等 ) 在网上搜的一种办法是 先获取 ...
- mybatis 插入数据并返回主键值
<insert id="insert" parameterType="com.pojo.TSubject" useGeneratedKeys=" ...
- Mybatis获取自增主键值
1.配置文件变化 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLI ...
- SQL Server 插入数据后获得自增主键值
通过SQLServer系统自带函数获取 String sql = "insert into goods values('" + TextBox1.Text + "',&q ...
- mybatis标签selectkey无法返回主键值
随机推荐
- 闲话ACES(修订)
最近身边的人见面就聊ACES,ACES俨然已经是行业热点了. ACES的确更高效的解决了色彩一致性的问题,这是符合历史进程的(+1s),无疑值得肯定.但由于色彩管理意识不强,关于ACES的认识就存在着 ...
- Windows本地解决MySql插入中文乱码问题
JSP页面输入的数据也要转化UTF8的编码字符串在传人数据库 一劳用逸 在 MySQL 的安装目录下有一个 my.ini 配置文件,通过修改这个配置文件可以一劳永逸的解决乱码问题.在这个配置文件中 [ ...
- InnoDB 存储引擎的特点及优化方法
InnoDB: InnoDB 引擎是MySQL数据库的另一个重要的存储引擎.被包含在所有的二进制安装包里面.和其它的存储引擎相比.InnoDB引擎的优点是支持兼容ACID的事物.以及参数完整性(有 ...
- LeetCode【108. 将有序数组转换为二叉搜索树】
又是二叉树,最开始都忘记了二叉搜索树是什么意思,搜索了一下: 二叉搜索树:左节点都小于右节点,在这里就可以考虑将数组中的中间值作为根节点 平衡二叉树:就是左右节点高度不大于1 树就可以想到递归与迭代, ...
- 【01】团饱和图:(一)EHM定理
团饱和图:(一)EHM定理 据A. Hajnal考证,术语"饱和性",即saturation,最早由前苏联数学家A. A. Zykov在1949年引入,用于研究线性复形,但是他的工 ...
- 学习oracle存储过程
--创建存储过程create or replace procedure BCPS.getApplyDate(applyno varchar2)as a_date date;begin select a ...
- (整理) .NET IIS性能优化
本文收集了部分性能优化的方式,缓存.压缩.线程池调整等等,仅供参考. 1 .NET 程序中的调整 程序Sqlhelper中使用缓存 使用JSON序列化器(Jil)取代Json.NET 2 .NET 程 ...
- Oracle数据库中OVER()函数的了解
1.over函数介绍: 开窗函数,Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行. ...
- golang 统计uint64 数字二进制存储中1的数量
package main import ( "fmt") // pc[i] is the population count of i.var pc [256]byte fun ...
- Ubuntu离线安装docker
1.先安装依赖libltdl7_2.4.6-0.1_amd64.deb 下载链接http://archive.ubuntu.com/ubuntu/pool/main/libt/libtool/libl ...