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 SpringBootWeb请求响应举例详解

    java SpringBootWeb请求响应举例详解

    SpringBoot是一种整合Spring技术栈的方式(或者说是框架),同时也是简化Spring的一种快速开发的脚手架,这篇文章主要给大家介绍了关于java SpringBootWeb请求响应的相关资料,需要的朋友可以参考下
    2024-05-05
  • Spring  @Scheduled中这些参数的区别、组合和应用场景解析

    Spring  @Scheduled中这些参数的区别、组合和应用场景解析

    SpringBoot中的定时任务调度提供了多种方式,包括 cron 表达式、fixedRate、fixedDelay 和 initialDelay,每种方式都有其特点和适用场景,通过合理配置,可以满足不同任务的调度需求,本文介绍Spring  @Scheduled中这些参数的区别、组合和应用场景解析,感兴趣的朋友一起看看吧
    2026-01-01
  • 2018版java多线程面试题集合及答案

    2018版java多线程面试题集合及答案

    这篇文章主要为大家详细介绍了2018版java多线程面试题集合及答案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • 深入了解Spring中Bean的作用域和生命周期

    深入了解Spring中Bean的作用域和生命周期

    这篇文章主要介绍了深入了解Spring中Bean的作用域和生命周期,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java的关键字之transient详解

    Java的关键字之transient详解

    这篇文章主要介绍了Java的关键字之transient详解,在Java编程中,transient是一个关键字,通常用于修饰变量,它的主要作用是用于指示JVM在对象序列化时忽略指定变量,从而避免数据泄露的安全问题,需要的朋友可以参考下
    2023-09-09
  • 全面解析Java中的HashMap类

    全面解析Java中的HashMap类

    HashMap类为Java提供了键值对应的map类型,本文将从源码角度全面解析Java中的HashMap类,同时包括其各种常用操作方法等,欢迎参考与借鉴
    2016-05-05
  • mybatis动态sql之新增与更新方式

    mybatis动态sql之新增与更新方式

    这篇文章主要介绍了mybatis动态sql之新增与更新方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • java二叉查找树的实现代码

    java二叉查找树的实现代码

    这篇文章主要为大家详细介绍了java二叉查找树的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 如何基于ssm框架实现springmvc拦截器

    如何基于ssm框架实现springmvc拦截器

    这篇文章主要介绍了如何基于ssm框架实现springmvc拦截器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • SpringCloud LoadBalancer负载均衡策略与缓存机制详解

    SpringCloud LoadBalancer负载均衡策略与缓存机制详解

    这篇文章主要介绍了SpringCloud LoadBalancer负载均衡策略与缓存机制详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-03-03

最新评论