获取insert生成的主键

环境描述

数据库版本:mysql8

数据库依赖:8.0.28

jdk版本:1.8

需求描述

​ 在一个业务方法中有两个操作,其中第一个操作是新增一个用户,第二个操作是给用户添加基本角色信息,涉及到三张不同的表,用户表、角色表、中间表

​ 在这里当添加用户后需要获取自增的id来作为下面操作的参数,因此需要使用到生成的主键信息

​ 当然,我没有基于这个需求来做,只是举了个大概的例子,知道在哪里需要用到这个操作,下面就这个获取生成的主键来展开讲解

jdbc

知识回顾

  • 首先来回顾一下jdbc基础,这里随便创建了一个test库,建了一个t2表,里面有id和name字段,至于异常检查什么的,都抛出了,这里只作简单的知识回顾
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
String sql = "insert into t2 values(null,'张三')";
PreparedStatement ps = conn.prepareStatement(sql);
ps.executeUpdate();
  • 执行上述操作后,数据库数据新增,没有任何异常,下面正式进入主题

获取生成的主键

​ 在这里先介绍一下conn.prepareStatement这个操作,平常的话主要用到的是第一个操作,也就传入一个sql语句进行执行,然后executexxx方法就行了

​ 这里介绍一下它的第二个参数,是一个int类型的整数,那到底该传入什么整数呢?其实都在Statement接口中定义好了,这里就不一一介绍了,自己打开接口看一下就行了,方法对应的都有注释,这里我们用到的就是Statement.RETURN_GENERATED_KEYS这个值,表示返回自增后的主键值,前提条件是表中的主键字段必须设置为自增

Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
String sql = "insert into t2 values(null,'李四')";
PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
boolean flag = ps.execute();
ResultSet generatedKeys = ps.getGeneratedKeys();
generatedKeys.next();
System.out.println(flag + ":" + generatedKeys.getInt(1));
  • 成功返回了主键,但是奇怪的问题又产生了……且听下篇讲解

mybatis

  • 上面的操作mybatis早已经封装起来了,通过简单的操作即可获得,下面通过代码演示来简单介绍一下mybatis如何获取生成的主键
<selectKey keyProperty="id" resultType="int" order="AFTER">select LAST_INSERT_ID()
</selectKey>

这里的select LAST_INSERT_ID()就可以把自增的主键返回,并封装到keyProperty对应的属性中

这里还有个order属性,它是用来定义何时获取主键值的,有两个值:before和after

before:先获取主键,然后再执行自增

after:先执行自增,后获取主键,一般都是这种

ending

每天进步一点点

获取insert生成的主键相关推荐

  1. JDBC中事务、批量操作、大数据类型、获取自动生成的主键、等用法

    1 事务的用法 事务的ACID属性: 通俗的说事务:指一组操作,要么都成功执行,要么都不执行-->原子性在所有的操作没有执行完毕之前,其他会话不能够看到中间改变的过程-->隔离性事务发生前 ...

  2. JDBC学习笔记(6)——获取自动生成的主键值处理Blob数据库事务处理

    获取数据库自动生成的主键 [孤立的技术是没有价值的],我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. 具体的代码实现: 1 /** 2 * ...

  3. Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1

    记录一次傻逼的问题, 自己把自己蠢哭:Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1 错误说明: 返回的1是影响的行数,并不是自增的主键id: 想要获取自增主键id,需要 ...

  4. 做工作流时候 Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1

    Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1 错误说明: 返回的1是影响的行数,并不是自增的主键id: 想要获取自增主键id,需要通过xx.getId()方法获取,因为 ...

  5. 五.获得MYSQL数据库自动生成的主键

    测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...

  6. MyBatis—insert语句返回主键和selectKey标签

    本文已同步至个人博客liaosi's blog - MyBatis-insert语句返回主键和selectKey标签 往数据库中插入一条记录后,有时候我们需要这条记录的主键,用于后续的操作.如果在插入 ...

  7. javaweb学习总结(三十七)——获得MySQL数据库自动生成的主键

    测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...

  8. MyBatis——insert并返回主键ID解决方案

    问题描述 添加记录后获取主键ID,这是一个很常见的需求,特别是在一次前端调用中需要插入多个表的场景. 除了添加单条记录时获取主键值,有时候可能需要获取批量添加记录时各记录的主键值. 问题分析 暂无. ...

  9. 使用mybatis插入数据(insert)时返回主键的问题

    使用mybatis做插入操作时,想要获取新增记录的主键,我发现现在的方式和以前的方式有所区别,即以前是直接通过方法返回,现在是将主键设置在数据实体对象中. 下面对mybatis进行insert时返回主 ...

最新文章

  1. 面试官一个线程池问题把我问懵逼了。
  2. 正则表达式 右上角加号_最全正则表达式讲解实战,附源码,敲一遍学会
  3. BTC上轨受阻继续调整,主流币分化BCH强势上行
  4. nginx 设置开机自动启动脚本
  5. express支持i18n国际化
  6. python-day2~3
  7. delphi 中的dll编程注意事项
  8. 压缩xvid ffmpeg x264 对比
  9. Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突...
  10. 2021抖音电商宠物经济洞察报告
  11. torch nn.MaxPool2d
  12. python 捕获多个异常_Python捕获多个异常
  13. 用css实现文本不换行切超出限制时显示省略号(小tips)
  14. 我必须得告诉大家的 MySQL 优化原理
  15. Circular Local MiniMax
  16. 网吧还原软件测试简历,测试人员-斯普林网吧客户服务系统.doc
  17. 夜深了,最好喝点咖啡
  18. CCF BDCI大赛急速报名,OneFlow四大训练赛题等你来战
  19. 模拟法螺旋遍历矩阵:54.螺旋矩阵(Kotlin)
  20. PD866EZ-12D/YCZ多用户预付费电表 上传至西安市能耗平台

热门文章

  1. 数据库语言分类DDL DCL DML 知多少?
  2. python反斜杠换行_python中消除反斜杠的麻烦
  3. python代码转成php代码的工具 或者go转成php的代码,想把odoo改成成php swoole当成web服务+go的架构
  4. 微众银行区块链2020年度报告
  5. springboot 有限状态机入门指南
  6. STM32CubeIDE自平衡小车教程7.MPU6050传感器数据读取
  7. fastjson 1.2.24 反序列化导致任意命令执行漏洞复现
  8. 2021安徽省大学生程序设计竞赛正式赛:D 持续攻击
  9. 程序员世界里有哪些名言警句
  10. 海量吞吐的实时NoSQL—HBase的七剑和20151111圣战(数据脱敏版)