欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MyBatis框架——mybatis插入数据返回主键(mysql、oracle)

程序员文章站 2022-07-03 10:40:46
...

参考:
(1)MyBatis框架——mybatis插入数据返回主键(mysql、oracle)
https://www.cnblogs.com/w1217/p/5541631.html
(2)MyBatis insert 返回主键的方法(oracle和mysql)
https://www.cnblogs.com/tv151579/archive/2013/03/11/2954841.html
(3)Mybatis中,当插入数据后,返回最新主键id的几种方法
http://blog.csdn.net/sinat_30474567/article/details/51395247

这里总结一下mybatis插入数据时返回主键的4种情况:mysql环境下主键自增(AUTO_INCREMENT)、mysql环境下主键为uuid、oracle环境下主键自增、oracle环境下主键为uuid。

以下全文均以User实体来举例说明,字段有userId、userName、sex、birthday、address 五个属性,其中userId有可能是int类型,也有可能是String类型。

数据库为mysql

1.主键为自增时(主键为数值类型且自增AUTO_INCREMENT)

(1)通过useGeneratedKeys和keyProperty连个属性:

<insert id="add" parameterType="com.danny.mybatis.po.User" useGeneratedKeys="true" keyProperty="userId">
    insert into TStudent(name, age) values(#{name}, #{age})
</insert>

(2)利用mysql的LAST_INSERT_ID()方法获取插入记录的主键,select LAST_INSERT_ID()可以在插入数据后,查询并返回刚插入数据的主键(但是单独执行这条语句只会返回0):

    <insert id="insertUser" parameterType="com.danny.mybatis.po.User">
        <selectKey keyProperty="userId" order="AFTER" resultType="java.lang.Integer">
            select LAST_INSERT_ID()
        </selectKey>
        insert into T_USER(userName,birthday,sex,address) values (#{userName},#{birthday},#{sex},#{address})
    </insert>

keyProperty:将查询到的主键值设置到parameterType指定对象的哪个属性;
resultType:指定自增的主键返回类型;
order:<selectKey> 标签内的sql语句相对于insert语句的执行顺序,AFTER表示select LAST_INSERT_ID() 这个语句将在insert语句之后执行。

(3)通过select @@IDENTITY获取最近一次插入记录的主键值的方式(select LAST_INSERT_ID()类似,没测试过)
select @@IDENTITY获取主键的方式依赖数据库本身
下面是SQLServer获取最近一次插入记录的主键值的方式,未测试

<insert id="add" parameterType="com.danny.mybatis.po.User">
  <selectKey keyProperty="userId" order="AFTER" resultType="java.lang.Integer">
    select @@IDENTITY as userId
  </selectKey>
  insert into T_USER(userName,birthday,sex,address) values (#{userName},#{birthday},#{sex},#{address})
</insert>

2.主键为UUID时(主键必须为字符类型)
使用mysql的方法UUID()方法获取随机的UUID作为主键,select UUID()可以在插入数据前,生成随机的UUID并通过keyProperty赋值给将要插入记录的主键。

    <insert id="insertPerson" parameterType="com.danny.mybatis.po.User">
        <selectKey keyProperty="userId" order="BEFORE" resultType="java.lang.String">
            select UUID()
        </selectKey>
        insert into user(userId,userName,birthday,sex,address) values (#{id},#{userName},#{birthday},#{sex},#{address})
    </insert>

在上述代码中可以看到order 的属性值为BEFORE ,说明在插入之前就已经生成了UUID,并且已经把UUID赋值给user的id。

数据库为oracle

1.主键为自增时(主键为数值类型):
在oracle中实现主键自增,需要先创建序列,相当于创建一个全局变量,用来存储对应表的主键的当前最大值(主键为数值类型时)。
先为user表创建一个序列:

CREATE SEQUENCE USER_ID_SEQ

INCREMENT BY 1 -- 每次递增1

START WITH 1 -- 从1开始

MINVALUE 1 -- 最小值=1

NOCYCLE; -- 不循环

利用序列的属性USER_ID_SEQ.NEXTVAL 获得要插入数据的主键:

    <insert id="insertUser" parameterType="com.danny.mybatis.po.User">
        <selectKey keyProperty="userId" order="BEFORE" resultType="java.lang.Integer">
            select USER_ID_SEQ.NEXTVAL as userId from DUAL
        </selectKey>
        insert into T_USER(userId,userName,birthday,sex,address) values (#{userId},#{userName},#{birthday},#{sex},#{address})
    </insert>

2.主键为UUID时
 用oracle自带的SYS_GUID()方法获得随机的GUID作为主键:
 

    <insert id="insertUser" parameterType="com.danny.mybatis.po.User">
        <selectKey keyProperty="userId" order="BEFORE" resultType="java.lang.Integer">
            select SYS_GUID() as userId from DUAL
        </selectKey>
        insert into T_USER(userId,userName,birthday,sex,address) values (#{userId},#{userName},#{birthday},#{sex},#{address})
    </insert>