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

相关推荐
骇客野人13 小时前
Redis 完整安装部署方案(Linux,分【源码编译】+【Docker】两种,推荐生产用源码,测试快速用 Docker)
运维
比兔代理15 小时前
正向代理与反向代理技术辨析,为什么代理 IP 属于正向代理
服务器·网络·http·ip
Rain的Java大神之路16 小时前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
十二同学啊16 小时前
向量数据库:从核心原理到 RAG 与 Java 实战
数据库
Wang's Blog16 小时前
Java 接入Redis: 通用命令与键管理
java·服务器·redis
Wang's Blog16 小时前
Java 接入Redis: 列表集合与有序集合操作命令
java·服务器·redis
蓝速科技17 小时前
会议室门牌公告通知发布选型与落地指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
Ivanqhz17 小时前
SVD++算法
java·服务器·网络·深度学习·神经网络
chicheese17 小时前
Linux 面试速查表:从初级到高级,附高频场景答题模板
linux·运维
大海星辰79817 小时前
一次对账SQL“灵异事件”排查:NOT IN返回空集的坑
mysql