一、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)的原理分析的更多相关文章

  1. MyBatis映射文件1(增删改、insert获取自增主键值)

    增删改 Mybatis为我们提供了<insert>.<update>.<delete>标签来对应增删改操作 在接口中写增删改的抽象方法 void addEmp(Em ...

  2. Mybatis获取数据库自增主键

    一般我们都为将表中主键列设置为自增,当我们执行插入语句时,比如这样 //测试添加 Employee employee = new Employee(null, "jerry4",n ...

  3. 深入分析Mybatis 使用useGeneratedKeys获取自增主键

    摘要 我们经常使用useGenerateKeys来返回自增主键,避免多一次查询.也会经常使用on duplicate key update,来进行insertOrUpdate,来避免先query 在i ...

  4. mybatis插入数据并获取主键值

    有时候我们的主键是自增的,但是我们想要在插入一条数据以后获取这条数据的主键值,而我们知道,mybatis执行完插入操作以后返回的是生效的记录数.那如何才能获取这个主键值呢. 1.在配置文件mapper ...

  5. MySQL 插入与自增主键值相等的字段 与 高并发下保证数据准确的实验

    场景描述: 表t2 中 有 自增主键 id  和 字段v  当插入记录的时候 要求 v与id 的值相等(按理来说这样的字段是需要拆表的,但是业务场景是 只有某些行相等 ) 在网上搜的一种办法是 先获取 ...

  6. mybatis 插入数据并返回主键值

    <insert id="insert" parameterType="com.pojo.TSubject" useGeneratedKeys=" ...

  7. Mybatis获取自增主键值

    1.配置文件变化 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLI ...

  8. SQL Server 插入数据后获得自增主键值

    通过SQLServer系统自带函数获取 String sql = "insert into goods values('" + TextBox1.Text + "',&q ...

  9. mybatis标签selectkey无法返回主键值

随机推荐

  1. Linux操作汇总

    添加环境变量 CMD,或添加到/etc/profile,或添加到各自账户下的~/.profile.(后两种需要重新source) export PATH=/home/alan/Desktop/arm- ...

  2. docker18.09.5 Dockerfile文件编写

    Dockerfile命令详解(超全版本)  https://www.cnblogs.com/dazhoushuoceshi/p/7066041.html 案例1 dockerfile文件内容: FRO ...

  3. BeanUtils使用

    1.BeanUtils.populate 可以把一个map中的属性拷贝到实体javaBean,例子: Student: package com.cy.model; import org.apache. ...

  4. linux下各安装包的安装方法

    <转>linux下各安装包的安装方法   一.rpm包安装方式步骤: 1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su -成root ...

  5. sass 和less 分别在循环 和超出省略方面的区别!

    这两天在迁项目,新项目支持less预处理器,之前是采用的sass,就出现一些冲突,好在有对应的转换方式,重点说下 我遇到的2个问题 1:超出省略 sass: 声明: 在需要的地方: less: 在使用 ...

  6. Ehcache3.4 XML配置硬盘存储

    最近开始学习使用Ehcache, 3.4的文档实在过于简单,尤其是对于XML配置,例子太少.相对于硬编码,我更偏爱灵活的XML配置,为了实现xml配置,摸索了两天,终于运行成功. ehcache.xm ...

  7. Linux系统中的计划任务

    在系统的工作管理中,我们经常会有需要去告诉电脑某些特定的时间执行一些操作,比如定时提醒工作人员需要做什么事情,或者在每天凌晨进行文件备份等等.这就需要某些命令来达成计划任务. 计划任务可以大体上分成两 ...

  8. WebApp的自动测试工具: Jenkins

    一.下载并安装(msi)https://jenkins.io/download/thank-you-downloading-windows-installer-stable/ 在安装过程这, 需要从p ...

  9. 去掉点击a标签时产生的虚线框

    1.直接给a 标签添加属性:onfocus="this.blur()" 即可 For Example: <a onfocus="this.blur()" ...

  10. 微信小程序报错:id 属性值格式错误。如不能以数字开头。

    出现这个报错时,相信很多人都排除过自己标签上写的id是否有以数字命名的,如果你排除了发现并没有,但是这个报错还是存在,那么我接下来分享的这个情况或者能报到你 这次我也遇到这个报错,最终找出问题所在 这 ...