MYSQL插入数据后返回自增ID的方法和插入

xzdxmynet 发布于 2024-04-25 阅读(25)

我们都知道MySQL中插入后会有一个返回值,返回的是受影响的行数。 也就是说,一条数据插入成功则返回1,失败则返回0。 嗯,很多时候我们想要获取最后插入的 id 值。 根据场景可以使用以下七种方法。

MYSQL插入数据后返回自增ID的方法

mysql 和插入之间的一个很大的区别是它支持序列作为 ID。 Mysql本身有一列可以作为自增字段。 插入一条数据后,mysql如何获取这个自增ID的值呢?

1. 使用

SELECT LAST_INSERT_ID();

每次连接后生成的 ID 都会保存在服务器中。 这意味着函数返回给给定客户端的值是该客户端为影响该列的最新语句生成的第一个值。 该值不会受到其他客户端的影响,即使它们生成自己的值。 此行为可确保您可以检索自己的 ID,而无需担心其他客户端活动,并且无需锁定或处理。

每个操作都可以理解为MySQL服务器上的一次“原子”操作。 写操作通常需要表锁。 锁定表的是MySQL应用程序服务器,而不是我们的应用程序。

值得注意的是,如果一次插入多条记录,该函数返回第一条记录的ID值。

因为它是基于 的,所以只要每个线程使用单独的对象,该函数就会返回该对生成的最新或第一个 ID。 该值不会受到其他客户端的影响(),确保您可以检索自己的ID,而无需担心其他客户端的活动,并且无需锁定。 使用单个语句插入多条记录并返回一个列表。

和桌子没有关系。 如果向a表插入数据,然后向b表插入数据,就会发生变化。

所以我们可以使用下面的方法:

<insert id="insert" parameterType="com.dl.blog.pojo.BlogTag">
    <selectKey resultType="integer" order="AFTER" keyProperty="id">
      SELECT LAST_INSERT_ID()
    </selectKey>
   insert into blog_tag (name)
   values  (#{name,jdbcType=VARCHAR})
</insert>

2.使用max(id)

它使用基本连接。 如果在更改窗口时调用它,它将始终返回 10。

如果插入不频繁的话,我们也可以使用该方法来获取返回的id值。

select max(id) from user;

这种方法的缺点是不适合高并发。 如果同时插入,返回的值可能不准确。

3、创建一个存储过程,在存储过程中调用先插入后取最大值的操作。

DELIMITER $$
DROP PROCEDURE IF EXISTS `test` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(in name varchar(100),out oid int)
BEGIN
  insert into user(loginname) values(name);
  select max(id) from user into oid;
  select oid;
END $$
DELIMITER ;
call test('gg',@id);

4.使用@@

select @@IDENTITY

@@表示最后一次向有属性的表(即自增列)插入数据时对应自增列的值。 它是系统定义的全局变量。 一般来说,系统定义的全局变量以@@开头,用户定义的变量以@开头。 例如,有表A,其自增列为id。 当A表插入一行数据时,如果插入数据后自增列的值自动增加到101,则通过@@得到的值为101。使用@@的前提是操作后,执行@@时连接不会关闭,否则结果将为NULL值。

5.使用()

Connection conn = ;
Serializable ret = null;
PreparedStatement state = .;
ResultSet rs=null;
try {
    state.executeUpdate();
    rs = state.getGeneratedKeys();
    if (rs.next()) {
        ret = (Serializable) rs.getObject(1);
    }     
} catch (SQLException e) {
}
return ret;

综上所述,在mysql中插入后获取ID,在高并发的情况下是非常容易出错的。 另外,虽然是基于,但是不知道为什么测试不成功。

6.

事实上,通过在框架中使用这个节点,并将返回值类型设置为 ,就可以返回 id 值。

为了解决使用数据时不支持自动生成主键的问题,他可以随意设置生成主键的方法。

不管多好,尽量不要遇到这种情况,毕竟很麻烦。

属性说明

应作为语句结果设置的目标属性。

结果的类型。 一般是可以算出来的,但是写起来没有问题。 任何简单类型都可以用作主键类型,包括字符串。

命令

可以设置为“之后”或“之后”。 如果设置为 ,那么它将首先选择主键,设置它,然后执行插入语句。 如果设置为 AFTER,则首先执行插入语句,然后执行元素 - 这类似于数据库,您可以在插入语句中嵌入序列调用。

和之前一样,支持的映射类型,和语句分别代表 和 类型。

您需要注意 order 属性。 在Mysql等支持自动增长的数据库中,order需要设置为after才能得到正确的值。

取这样的序列时需要设置为,否则会报错。

另外,当使用管理事务时,它被插入到同一个事务中。 因此,像Mysql这样的情况,由于数据没有插入到数据库中,所以无法获取到自动增长的Key。 去掉事务管理就不会有问题了。

以下是 xml 和注释的示例。 这很简单。 两个例子就足够了:

<insert id="insert" parameterType="map">  
    insert into table1 (name) values (#{name})  
    <selectKey resultType="java.lang.Integer" keyProperty="id">  
      CALL IDENTITY()  
    </selectKey>  
</insert>

上面xml的传入参数是map,结果会放入传入参数map中。 使用POJO时情况也是一样,但是有一点需要注意的是POJO中对应的字段必须有对应的方法,并且参数类型必须一致,否则会报错。

带注释的版本:

@Insert("insert into table2 (name) values(#{name})")  
@SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class)  
int insertTable2(Name name); 

7. 使用

首先在文件中添加属性and,其中是Java对象的属性名,而不是表的字段名。

  <insert id="insert" parameterType="com.dl.blog.pojo.BlogTag" useGeneratedKeys="true" keyProperty="id">
    insert into blog_tag (name)
    values  (#{name,jdbcType=VARCHAR})
  </insert>

那么我们在java代码中执行insert语句后,就会自动将自增值赋给对象的属性id。 所以可以通过相应的方法来获取!

int count=blogTagMapper.insert(blogTag);//返回的是影响记录的行数
int id=blogTag.getId();//获取到的即为新插入记录的ID 

POJO实体类、省略、构造方法

public class BlogTag {
    private Integer id;
    private String name;
}

数据库表结构:

【防范措施】

1.文件中,必须添加and,并且必须与Java对象的属性名一致,而不是表的字段名。

2、对于java Dao中的方法,传递的参数必须是java对象,即Bean,而不是某个参数。

参考链接:

[1]、mysql函数六:Mysql插入数据后返回自增ID方法,(),

标签:  插入 返回 语句 操作 字段 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。