Mybatis在insert插入操作后如何返回主键id问题

 更新时间:2023年12月08日 10:31:57   作者:z1ztai  
这篇文章主要介绍了Mybatis在insert插入操作后如何返回主键id问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、使用JDBC的getGeneratedKeys方法

JDBC 提供了一个 getGeneratedKeys 方法,用于获取插入记录的主键 ID。

在 MyBatis 中,我们可以通过设置 useGeneratedKeys 和 keyProperty 属性来使用该方法。

1. 设置 useGeneratedKeys 属性

useGeneratedKeys 属性的作用是告诉 MyBatis 使用 JDBC 的 getGeneratedKeys 方法获取插入记录的主键 ID。

在配置文件中,我们可以在 insert 元素中设置 useGeneratedKeys 属性:

<insert id="insertUser" parameterType="User" useGeneratedKeys="true">
    insert into user (name, age) values (#{name}, #{age})
</insert>

2. 设置keyProperty属性

keyProperty 属性的作用是指定主键 ID 赋值的目标属性。

在配置文件中,我们可以在 insert 元素中设置 keyProperty 属性:

<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
    insert into user (name, age) values (#{name}, #{age})
</insert>

使用 JDBC 的 getGeneratedKeys 方法获取主键 ID 的方式非常简单,但需要注意的是,该方法只适用于支持自动生成主键的数据库,如 MySQL、Oracle 等。

二、使用SELECT LAST_INSERT_ID()函数

对于不支持 JDBC 的 getGeneratedKeys 方法的数据库,我们可以使用 SELECT LAST_INSERT_ID() 函数获取插入记录的主键 ID。

在 MyBatis 中,我们可以通过设置 useGeneratedKeys 和 keyProperty 属性来使用该方法。

1. 设置 useGeneratedKeys 属性

在配置文件中,我们可以在 insert 元素中设置 useGeneratedKeys 属性,并将其值设为 false:

<insert id="insertUser" parameterType="User" useGeneratedKeys="false">
    insert into user (name, age) values (#{name}, #{age})
 <selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER">
    SELECT LAST_INSERT_ID()
 </selectKey>
</insert>

2. 使用 SELECT LAST_INSERT_ID() 函数

在 insert 元素结束后,我们可以使用 SELECT LAST_INSERT_ID() 函数获取插入记录的主键 ID:

<insert id="insertUser" parameterType="User" useGeneratedKeys="false">
    insert into user (name, age) values (#{name}, #{age})
 <selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER">
    SELECT LAST_INSERT_ID()
 </selectKey>
</insert>

使用 SELECT LAST_INSERT_ID() 函数获取主键 ID 的方式也比较简单,但需要注意的是,该方法只适用于支持 SELECT LAST_INSERT_ID() 函数的数据库,如 MySQL 等。

三、使用UUID作为主键

在某些情况下,我们可能并不需要数据库自动生成主键,而是需要自定义主键。

在这种情况下,我们可以使用 UUID 作为主键,MyBatis 中也提供了相应的支持。

1. 定义主键为 UUID

在定义表结构时,我们可以将主键定义为 UUID 类型:

CREATE TABLE user (
    id VARCHAR(36) PRIMARY KEY,
    name VARCHAR(20),
    age INT
);

2. 使用 UUID 生成主键

在 MyBatis 中,我们可以使用 UUID 生成主键,并将其赋值给对象的 id 属性。

在配置文件中,我们可以在 insert 元素中使用 selectKey 元素来生成主键:

<insert id="insertUser" parameterType="User">
    <selectKey resultType="java.lang.String" keyProperty="id" order="BEFORE">
        SELECT UUID()
    </selectKey>
    insert into user (id, name, age) values (#{id}, #{name}, #{age})
</insert>

在 selectKey 元素中,我们使用 SELECT UUID() 函数生成主键,并将其赋值给对象的 id 属性。

这样,在执行插入操作时,id 属性就会被赋值为生成的 UUID。

使用 UUID 作为主键的方式可以灵活地满足不同的需求,但需要注意的是,在某些场景下,UUID 的性能可能不如自增主键。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解Java如何通过装饰器模式扩展系统功能

    详解Java如何通过装饰器模式扩展系统功能

    这篇文章主要为大家详细介绍了Java如何通过装饰器模式扩展系统功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-04-04
  • JVM的常用命令汇总

    JVM的常用命令汇总

    监测java应用,最方便的就是直接使用jdk提供的现成工具,在jdk的安装的bin目录下,已经提供了多种命令行监测工具。本文为大家总结了几个JVM的常用命令,需要的可以参考一下
    2022-10-10
  • java实现适用于安卓的文件下载线程类

    java实现适用于安卓的文件下载线程类

    本文给大家分享的是java实现适用于安卓的文件下载线程类的代码,有需要的小伙伴可以参考下
    2015-07-07
  • SpringMVC异步处理的 5 种方式示例详解

    SpringMVC异步处理的 5 种方式示例详解

    这篇文章主要介绍了SpringMVC异步处理的 5 种方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • SpringMVC 异常处理机制与自定义异常处理方式

    SpringMVC 异常处理机制与自定义异常处理方式

    这篇文章主要介绍了SpringMVC 异常处理机制与自定义异常处理方式,具有很好的开车价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java生成二维码的实现方式汇总

    Java生成二维码的实现方式汇总

    本文将基于Spring Boot介绍两种生成二维码的实现方式,一种是基于Google开发工具包,另一种是基于Hutool来实现,下面我们将基于Spring Boot,并采用两种方式实现二维码的生成,对于每一种方式还提供两种类型的二维码返回形式,需要的朋友可以参考下
    2023-09-09
  • 解决SpringBoot集成Eureka导致返回结果由json变为xml的问题

    解决SpringBoot集成Eureka导致返回结果由json变为xml的问题

    这篇文章主要介绍了解决SpringBoot集成Eureka导致返回结果由json变为xml的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • struts2数据处理_动力节点Java学院整理

    struts2数据处理_动力节点Java学院整理

    Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理。下面通过本文给大家分享struts2数据处理的相关知识,感兴趣的朋友参考下吧
    2017-09-09
  • Java实现按行读取大文件

    Java实现按行读取大文件

    这篇文章主要介绍了Java实现按行读取大文件的方法的小结,非常的简单实用,有需要的小伙伴尅参考下。
    2015-05-05
  • 深入理解Java8新特性之Stream API的终止操作步骤

    深入理解Java8新特性之Stream API的终止操作步骤

    Stream是Java8的一大亮点,是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的 聚合操作(aggregate operation)或者大批量数据操作。Stream API借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性,感兴趣的朋友快来看看吧
    2021-11-11

最新评论