id="article_content" class="article_content clearfix">
id="content_views" class="htmledit_views">
前言
这里主要是针对如下 情况的讨论
比如我们 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 {// Test21GetGeneratedKeyspublic 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 标记, 然后需要获取 响应信息, 则客户端这边直接 抛出异常
完