72 mysql 的客户端和服务器交互 returnGeneratedKeys

前言

这里主要是针对如下 情况的讨论

比如我们 tz_zone 表有一个自增长的主键 id, 然后 客户端这边可以通过 PreparedStatement 相关的 api 来获取 服务端这边生成的自增长的 id

我们这里 来看一下 这个流程, 整体的 客户端 和 服务器的交互上面来看

问题来自于 主题:JDBC 插入数据返回数据主键

测试用例

测试用例如下, 一个简单的 insert 语句, 然后从 prepatedStatement 中获取 新增的记录生成的主键
登录后复制

plain 复制代码
/**
 * Test21GetGeneratedKeys
 *
 * @author Jerry.X.He
 * @version 1.0
 * @date 2023/10/9 17:01
 */
public class Test21GetGeneratedKeys {

    // Test21GetGeneratedKeys
    public static void main(String[] args) throws Exception {

        String url = "jdbc:mysql://192.168.220.132:3306/test_02?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&autoReconnectForPools=true";
        String username = "root";
        String password = "root";
        JdbcTemplate jdbcTemplate = Test14GenExpertSql.getMysqlJdbcTemplate(url, username, password);

        Connection con = jdbcTemplate.getDataSource().getConnection();
        PreparedStatement ps = con.prepareStatement("INSERT INTO `tz_zone`(`field1`) VALUES ('2023-07-25 00:00:00');", Statement.RETURN_GENERATED_KEYS);
        int updated = ps.executeUpdate();
        ResultSet rs = ps.getGeneratedKeys();
        rs.next();
        Long generatedId = rs.getLong(1);
        int x = 0;

    }

}

客户端这边获取 generated Keys

客户端这边获取 到的自增长的 id 来自于 this.getLastInsertId

8e60f716566df8eb3d00a3486f360ef0.png

this.getLastInsertId 来自于 目标 "insert into" 的执行, 这里是从目标语句的 响应结果中获取的 自增长的主键的值

e722d35d60eb8dfee82405f1dc018528.png

服务器这边的处理

服务器这边状态的 响应来自于这里, 在命令处理完成之后, 会 send_statement_stauts 的处理, 这里面会响应当前处理的信息, 比如 affectedRows, lastInsertId, serverInfo 等等

c962dc342345263a51515798499abfa5.png

然后响应给服务器这边的信息如下

服务器状态, 警告数量, 影响的行的数量, 自增长id, 额外的信息

5e814443d357d956e8bb58d9177016c6.png

Statement . RETURN_GENERATED_KEYS 标记的处理

这个就是 纯纯的客户端 这边的处理了, 如果没有 RETURN_GENERATED_KEYS 标记, 然后需要获取 响应信息, 则客户端这边直接 抛出异常

9dd5b88e0984bfba2540247778513127.png

相关推荐
IT 小阿姨(数据库)8 小时前
PostgreSQL 之上的开源时序数据库 TimescaleDB 详解
运维·数据库·sql·postgresql·开源·centos·时序数据库
颜大哦8 小时前
linux安装mysql
linux·运维·mysql·adb
学习3人组8 小时前
Node.js 网站服务器开发
运维·服务器·node.js
来知晓8 小时前
Linux:WSL内存空间管理之清完内存C盘可用空间不增问题解决
linux·运维·服务器
熊文豪9 小时前
openEuler 云原生实战:部署高性能 Redis 集群与压测分析
数据库·redis·云原生·openeuler
GTgiantech9 小时前
科普SFP 封装光模块教程
服务器·网络·数据库
深圳市恒讯科技9 小时前
如何在服务器上安装和配置数据库(如MySQL)?
服务器·数据库·mysql
言之。9 小时前
TiDB分布式数据库技术架构概述
数据库·分布式·tidb
万事大吉CC9 小时前
SQL表设计与约束教程
数据库·sql
wanhengidc10 小时前
云手机能够流畅运行大型游戏吗
运维·服务器·游戏·智能手机·云计算