Mybatis 如何获取自增主键的?
更新时间: 2019-07-10 20:39:06
作者: 异常教程网
一则或许对你有用的小广告
最近,小哈正在带小伙伴们做前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.2 + Vite 4
,手把手,前端 + 后端,全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已进入第七章 《文章分类模块开发》中,截止到目前,已更新 105150 字,69 篇内容,讲解图:521 张,还在持续爆肝中,后续还会上新更多项目,已有 200+ 小伙伴加入,欢迎点击围观。
注意,市面上常见关系型数据库,如:Mysql 和 Oracle 获取自增主键的方式有所不同。
一、Mysql
MySQL 有两种方式获取自增主键,代码如下:
// 方式一: 使用 useGeneratedKeys + keyProperty 属性,这种在项目中比较常用
<insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(name, password)
VALUE (#{name}, #{password})
</insert>
// 方式二: 使用 `<selectKey />` 标签
<insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id">
<selectKey keyProperty="id" resultType="long" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user(name, password)
VALUE (#{name}, #{password})
</insert>
二、Oracle
Oracle 也有两种方式,分别是:
- 序列 (推荐使用)
- 触发器 (不太推荐使用)。
这里仅说下推荐使用的序列方式,根据
<selectKey />
执行的时机, 分以下两种,示例代码如下:
// 这个是创建表的自增序列
CREATE SEQUENCE student_sequence
INCREMENT BY 1
NOMAXVALUE
NOCYCLE
CACHE 10;
// 方式一,使用 `<selectKey />` 标签 + BEFORE
<insert id="add" parameterType="Student">
<selectKey keyProperty="student_id" resultType="int" order="BEFORE">
select student_sequence.nextval FROM dual
</selectKey>
INSERT INTO student(student_id, student_name, student_age)
VALUES (#{student_id},#{student_name},#{student_age})
</insert>
// 方式二,使用 `<selectKey />` 标签 + AFTER
<insert id="save" parameterType="com.threeti.to.ZoneTO" >
<selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER" >
SELECT SEQ_ZONE.CURRVAL AS id FROM dual
</selectKey>
INSERT INTO TBL_ZONE (ID, NAME )
VALUES (SEQ_ZONE.NEXTVAL, #{name,jdbcType=VARCHAR})
</insert>
其他如 SQLServer、PostgreSQL、DB2、H2 等等关系型数据库的自增主键获取方式,小伙伴们不妨自己搜索下,这里就不介绍了。
三、Mybatis 获取自增主键的原理是什么?
// TODO 待完善