Plantre Plantre
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

plantre

一个后端开发者
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机组成原理

  • 操作系统

  • 计算机网络

  • 设计模式

  • Java

  • Spring

    • Spring 事务
    • Spring Boot自动装配基于SPI实现的吗
    • SpringBoot自动装配是什么
    • MyBatis插入数据后回填id
    • springboot2.5.15整合prometheus
    • 集成loki
  • SpringCloud

  • MySQL

  • Redis

  • 分布式

  • Zookeeper

  • Dubbo

  • Kafka

  • 数据结构

  • 算法

  • OJ

  • 从道家哲学看计算机?
  • 后端
  • Spring
plantre
2025-05-08

MyBatis插入数据后回填id

在 MyBatis 中插入数据后回填自增主键(如 MySQL 的 AUTO_INCREMENT)可以通过以下两种方式实现,以下是详细说明和示例:


方法 1:useGeneratedKeys + keyProperty(推荐)

适用于支持自增主键的数据库(如 MySQL),直接在 insert 标签中配置:

Mapper XML 配置

<insert id="insertUserAccount" 
        parameterType="com.example.entity.UserAccount"
        useGeneratedKeys="true" 
        keyProperty="id">  <!-- 将生成的 key 回填到实体类的 id 属性 -->
    INSERT INTO sys_user_account (
        create_time, update_time, create_by, update_by, remark,
        supplier_id, user_id, total_charge_amount, total_give_back_amount,
        available_balance_amount, balance_amount, effect
    ) VALUES (
        #{createTime}, #{updateTime}, #{createBy}, #{updateBy}, #{remark},
        #{supplierId}, #{userId}, #{totalChargeAmount}, #{totalGiveBackAmount},
        #{availableBalanceAmount}, #{balanceAmount}, #{effect}
    )
</insert>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Java 实体类

确保实体类中有 id 字段及其对应的 setter 方法:

public class UserAccount {
    private Integer id;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
    // 其他字段及 getter/setter...
    
    // 必须有 setter 方法
    public void setId(Integer id) {
        this.id = id;
    }
}
1
2
3
4
5
6
7
8
9
10
11

调用示例

UserAccount account = new UserAccount();
// 设置其他字段值...
userAccountMapper.insertUserAccount(account);  // 执行插入

// 插入后,自动回填的 id 会直接赋给 account 对象
System.out.println("生成的ID:" + account.getId()); 
1
2
3
4
5
6

方法 2:selectKey 标签(通用方案)

适用于不支持自增主键的数据库(如 Oracle),或需要显式控制主键生成逻辑的场景。

Mapper XML 配置

<insert id="insertUserAccount" parameterType="com.example.entity.UserAccount">
    <selectKey 
        keyProperty="id"          <!-- 回填到实体类的 id 属性 -->
        resultType="java.lang.Integer" 
        order="AFTER">           <!-- 在 INSERT 语句执行后执行 -->
        SELECT LAST_INSERT_ID()  <!-- MySQL 获取自增主键的函数 -->
    </selectKey>
    
    INSERT INTO sys_user_account (
        create_time, update_time, create_by, update_by, remark,
        supplier_id, user_id, total_charge_amount, total_give_back_amount,
        available_balance_amount, balance_amount, effect
    ) VALUES (
        #{createTime}, #{updateTime}, #{createBy}, #{updateBy}, #{remark},
        #{supplierId}, #{userId}, #{totalChargeAmount}, #{totalGiveBackAmount},
        #{availableBalanceAmount}, #{balanceAmount}, #{effect}
    )
</insert>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

关键注意事项

  1. 确保数据库支持自增主键
    • 检查表结构中的 id 字段是否定义为 AUTO_INCREMENT(MySQL)。

  2. 避免手动设置 id
    • 插入时不要在 SQL 中传递 id 值,否则会覆盖数据库生成的值。

  3. Oracle 或其他数据库适配
    • 如果使用 Oracle,需改用序列(Sequence)并调整 selectKey 逻辑:

    <selectKey keyProperty="id" resultType="java.lang.Long" order="BEFORE">
        SELECT your_sequence.NEXTVAL FROM DUAL
    </selectKey>
    
    1
    2
    3
  4. 实体类必须有 setter 方法
    • MyBatis 依赖 setter 方法回填主键值。


完整示例代码 Service 层调用

public void createAccount(UserAccount account) {
    userAccountMapper.insertUserAccount(account);
    // 插入后直接使用 account.getId() 获取主键
    log.info("新账户ID:{}", account.getId());
}
1
2
3
4
5

通过上述配置,MyBatis 会在插入数据后自动将数据库生成的主键值回填到实体对象的 id 字段中。

编辑 (opens new window)
上次更新: 2025/06/10, 09:18:05
SpringBoot自动装配是什么
springboot2.5.15整合prometheus

← SpringBoot自动装配是什么 springboot2.5.15整合prometheus→

最近更新
01
集成loki
07-04
02
TCP的ESTABLISHED是什么意思
06-24
03
安装1panel
06-24
更多文章>
Theme by Vdoing | Copyright © 2025-2025 plantre | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式