Mybatis笔记 – insert语句中主键的返回

时间:2025-03-07 13:05:02

在DBMS中可以使用insert语句显示指定自增主键值,但Mybatis中不可,即使指定了也无效,可以使用特殊的方式返回主键。

一、自增主键返回

        mysql自增主键执行insert提交之前,会自动生成一个自增主键值;insert语句在提交之后可以调用mysql函数LAST_INSERT_ID() ,返回auto_increment自增列新记录id值;最后再将自增主键值返回到pojo对象中指定的属性中即可。这个函数只适用于自增主键。

1、标签属性

标签对应的属性含义如下:

keyProperty:返回的主键存储在pojo类中的哪个属性

order:相对于insert语句,select LAST_INSERT_ID() 的执行顺序

resultType:指定select LAST_INSERT_ID() 的结果类型

2、详细代码

 <insert id="insertEmp" parameterType="po.Emp">
<selectKey keyProperty="empno" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into emp(ename,job) values(#{ename},#{job})
</insert>

可以通过po类的get()方法获取自增主键值,代码如下:

 //返回自增主键
System.out.println(emp.getEmpno());

3、运行结果

Mybatis笔记 – insert语句中主键的返回

二、非自增主键(UUID)返回

使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成36位(设置成35位会出错)。执行思路如下:

① 先通过uuid()查询到主键,将主键输入 到sql语句中。

② 执行uuid()语句顺序相对于insert语句之前执行。

1、数据库设计

Mybatis笔记 – insert语句中主键的返回

2、详细代码

 <insert id="insertEmp" parameterType="po.Emp">
<selectKey keyProperty="empno" order="BEFORE" resultType="java.lang.String">
select uuid()
</selectKey>
insert into emp(empno,ename,job) values(#{empno},#{ename},#{job})
</insert>

可以通过po类的get()方法获取自增主键值,代码如下:

 //返回自增主键
System.out.println(emp.getEmpno());

3、运行结果

Mybatis笔记 – insert语句中主键的返回

三、非自增主键(oracle序列)返回

 <insert  id="insertEmp" parameterType="po.Emp">
<selectKey resultType="java.lang.Integer" order="BEFORE" keyProperty="empno">
SELECT 自定义序列.NEXTVAL FROM EMP
</selectKey>
insert into user(id,username) values(#{id},#{username})
</insert>