MyBatis框架——mybatis插入数据返回主键(mysql、oracle)
参考:
(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>
上一篇: 再见逆序数
下一篇: Linux Nginx负载均衡
推荐阅读
-
荐 BAT高频面试系列:设计模式+Spring源码+MyBatis+SpringMVC多线程+MySQL+Redis+框架使用+数据结构算法答案和总结
-
MyBatis在Oracle中插入数据并返回主键的问题解决
-
SpringBoot整合MyBatis获得插入数据后获取主键,返回值总是1
-
mybatis 插入时返回刚插入记录的主键值
-
Mybatis 示例之 SelectKey ,mysql数据库设置自增也需连用生产主键
-
java mybatis插入数据返回主键id
-
Java MyBatis 插入数据库返回主键
-
记一次mybatis插入oracle数据库报错的问题
-
Mybatis批量插入数据(Mysql / Oracle)
-
Mybatis插入数据返回主键ID