MyBatis轻松获取自增长主键的几种方法小结

 更新时间:2025年06月18日 09:41:47   作者:墨瑾轩  
在日常开发中,获取自增长主键是一个非常常见的需求,尤其是在使用MyBatis进行数据库操作时,然而,很多人在初次接触这个功能时会感到困惑,不知道该如何下手,别担心,本文将详细介绍MyBatis获取自增长主键的几种方法,需要的朋友可以参考下

引言:告别繁琐,拥抱高效!

在日常开发中,获取自增长主键是一个非常常见的需求,尤其是在使用MyBatis进行数据库操作时。然而,很多人在初次接触这个功能时会感到困惑,不知道该如何下手。别担心,本文将详细介绍MyBatis获取自增长主键的几种方法,并附上详细的代码示例和注意事项,让你轻松掌握这一技能!

第一步:使用 useGeneratedKeys 获取自增长主键

概述

useGeneratedKeys 是 MyBatis 提供的一个属性,用于在插入数据时获取数据库自动生成的主键值。这种方法简单直接,适用于大多数支持自增长主键的数据库。

代码示例

假设我们有一个 User 表,其结构如下:

CREATE TABLE `user` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL,
  `email` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

对应的 User 实体类如下:

public class User {
    private Integer id;
    private String name;
    private String email;

    // Getters and Setters
}

Mapper 接口

public interface UserMapper {
    int insertUser(User user);
}

Mapper XML 文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">

    <!-- 使用 useGeneratedKeys 获取自增长主键 -->
    <insert id="insertUser" parameterType="com.example.entity.User" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user (name, email) VALUES (#{name}, #{email})
    </insert>

</mapper>

测试代码

@SpringBootTest
public class MyBatisTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testInsertUser() {
        User user = new User();
        user.setName("John Doe");
        user.setEmail("john.doe@example.com");

        // 插入数据
        int result = userMapper.insertUser(user);

        // 检查插入结果
        assertEquals(1, result);

        // 获取自增长主键
        assertNotNull(user.getId());
        System.out.println("Generated ID: " + user.getId());
    }
}

深度解析

  • 定义实体类:创建一个 User 类,包含 id、name 和 email 属性。
  • 创建 Mapper 接口:定义一个 UserMapper 接口,包含一个 insertUser 方法。
  • 编写 Mapper XML 文件:在 UserMapper.xml 文件中,使用 <insert> 标签定义插入语句,并设置 useGeneratedKeys="true" 和 keyProperty="id"。
  • 测试代码:编写测试代码,创建一个 User 对象,调用 insertUser 方法插入数据,并检查插入结果和生成的主键值。

第二步:使用 selectKey 获取自增长主键

概述

除了 useGeneratedKeys,MyBatis 还提供了一个 <selectKey> 标签,可以在插入数据后获取自增长主键。这种方法适用于更复杂的场景,如需要在插入前生成主键值。

代码示例

假设我们有一个 Order 表,其结构如下:

CREATE TABLE `order` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `user_id` INT(11) NOT NULL,
  `amount` DECIMAL(10, 2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

对应的 Order 实体类如下:

public class Order {
    private Integer id;
    private Integer userId;
    private BigDecimal amount;

    // Getters and Setters
}

Mapper 接口

public interface OrderMapper {
    int insertOrder(Order order);
}

Mapper XML 文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.OrderMapper">

    <!-- 使用 selectKey 获取自增长主键 -->
    <insert id="insertOrder" parameterType="com.example.entity.Order">
        <selectKey keyProperty="id" resultType="int" order="AFTER">
            SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO `order` (user_id, amount) VALUES (#{userId}, #{amount})
    </insert>

</mapper>

测试代码

@SpringBootTest
public class MyBatisTest {

    @Autowired
    private OrderMapper orderMapper;

    @Test
    public void testInsertOrder() {
        Order order = new Order();
        order.setUserId(1);
        order.setAmount(new BigDecimal("100.00"));

        // 插入数据
        int result = orderMapper.insertOrder(order);

        // 检查插入结果
        assertEquals(1, result);

        // 获取自增长主键
        assertNotNull(order.getId());
        System.out.println("Generated ID: " + order.getId());
    }
}

深度解析

  • 定义实体类:创建一个 Order 类,包含 id、userId 和 amount 属性。
  • 创建 Mapper 接口:定义一个 OrderMapper 接口,包含一个 insertOrder 方法。
  • 编写 Mapper XML 文件:在 OrderMapper.xml 文件中,使用 <insert> 标签定义插入语句,并嵌套 <selectKey> 标签,设置 keyProperty="id" 和 resultType="int",并在 <selectKey> 标签中编写 SQL 语句 SELECT LAST_INSERT_ID()。
  • 测试代码:编写测试代码,创建一个 Order 对象,调用 insertOrder 方法插入数据,并检查插入结果和生成的主键值。

第三步:注意事项与常见面试题

注意事项

  • 数据库支持:确保你的数据库支持自增长主键,如 MySQL、PostgreSQL 等。
  • 配置正确:确保 useGeneratedKeys 和 keyProperty 配置正确,否则无法获取自增长主键。
  • 事务管理:在插入数据时,确保事务管理得当,避免数据不一致问题。
  • 并发处理:在高并发场景下,注意 LAST_INSERT_ID() 的线程安全性。

常见面试题

什么是 useGeneratedKeys

  • useGeneratedKeys 是 MyBatis 中的一个属性,用于在插入数据时获取数据库自动生成的主键值。

如何使用 selectKey 获取自增长主键?

  • 在 <insert> 标签中嵌套 <selectKey> 标签,设置 keyProperty 和 resultType,并在 <selectKey> 标签中编写 SQL 语句 SELECT LAST_INSERT_ID()

useGeneratedKeys 和 selectKey 的区别是什么?

  • useGeneratedKeys 更简单直接,适用于大多数场景;selectKey 更灵活,适用于需要在插入前生成主键值的场景。

如何处理高并发下的自增长主键问题?

  • 在高并发场景下,注意 LAST_INSERT_ID() 的线程安全性,可以考虑使用分布式锁或数据库的事务管理机制。

总结:MyBatis,让获取自增长主键变得简单!

通过以上三个步骤的详细讲解,相信你已经掌握了 MyBatis 获取自增长主键的方法和注意事项。无论是初学者还是经验丰富的开发者,都可以轻松应对这一常见的开发需求。

以上就是MyBatis轻松获取自增长主键的几种方法小结的详细内容,更多关于MyBatis获取自增长主键的资料请关注脚本之家其它相关文章!

相关文章

  • Java遍历并删除Map的四种方法对比

    Java遍历并删除Map的四种方法对比

    在Java中,遍历并删除 Map 中的元素有四种常见的方法,每种方法都有其适用场景和优缺点,下面小编就来和大家详细介绍一下这几种方法的具体实现吧
    2024-10-10
  • RestTemplate文件上传下载与大文件流式下载

    RestTemplate文件上传下载与大文件流式下载

    这篇文章主要为大家介绍了RestTemplate文件上传下载与大文件流式下载的使用方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步
    2022-03-03
  • IDEA 连接数据库的实现方法

    IDEA 连接数据库的实现方法

    这篇文章主要介绍了IDEA 连接数据库的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Redis打开rdb文件常用方法详解

    Redis打开rdb文件常用方法详解

    这篇文章主要介绍了Redis打开rdb文件常用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Spring框架实现AOP的两种方式详解

    Spring框架实现AOP的两种方式详解

    这篇文章主要为大家详细介绍了Spring框架实现AOP的两种方式,文中的示例代码讲解详细,对我们学习有一定的借鉴价值,需要的可以参考一下
    2022-09-09
  • SpringBoot集成Auth0 JWT的示例代码

    SpringBoot集成Auth0 JWT的示例代码

    本文主要介绍了SpringBoot集成Auth0 JWT的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • SpringBoot使用AOP记录接口操作日志详解

    SpringBoot使用AOP记录接口操作日志详解

    这篇文章主要为大家详细介绍了SpringBoot使用AOP记录接口操作日志,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • spring中时间格式化的两种方法示例讲解

    spring中时间格式化的两种方法示例讲解

    这篇文章主要介绍了spring中时间格式化的两种方法,方法一自己格式化,方法二通过配置,结合实例代码讲解的非常详细,文中补充介绍了Spring项目中时间格式化的方法,需要的朋友可以参考下
    2023-08-08
  • des加密解密JAVA与.NET互通实例

    des加密解密JAVA与.NET互通实例

    这篇文章主要介绍了des加密解密JAVA与.NET互通实例,大家参考使用吧
    2013-12-12
  • 阿里面试Nacos配置中心交互模型是push还是pull原理解析

    阿里面试Nacos配置中心交互模型是push还是pull原理解析

    这篇文章主要为大家介绍了阿里面试Nacos配置中心交互模型是push还是pull原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论