Mybatis 如何获取自增主键的?
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ; - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观
注意,市面上常见关系型数据库,如: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 待完善