关于使用mysql的 SELECT LAST_INSERT_ID() 语句碰到的问题

原创 2018年04月16日 18:04:23

前言:

        当我们向主键是自增型的数据库表中(如 user 表)插入一条记录时,我们期望获取刚刚写入这条记录的id,(因为某些场景下需要获得这个id去做其他的操作),此时我们需要使用SELECT LAST_INSERT_ID()这个语句来获取插入记录后返回的自增id的值;

如下例:

    /**
     * 插入投诉信息
     * @param complaintInfoModel
     * @return
     */
    @InsertProvider(type = ComplaintInfoDao.ComplaintProviderSql.class,method = "insertComplaintInfo")
    @SelectKey(statement="SELECT LAST_INSERT_ID()", keyProperty="id", before=false, resultType=Integer.class)
    Integer insertComplaintInfo(ComplaintInfoModel complaintInfoModel); //  插入数据  返回修改数据库条数

    SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。但是不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦。

selectKey Attributes

属性
描述
keyPropertyselectKey 语句结果应该被设置的目标属性。
resultType

结果的类型。

MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。

order

这可以被设置为 BEFORE 或 AFTER。

如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。

如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。

statementType

和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 语句的映射类型,

分别代表 PreparedStatement 和CallableStatement 类型。

  

----1.  SelectKey需要注意order属性,

Mysql一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。

Oracle这样取序列的情况,需要设置为before,否则会报错。

-----2.  另外在用Spring管理事务时,

    SelectKey和插入在同一事务当中,因而Mysql这样的情况由于数据未插入到数据库中,所以是得不到自动增长的Key。

取消事务管理就不会有问题。

下面是一个xml和注解的例子,SelectKey很简单,两个例子就够了:
 
  <insert id="insert" parameterType="map">  
    insert into table1 (name) values (#{name})  
      <selectKey resultType="java.lang.Integer" keyProperty="id">  
         CALL IDENTITY()  
      </selectKey>  
  </insert>  

      上面xml的传入参数是map,selectKey会将结果放到入参数map中。用POJO的情况一样,但是有一点需要注意的是,keyProperty对应的字段在POJO中必须有相应的setter方法,setter的参数类型还要一致,否则会报错。

@Insert("insert into table2 (name) values(#{name})")  
@SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class)  
int insertTable2(Name name);  
上面是注解的形式。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaodj5660/article/details/79963633

【MySQL笔记】last_insert_id()函数使用的注意事项

在使用MySQL时,若表中含自增字段(auto_increment类型),则向表中insert一条记录后,可以调用last_insert_id()来获得最近insert的那行记录的自增字段值(一个bi...
  • slvher
  • slvher
  • 2014-12-31 18:59:22
  • 24030

理解Mysql语句:insert 表名 select null 及 select last_insert_id()

理解MySQL语句:insert 表名 select null,用select last_insert_id()的风险
  • cherrycheng_
  • cherrycheng_
  • 2016-03-24 15:33:48
  • 1420

SELECT LAST_INSERT_ID() 的使用和注意事项

尊重个人劳动成果,转载请注明出处: http://blog.csdn.net/czd3355/article/details/71302441首先我先解释以下在在映射文件中的代码是什么意思。 ...
  • czd3355
  • czd3355
  • 2017-05-06 21:15:14
  • 11355

mysql LAST_INSERT_ID 使用与注意事项

在使用MySQL时,若表中含自增字段(auto_increment类型),则向表中insert一条记录后,可以调用last_insert_id()来获得最近insert的那行记录的自增字段值 ...
  • elesos
  • elesos
  • 2016-09-07 10:44:49
  • 3934

在Spring中用select last_insert_id()时遇到问题

 在Spring中用select last_insert_id()时遇到问题 开源中国 发表于 2014-08-17 23:25:43 今天在使用MySQL时却不知...
  • wenhuadream
  • wenhuadream
  • 2015-04-30 18:17:40
  • 2291

关于Mysql LAST_INSERT_ID()使用

关于Mysql LAST_INSERT_ID()使用
  • z646721826
  • z646721826
  • 2017-12-06 09:14:47
  • 312

last_insert_id()函数使用的注意事项 mysql

本文转载自:http://blog.csdn.net/slvher/article/details/42298355 author:slvher    在使用MySQL时,若表中含自...
  • stevejobson
  • stevejobson
  • 2017-01-23 13:53:07
  • 1822

Hibernate: select last_insert_id()

大概错误是 Hibernate: select last_insert_id() - SQL Error: -104, SQLState: 42601 - DB2 SQL error: SQLC...
  • zouhao619
  • zouhao619
  • 2012-09-08 16:01:52
  • 2181

mysql的last_insert_id()用法

最近在做一个小东西的时候,发现mysql有last_insert_id()这个函数它的用法如下:记录下来备忘它必需紧跟在insert 语句执行之后。//执行insert语句先$sql="insert ...
  • kemy88
  • kemy88
  • 2006-08-23 12:34:00
  • 27438

MySQL中获取最后插入的自增ID值 LAST_INSERT_ID

写数据库程序的时候,经常会需要获取某个表中的最大序号数, 在单线程的情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。但在多线程情况下,就不行了。在...
  • majin_com
  • majin_com
  • 2012-06-04 18:53:57
  • 1672
收藏助手
不良信息举报
您举报文章:关于使用mysql的 SELECT LAST_INSERT_ID() 语句碰到的问题
举报原因:
原因补充:

(最多只允许输入30个字)