使用UUID()生成主键时GeneratedKeyHolder无法返回MySQL插入ID
问题分析与解决方法
核心问题1:表名拼写错误
你的插入SQL语句中写的是INSERT INTO CUSTOMER1,但实际定义的表名为CUSTOMER,这会导致插入操作要么失败(如果CUSTOMER1不存在),要么插入到错误的表中,这是首先要修正的问题。
核心问题2:UUID主键无法通过RETURN_GENERATED_KEYS获取
MySQL的Statement.RETURN_GENERATED_KEYS仅对自增(AUTO_INCREMENT)列生效,而你的CUSTOMER_ID是通过DEFAULT (UUID())生成的默认值,不属于自增列类型,因此JDBC驱动不会将其识别为“生成键”返回,这就是holder.getKey()返回null的根本原因。
可行解决方案
方案一:Java代码生成UUID并显式插入
直接在代码中生成UUID,插入时指定该值,无需依赖数据库返回,逻辑最简洁:
import java.util.UUID; // ... String customerId = UUID.randomUUID().toString(); jdbcTemplate.update( "INSERT INTO CUSTOMER (CUSTOMER_ID, MOBILE) VALUES (?, ?)", customerId, mobileNumber ); return customerId;
方案二:利用MySQL 8.0+的RETURNING子句
MySQL 8.0.19及以上版本支持RETURNING子句,可以在插入语句后直接返回生成的主键值,适配你的原有代码逻辑:
GeneratedKeyHolder holder = new GeneratedKeyHolder(); int rowsAffected = jdbcTemplate.update(con -> { PreparedStatement stmt = con.prepareStatement( "INSERT INTO CUSTOMER (MOBILE) VALUES (?) RETURNING CUSTOMER_ID" ); stmt.setString(1, mobileNumber); return stmt; }, holder); return holder.getKey().toString();
内容的提问来源于stack exchange,提问作者Mohammad Umair
相关产品推荐
相关产品推荐

