zoukankan      html  css  js  c++  java
  • 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

     1 <!-- 新增应用 -->
     2     <insert id="addApplication" parameterType="com.bxy.entity.application.Application"
     3         useGeneratedKeys="true" keyProperty="id">
     4         insert into vrv_application_list
     5         (
     6         appname,
     7         apptype,
     8         iconpath,
     9         filepath,
    10         filesize,
    11         pic1
    12         )
    13         values
    14         (
    15         #{appname},
    16         #{apptype},
    17         #{iconpath},
    18         #{filepath},
    19         #{filesize},
    20         #{pic1}
    21         )
    22         <selectKey resultType="java.lang.Integer" order="AFTER"
    23             keyProperty="id">
    24             SELECT LAST_INSERT_ID()
    25         </selectKey>

    通过上面的方式,我就把最新插入的一条id,绑定返回到我的实体Application上了,前提是你的Application实体里一定有id这个属性。不然会报错。 
    当然如果你的parameterType=”java.util.Map” 的话,也是可以的,就不需要做什么多余的,会自动绑定到Map上 ,例如:

     1 <!-- 添加消息 -->
     2     <insert id="addMessage" parameterType="java.util.Map"
     3         useGeneratedKeys="true" keyProperty="id">
     4         insert into vrv_push_message_tab
     5         (
     6         type,
     7         title,
     8         message,
     9         create_id,
    10         create_time,
    11         force_open
    12         )
    13         values
    14         (
    15         #{type},
    16         #{title},
    17         #{message},
    18         #{create_id},
    19         now(),
    20         #{force_open}
    21         )
    22         <selectKey resultType="java.lang.Integer" order="AFTER"
    23             keyProperty="id">
    24             SELECT LAST_INSERT_ID()
    25         </selectKey>
    26     </insert>

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

    1 int id = addMessage(map);
  • 相关阅读:
    我和小美的撸码日记(3)之一句话搞定MVC表单页数据绑定与提交
    我和小美的撸码日记--基于MVC+Jqgrid的.Net快速开发框架
    我和小美的撸码日记(2)之第一个基于MVC+Jqgrid的列表页面
    我和小美的撸码日记(1)之软件也需靠脸吃饭,带您做张明星脸(附后台经典框架 DEMO 下载)
    Mysql 下DELETE操作表别名问题
    DynaActionForm(动态ActionForm)的使用
    structs中通过LabelValueBean构建下拉列表
    JavaScript中==和===区别
    JAVA包装类的缓存范围
    JAVA循环迭代中删除或添加集合数据报java.util.ConcurrentModificationException错误
  • 原文地址:https://www.cnblogs.com/haw2106/p/9279597.html
Copyright © 2011-2022 走看看