当前位置: 首页 > article >正文

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

前言

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

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

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

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

 

 

测试用例

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

/**
 * 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;

    }

}

 

 

客户端这边获取 generatedKeys

客户端这边获取 到的自增长的 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

 

 

 

 

 


http://www.kler.cn/a/455698.html

相关文章:

  • 【AI日记】24.12.28 kaggle 比赛 2-16
  • OpenHarmony-5.PM 子系统(2)
  • node-js Express防盗链
  • Thinkphp 使用workerman消息实现消息推送完整示例
  • 机器学习(二)-简单线性回归
  • FlaskAPI-初识
  • bash脚本文件读写操作
  • Web3 生态全景:创新与发展之路
  • #E. NH.2023.小甲.05.文本框
  • 使用vue3搭建前端模拟增删改查
  • Linux shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件
  • Spring Boot简单集成fastDFS
  • Linux应用软件编程-多任务处理(线程)
  • 【Unity3D】Jobs、Burst并行计算裁剪Texture3D物体
  • Redis学习笔记之——数据类型篇(一)
  • JVM简介—3.JVM的执行子系统
  • 【单片机通讯协议】—— 常用的UART/I2C/SPI等通讯协议的基本原理与时序分析
  • 关键客户转化为会员的重要性及 “开源 AI 智能名片 2 + 1 链动模式商城小程序” 在其中的应用剖析
  • 园区网综合拓扑实验
  • 正则表达式(三剑客之awk)
  • Edge SCDN酷盾安全重塑高效安全内容分发新生态
  • DevNow x Notion
  • 【python因果库实战13】因果生存分析2
  • STM32-笔记11-手写带操作系统的延时函数
  • 笔记:使用python对飞书用户活跃度统计的一个尝试
  • Go Redis实现排行榜