Mybatis【6】-- Mybatis插入数据后自增id怎么获取?
代码直接放在Github仓库【https://github.com/Damaer/Mybatis-Learning/tree/master/mybatis-05-CURD 】
需要声明的是:此Mybatis学习笔记,是从原始的Mybatis开始的,而不是整合了其他框架(比如Spring)之后,个人认为,这样能对它的功能,它能帮我们做什么,有更好的理解,后面再慢慢叠加其他的功能。
我们知道很多时候我们有一个需求,我们需要把插入数据后的id返回来,以便我们下一次操作。
其实一开始的思路是我插入之后,再执行一次select,根据一个唯一的字段来执行select操作,但是Student这个类如果插入后再根据名字或者年龄查出来,这根本就是不可行的!!!重名与同年龄的人一定不少。
我们的测试方法如下,我们可以看到插入前是没有值的,插入后就有了值:
/**
* 测试插入后获取id
*/
@Test
public void testinsertStudentCacheId(){
Student student=new Student("helloworld",17,85);
System.out.println("插入前:student="+student);
dao.insertStudentCacheId(student);
System.out.println("插入后:student="+student);
}
useGeneratedKeys 设置主键自增
<insert id="insertStudentCacheId" useGeneratedKeys="true" keyProperty="id" parameterType="Student">
insert into student(name,age,score) values(#{name},#{age},#{score})
</insert>
需要注意的点:
- 1.
useGeneratedKeys="true"表示设置属性自增 - 2.
keyProperty="id"设置主键的字段 - 3.
parameterType="Student"设置传入的类型 - 4.注意:虽然有返回类型,但是我们不需要手动设置返回的类型,这个是由框架帮我们实现的,所以对应的接口方法也是没有返回值的,会修改我们插入的对象,设置id值。
- 5.实体类中id属性字段一定需要set以及get方法

使用selectKey 查询主键
<insert id="insertStudentCacheId" parameterType="Student">
insert into student(name,age,score) values(#{name},#{age},#{score})
<!-- 指定结果类型resultType,keyProperty是属性,自动返回到属性id中,order是次序,after是指获取id是在于插入后 -->
<selectKey resultType="int" keyProperty="id" order="AFTER">
select @@identity
</selectKey>
</insert>
或者写成:
<insert id="insertStudentCacheId" parameterType="Student">
insert into student(name,age,score) values(#{name},#{age},#{score})
<!-- 指定结果类型resultType,keyProperty是属性,自动返回到属性id中,order是次序,after是指获取id是在于插入后 -->
<selectKey resultType="int" keyProperty="id" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
</insert>
两种方式的结果:
注意要点:
- 1.最外层的
<insert></insert>没有返回属性(resultType),但是里面的<selectKey></selectKey>是有返回值类型的。 - 2.
order="AFTER"表示先执行插入,之后才执行selectkey语句的。 - 3.
select @@identity和select LAST_INSERT_ID()都表示选出刚刚插入的最后一条数据的id。 - 4.实体类中id属性字段一定需要set以及get方法
- 5.此时,接口中仍不需要有返回值,框架会自动将值注入到我们
insert的那个对象中,我们可以直接使用就可以了。
其实,我们的接口中可以有返回值,但是这个返回值不是id,而是表示插入后影响的行数,此时sql中仍和上面一样,不需要写返回值。
<insert id="insertStudentCacheIdNoReturn" parameterType="Student">
insert into student(name,age,score) values(#{name},#{age},#{score})
<!-- 指定结果类型resultType,keyProperty是属性,自动返回到属性id中,order是次序,after是指获取id是在于插入后 -->
<selectKey resultType="int" keyProperty="id" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
</insert>
接口中:
// 增加新学生并返回id返回result
public int insertStudentCacheId(Student student);
接口的实现类:
public int insertStudentCacheId(Student student) {
int result;
try {
sqlSession = MyBatisUtils.getSqlSession();
result =sqlSession.insert("insertStudentCacheId", student);
sqlSession.commit();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
return result;
}
Test中:
public void testinsertStudentCacheId(){
Student student=new Student("helloworld",17,101);
System.out.println("插入前:student="+student);
int result = dao.insertStudentCacheId(student);
System.out.println(result);
System.out.println("插入后:student="+student);
}
结果证明:result的值为1,表示插入了一行,查看数据库,确实插入了数据。
PS:如果无法创建连接,需要把Mysql的jar包升级:
<!-- mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
如果报以下的错误,那么需要将&改成转义后的符号&:
org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 14; columnNumber: 107; 对实体 "serverTimezone" 的引用必须以 ';' 分隔符结尾。
在xml里面配置需要转义,不在xml文件里面配置则不需要
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&serverTimezone=UTC"/>
【作者简介】:
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界希望一切都很快,更快,但是我希望自己能走好每一步,写好每一篇文章,期待和你们一起交流。
此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者核实删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~

Mybatis【6】-- Mybatis插入数据后自增id怎么获取?的更多相关文章
- mybatis插入数据后将其ID返回
背景 mybatis没有关联保存的功能,所以主从表需要分开保存,这就涉及到主表保存后要再次获取主表ID的环节,以下介绍mybatis插入数据后返回其自增ID的两种方式 方案 1.sql获取 <i ...
- mybatis插入数据后返回对象id
1.插入的为对象,成功插入后,会返回到指定的字段id中,@Options(useGeneratedKeys=true,keyColumn="id").
- dedecmsV5.7 插入记录并返回刚插入数据的自增ID
//插入一条数据 $sql = "INSERT INTO `table_name` (`name`,age) VALUES ('小明','23')"; $dsql->SetQ ...
- 插入数据返回自增id及插入更新二合一
原文https://blog.csdn.net/dumzp13/article/details/50984413 JDBC: con.setAutoCommit(false); String sql ...
- mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey
mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...
- mysql函数之六:mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey
mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...
- mysql插入数据后返回自增ID的方法
mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢? 方法一是使用la ...
- mysql 插入数据后返回当前的自增ID方法
存储过程的写法: mysql>create procedure test( ->in username varchar(50), ->in password varchar(50), ...
- 【JAVA - SSM】之MyBatis插入数据后获取自增主键
很多时候,我们都需要在插入一条数据后回过头来获取到这条数据在数据表中的自增主键,便于后续操作.针对这个问题,有两种解决方案: (1)先插入,后查询.我们可以先插入一条数据,然后根据插入的数据的各个字段 ...
- mybatis框架(6)---mybatis插入数据后获取自增主键
mybatis插入数据后获取自增主键 首先理解这就话的意思:就是在往数据库表中插入一条数据的同时,返回该条数据在数据库表中的自增主键值. 有什么用呢,举个例子: 你编辑一条新闻,同时需要给该新闻打上标 ...
随机推荐
- Ubuntu18.04未发现WiFi适配器情况解决方案之一
问题: 第一次你可能会遇见这种情况,ubuntu未发现Wifi适配器解决方案 无法打开WIfi 并告诉你没有WiFi适配器 解决方案: 解决方案如下: sudo modprobe -r ideapa ...
- Hash表实践 —— 两数之和
目录 题目背景 解题思路 题目背景 这个题目用常规的双循环就可以完成. 但不是最优解.为什么? 看看他的步骤数: N =[3,2,4] 求结果为6的两个元素坐标如下, 1). 3+2 = 5 不等于 ...
- Figma 学习笔记 – 黑科技
Figma 其实有蛮多黑科技的, 因为需求真的太多了, 在还没有实现的期间就诞生了很多 hacking 的 way. Feature Issue 实现 min-height 通过 0px 黑科技 其实 ...
- Qt连连看(三)非核心功能实现
主要的界面设计好后,我们来看下非核心功能的实现.由于这块不需要用到稍微复杂的算法,解决起来相对来说容易许多,于是我们选择先实现这部分非核心功能,这块几乎不涉及游戏的核心逻辑. 游戏界面如下: 这时我们 ...
- Hugging Face NLP课程学习记录 - 2. 使用 Hugging Face Transformers
Hugging Face NLP课程学习记录 - 2. 使用 Hugging Face Transformers 说明: 首次发表日期:2024-09-19 官网: https://huggingfa ...
- Element——前端样式美化
Element 简介 Element 快速入门 https://element.eleme.cn/#/zh-CN/component/button Element 布局 ht ...
- Tomcat——配置、部署
配置 修改启动端口号:conf/sever.xml HTTP协议默认端口号为80,若将Tomcat端口号改为80,则将来访问Tomcat时,不用输入端口号 端口号改 ...
- Java项目笔记(三)
一.前端传参类似以下格式,对象中包含一个对象,后台此时接收option为stirng类型 curriculumid question answer option {optionOne ,optionT ...
- crypt.h:No such file or directory 报错处理
crypt.h:No such file or directory 报错处理 前言:本文初编辑于2024年9月28日 CSDN主页:https://blog.csdn.net/rvdgdsva 博客园 ...
- 17 模块subprocess、re
1. subprocess模块 1.1 概念 subprocess模块启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值 简单理解:可以远程连接电脑(socket模块) 1.2 Pop ...