Mybatis 如何获取自增主键的?

本文为犬小哈教程网原创,作者: 犬小哈,公众号: 小哈学Java, 转载请注明出处 https://www.exception.site/java-interview/how-can-mybatis-get-primary-key

注意,市面上常见关系型数据库,如:MysqlOracle 获取自增主键的方式有所不同。

一、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 待完善

免费分享 | 阿里 P8 高级架构师吐血总结的 《Java 核心知识整理&面试.pdf》

获取方式: 关注微信公众号: 小哈学Java, 后台回复"资源",既可免费无套路获取资源链接哦,下面是目录以及部分截图:

关注微信公众号【小哈学Java】,回复“666”,即可免费无套路领取哦

关注微信公众号【小哈学Java】,回复“666”,即可免费无套路领取哦

关注微信公众号【小哈学Java】,回复“666”,即可免费无套路领取哦

关注微信公众号【小哈学Java】,回复“666”,即可免费无套路领取哦

关注微信公众号【小哈学Java】,回复“666”,即可免费无套路领取哦

关注微信公众号【小哈学Java】,回复“666”,即可免费无套路领取哦

重要的事情说两遍,获取方式: 关注微信公众号: 小哈学Java, 后台回复"资源",既可免费无套路获取资源链接哦 !!!

欢迎关注我的微信公众号: 小哈学Java

小哈学Java,关注领取10G面试学习资料哦