Mybatis自增长id处理

目录

  • 1.使用useGenerateKey
  • 2.使用select LAST_INSERT_ID()
  • 3.使用select @@IDENTITY
  • 4.在MySql中模拟Sequence
  • 参考:

1.使用useGenerateKey

    <insert id="insert" parameterType="Person" useGeneratedKeys="true" keyProperty="personId">
           insert into person(name,pswd) values(#{name},#{pswd})
   </insert> 

或者

   @Mapper
   public interface UserMapper
   {
       @Insert("insert into tbl_user (name, age) values (#{name}, #{age})")
       @Options(useGeneratedKeys=true, keyProperty="userId", keyColumn="user_id")
       void insertUser(User user);
   } 

其中keyProperty对应的属性为返回对象的字段,keyColumn对应的为表字段

返回新增id在新增对象的id属性中

这种只能使用在自增长的数据库中,比如mysql,在oracle中就不行

2.使用select LAST_INSERT_ID()

   <insert id="insert" parameterType="Person">
           <selectKey keyProperty="personId" resultType="long">
               select LAST_INSERT_ID()
           </selectKey>
           insert into person(name,pswd) values(#{name},#{pswd})
   </insert>

LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。

LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update*作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。

注意:

使用select last_insert_id()时要注意,当一次插入多条记录时,只是获得第一次插入的id值,务必注意。

insert into tb(c1,c2) values (c1value,c2value),(c3value,c4value);select LAST_INSERT_ID();
或者
insert into tb(c1,c2) values (c1value,c2value);
insert into tb(c1,c2) values (c3value,c4value);
select LAST_INSERT_ID();

这两种情况返回的都是最后插入新增的id,就是上文中新增c3value,c4value的id.

3.使用select @@IDENTITY

   <insert id="insert" parameterType="Person">
           <selectKey keyProperty="personId" resultType="long">
               select @@IDENTITY
           </selectKey>
           insert into person(name,pswd) values(#{name},#{pswd})
   </insert>

@@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。比如有个表A,它的自增列是id,当向A表插入一行数据后,如果插入数据后自增列的值自动增加至101,则通过select @@identity得到的值就是101。使用@@identity的前提是在进行insert操作后,执行select @@identity的时候连接没有关闭,否则得到的将是NULL值。

4.在MySql中模拟Sequence

这个比较繁琐,有兴趣的可以看[DB][MySql]关于取得自增字段的值、及@@IDENTITY 与并发性问题

参考:

mybatis 操作数据库的主键自增长

mybatis自增长插入id

[DB][MySql]关于取得自增字段的值、及@@IDENTITY 与并发性问题

Mysql 中获取刚插入的自增长id的值

原文地址:https://www.cnblogs.com/hongdada/p/9956992.html

时间: 2024-11-07 04:53:34

Mybatis自增长id处理的相关文章

Mybatis 插入后返回数据库自动增长ID

MySQL和MSSQL返回主键方法 在personMap.xml中 <insert id="addPerson" parameterType="orm.Person" keyProperty="id" useGeneratedKeys="true"> insert into Person (name,age,gender) values (#{name},#{age},#{gender}) </insert&

mybatis 新增返回id

第一种方式: 在实体类的映射文件 "*Mapper.xml" 这样写: <insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User"> insert into user(userName,password,comment) val

django - 修改 自增长id,起始值

常常你会遇到这样的情况,需要自增长的起始值是 0,再次从 0开始. 两个选择: 1. drop table_name; django重新建表. 2. ALTER TABLE table_name AUTO_INCREMENT=66666; 好吧,我一直粗暴解决问题了很久,NO.2方法明显优雅许多~ 今天群里朋友问起来了,顺便一下啊 django - 修改 自增长id,起始值

分布式自增长ID(Twitter的 Snowflake JAVA实现方案 )

/**<p>项目名:</p>  * <p>包名: com.zdb.module.test</p>  * <p>文件名:IdWorker.java</p>  * <p>版本信息:</p>  * <p>日期:2015-5-23-下午1:17:49</p>  * Copyright (c) 2015singno公司-版权所有  */ package com.zdb.module.test; /

关于MySql中自增长id设置初始值

在MySQL数据库,设置了id为自增长类型,但由于程序还处于开发阶段,很容易的会产生错误数据,然后就直接删除了,可是id的自增长值没有跟着减少,这里提示: 如果表中数据没有用,直接删除了数据,自动增长ID还是不会从1开始的. 那么需要怎么做呢?有两种办法: 1.ALTER TABLE `tablename` auto_increment='22723' ;执行成功,继续插入就从22723开始了:) 2.可以利用“清空数据表”.这样自动增长ID就会从1开始.

Activiti 5.17 --从Activiti的业务对象到MyBatis SQL Mapping ID的映射规则

Activiti 的业务实体层使用 PersistentObject 向数据层传递数据: MyBatis 使用Mapping中的 id 执行SQL 逻辑: 本文讲述了从Activiti PersistentObject 到 MyBatis SQL id 的映射规则. 一.数据层和数据的关系 二.PersistentObject 对象 三.MyBatis 对应的SQL ID 1.insert <insert id="insertProcessDefinition" paramete

利用数据库触发器让字段与自增长Id相关联

十年河东,十年河西,莫欺少年穷 学无止境,精益求精 今天是数据库脚本类的代码,所以不想过多阐述 如下数据表: create table Card( Id int identity(1,1) primary key, CardNo varchar(50) unique not null, Status bit default(0) ) 上述表中有自增长字段Id,现在要求字段 CardNo 和自增长Id 相关联,譬如,当Id为1时,CardNo 应该为 Card00001,当Id为15时,CardN

C#实体类对应SQL数据库的自增长ID怎么设置?

/// <summary> /// 自增长ID /// </summary> [DatabaseGenerated(DatabaseGeneratedOption.Identity)] //若数据库设置自增长,要加这个,不然无法更新修改状态 public int FId { get; set; } 原文地址:https://www.cnblogs.com/firstcsharp/p/11647977.html

Mybatis获取插入记录的自增长ID

需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如下:  <insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User">       insert