Java中如何获取刚插入数据库的自动生成ID?
嘿,我来帮你搞定这个问题!你现在的需求很明确:在成功插入transactions表后拿到自动生成的COT_Id,再用这个ID去插中间表USER_TRANS对吧?根据Java项目里常用的持久层框架,这里有几种简单可行的方法:
情况1:用Spring Data JPA/JPA(最常见的Spring项目场景)
如果你的Transaction实体类是用JPA注解定义的(比如带@Entity),而且COT_Id字段用了@GeneratedValue来配置自动生成策略(比如IDENTITY对应数据库自增),那事情就很简单了:
当你调用transactionService.saveTrans(transaccion)之后,JPA会自动把数据库生成的主键值回写到你传入的transaccion对象里。你直接调用对应的getter方法就能拿到ID:
if(resultado) { transactionService.saveTrans(transaccion); // 直接从保存后的实体获取自动生成的ID Long transId = transaccion.getCot_Id(); // 注意类型要和你的实体字段匹配,比如Integer或者Long generalService.saveUserTrans(udID, transId, 1); }
另外,如果你用的是Spring Data JPA的CrudRepository,save方法本身会返回保存后的实体对象,你也可以用返回的对象来拿ID,这样更稳妥:
if(resultado) { Transaction savedTransaction = transactionService.saveTrans(transaccion); Long transId = savedTransaction.getCot_Id(); generalService.saveUserTrans(udID, transId, 1); }
注意:确保你的Transaction实体类里cot_Id字段的getter方法(比如getCot_Id())是正确定义的,不然没法获取到值哦
情况2:用MyBatis
如果你的项目用的是MyBatis,那需要在Mapper的插入配置里开启返回自增主键的功能:
- 在Mapper接口的插入方法上可以加注解:
@Insert("INSERT INTO transactions (mvg_id, crd_id, cot_amount, ...) VALUES (#{mvg_id}, #{crd_id}, #{cot_amount}, ...)") @Options(useGeneratedKeys = true, keyProperty = "cot_Id") void saveTrans(Transaction transaccion);
或者在XML映射文件里配置:
<insert id="saveTrans" parameterType="Transaction" useGeneratedKeys="true" keyProperty="cot_Id"> INSERT INTO transactions (mvg_id, crd_id, cot_amount, ...) VALUES (#{mvg_id}, #{crd_id}, #{cot_amount}, ...) </insert>
配置完成后,调用saveTrans方法传入transaccion对象,MyBatis会自动把生成的COT_Id填充到对象的cot_Id字段里,之后你同样可以用transaccion.getCot_Id()拿到ID去插中间表。
额外提醒
不管用哪种框架,核心思路都是让持久层框架在插入后把生成的主键回写到实体对象,这样就不用自己去执行额外的查询(比如SELECT 859264),既高效又避免并发问题。
内容的提问来源于stack exchange,提问作者Eli HQ

