技术帮
 

在Insert后获得主键值

本网站内容基本都是原创作品,未得到作者同意也欢迎转载
转载请注明出处:技术帮
说你呢,赶紧长按二维码,然后点击识别图中二维码

任何技术难题可进QQ群提问:【小崔说编程
对于提问的原则是:没有你不能问的,只有我不会答的

1472955908895017376.png说两句


新增一条记录后,如何获得新增主键的值呢?

网上的资料有两种:

1473058358717068189.png 采用JavaBean提交,然后返回对象的主键字段值

@Insert("insert into t_dept (deptName) values (#{dept.deptName})")
@Options(useGeneratedKeys = true, keyProperty = "dept.noid", keyColumn = "noid")
int addDept(Dept dept);

例子如上,在接口中有一个方法addDept用来增加部门,参数是Dept类型的,

Dept类型定义如下:

public class Dept{
  private Integer noid;
  
  private String deptName;
  
  // 省略get set 方法
}

可以看到,该方法的思路其实是使用Bean方法新增对象,然后新增部门后会将新的主键值注入到对象中。


 采用SelectKey思路

例子如下:

<insert id="insert" parameterType="com.xxx.Book" useGeneratedKeys="true" keyProperty="id">
    insert into t_books(name)
    values (#{name,jdbcType=VARCHAR})
    <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="id" >
       SELECT LAST_INSERT_ID()
    </selectKey>
  </insert>

可以看到,这个做的是新增一条记录,然后采用SelectKey标签执行了获取最新的id值的方法返回新的主键。

这里要解释一下 last_insert_id()方法,这个方法是MySQL内置的,在同一个事务中可以获得新的主键值。

不过这个方法我测试过程中并无效。因此这个思路也被否定了。


1472995996528030644.png 终极办法

我干脆直接单独在接口中增加了一个方法,执行select last_insert_id()语句来获得新的主键ID,测试结果是可行的。

@Select("select last_insert_id() as id")
Integer getNewId();