MySQL--获取最新插入数据的自增id

在MySQL中,使用auto_increment类型的id字段作为表的主键。通常的做法,是通过“select max(id) from tablename”的做法,但是显然这种做法需要考虑并发的情况,需要在事务中对主表以“X锁“,待获得max(id)的值以后,再解锁。

这种做法需要的步骤比较多,有些麻烦,而且并发性也不好。有没有更简单的做法呢?答案之一是通过select LAST_INSERT_ID()这个操作。乍一看,它和select max(id)很象,但实际上它是线程安全的。也就是说它是基于数据库连接的,基于数据库连接是什么意义呢?举例说明:

(1)、在连接1中向A表插入一条记录,A表包含一个auto_increment类型的id。

(2)、在连接2中向A表再插入一条记录。

(3)、结果:在连接1中执行select LAST_INSERT_ID()得到的结果和连接2中执行select LAST_INSERT_ID()的结果是不同的;而在两个连接中执行select max(id)的结果是相同的。

对于mysql表中主键设置我自动增长,当我们插入一条记录的时候,id会自动增长,而我们又想得到这个id ,用于另一张表的插入,我们怎样获取这个id呢?有的人通过max(id) 来获取,这样是不合理的,如果另外一个人恰巧在你执行select max(id)获取之前,插入一条记录,那么它的id就变了。而mysql又不存在锁表的功能,所以我们可以通过LAST_INSERT_ID 来获取。

对于mybatis

 <insert id="addApplication" parameterType="com.bxy.entity.application.Application"
        useGeneratedKeys="true" keyProperty="id">
        insert into vrv_application_list
        ( appname , apptype , iconpath , filepath , filesize , pic1 )
        values
        (#{appname}, #{apptype}, #{iconpath}, #{filepath}, #{filesize},#{pic1})
        <selectKey resultType="java.lang.Integer" order="AFTER"
            keyProperty="id">
            SELECT LAST_INSERT_ID()
        </selectKey>
</insert>

总体解释:将插入数据的主键返回到 user 对象中。
具体解释:
SELECT LAST_INSERT_ID():得到刚 insert 进去记录的主键值,只适用与自增主键
keyProperty:将查询到主键值设置到 parameterType 指定的对象的那个属性
order:SELECT LAST_INSERT_ID() 执行顺序,相对于 insert 语句来说它的执行顺序
resultType:指定 SELECTLAST_INSERT_ID() 的结果类型
获取新增的id:Integer id = application.getId();
通过上面的方式,我就把最新插入的一条id,绑定返回到我的实体Application上了,前提是你的Application实体里一定有id这个属性。不然会报错。
当然如果你的parameterType=”java.util.Map” 的话,也是可以的,就不需要做什么多余的,会自动绑定到Map上 ,例如:

<!-- 添加消息 -->
    <insert id="addMessage" parameterType="java.util.Map"
        useGeneratedKeys="true" keyProperty="id">
        insert into vrv_push_message_tab
        (
        type,
        title,
        message,
        create_id,
        create_time,
        force_open
        )
        values
        (
        #{type},
        #{title},
        #{message},
        #{create_id},
        now(),
        #{force_open}
        )
        <selectKey resultType="java.lang.Integer" order="AFTER"
            keyProperty="id">
            SELECT LAST_INSERT_ID()
        </selectKey>
    </insert>

在java代码里只需要通过下面的方式获取就可以了

int id = addMessage(map);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容