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

相关推荐
getapi2 分钟前
注塑件的费用构成
linux·服务器·ubuntu
鸽芷咕18 分钟前
DrissionPage 成 CANN 仓库爆款自动化工具:背后原因何在?
运维·python·自动化·cann
爱学习的阿磊19 分钟前
使用Fabric自动化你的部署流程
jvm·数据库·python
枷锁—sha25 分钟前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
池央26 分钟前
CANN 算子生态的深度演进:稀疏计算支持与 PyPTO 范式的抽象层级
运维·人工智能·信号处理
Maynor99628 分钟前
OpenClaw 玩家必备:用 AI 自动追踪社区最新动态
java·服务器·人工智能
郝学胜-神的一滴32 分钟前
深入解析C/S模型下的TCP通信流程:从握手到挥手的技术之旅
linux·服务器·c语言·网络·网络协议·tcp/ip
惜分飞38 分钟前
ORA-600 kcratr_nab_less_than_odr和ORA-600 4193故障处理--惜分飞
数据库·oracle
OJAC11138 分钟前
当所有人都在说“运维稳了”,近屿智能看到了另一种可能
运维
chian-ocean38 分钟前
CANN 生态进阶:利用 `profiling-tools` 优化模型性能
数据库·mysql