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
this.getLastInsertId 来自于 目标 “insert into“ 的执行, 这里是从目标语句的 响应结果中获取的 自增长的主键的值
服务器这边的处理
服务器这边状态的 响应来自于这里, 在命令处理完成之后, 会 send_statement_stauts 的处理, 这里面会响应当前处理的信息, 比如 affectedRows, lastInsertId, serverInfo 等等
然后响应给服务器这边的信息如下
服务器状态, 警告数量, 影响的行的数量, 自增长id, 额外的信息
Statement.RETURN_GENERATED_KEYS 标记的处理
这个就是 纯纯的客户端 这边的处理了, 如果没有 RETURN_GENERATED_KEYS 标记, 然后需要获取 响应信息, 则客户端这边直接 抛出异常
完