当前位置: 首页 > news >正文

mybatis 自带的几个插入接口的区别

研究这个的原由是应为需求对一张表新增了一个有默认值的字段,然后调用插入接口的时候发现这个字段没有传默认值但是还是以null值入库了,数据库中设置的默认值没有生效。

通过排查之后发现是使用了insertUseGeneratedKeys 方法进行插入,此方法就算是没有给对象的某个属性赋值也是会全字段null进行插入。

以此文记录此问题以及解决的方法。


在 MyBatis 中,insertinsertSelective 和 insertUseGeneratedKeys 是常见的插入操作方法,它们的核心区别在于 字段处理方式 和 主键返回逻辑。以下是详细对比:


1. insert(全字段插入)

行为

  • 全字段插入:无论字段是否为 null,所有字段都会出现在 SQL 中。
  • 主键处理:默认不返回自增主键,除非显式配置 useGeneratedKeys

SQL 示例

INSERT INTO table (col1, col2, col3)
VALUES (#{col1}, #{col2}, #{col3});
  • 如果 defaultFlag 为 null,SQL 会插入 NULL(覆盖数据库默认值)。

适用场景

  • 需要强制插入所有字段(即使为 null)。
  • 表字段与实体类字段完全一致且无默认值约束。

2. insertSelective(动态插入非空字段)

行为

  • 动态插入:仅插入非 null 字段,忽略值为 null 的字段。
  • 主键处理:默认不返回自增主键(需结合 @Options 或全局配置启用)。

SQL 示例

INSERT INTO table (col1, col2)
VALUES (#{col1}, #{col2});
  • 如果 defaultFlag 为 null,该字段不会出现在 SQL 中,数据库使用默认值填充。

适用场景

  • 表字段有默认值约束,希望依赖数据库填充默认值。
  • 仅需插入部分字段(如避免覆盖数据库默认值)。

3. insertUseGeneratedKeys(返回自增主键)

行为

  • 全字段插入:与 insert 类似,所有字段都会被插入。
  • 主键处理:返回数据库生成的自增主键(如 MySQL 的 AUTO_INCREMENT)。

SQL 示例

INSERT INTO table (col1, col2, col3)
VALUES (#{col1}, #{col2}, #{col3});
  • 插入后,自增主键值会回写到实体类的 id 字段。

适用场景

  • 需要获取插入后生成的自增主键。
  • 明确需要全字段插入(即使包含 null 值)。

对比总结

方法字段处理主键返回适用场景
insert全字段插入(含 null不返回强制插入所有字段
insertSelective仅插入非空字段不返回依赖数据库默认值,部分字段插入
insertUseGeneratedKeys全字段插入(含 null返回需要自增主键且全字段插入

使用建议

  1. 优先使用 insertSelective

    适用于大多数场景,避免因插入 null 覆盖数据库默认值,更符合动态业务需求。

  2. 需要主键时使用 insertUseGeneratedKeys

    若必须获取自增主键且接受全字段插入,可结合 @Options 使用。

  3. 谨慎使用 insert

    仅在明确需要覆盖所有字段(包括 null)时使用,否则可能破坏数据库默认值逻辑。

http://www.dtcms.com/a/110084.html

相关文章:

  • 激光加工中平面倾斜度的矫正
  • AI图片设计常用提示词分类表
  • Redis 主要能够用来做什么
  • 企业级日志分析平台: ELK 集群搭建指南
  • TypeScript工程集成
  • 【数据结构】邻接矩阵完全指南:原理、实现与稠密图优化技巧​
  • 位运算题目:数字范围按位与
  • 【系统分析师-第二篇】
  • SQL语句(二)—— DML
  • (DreamerV3)Mastering Diverse Domains through World Models
  • 《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》
  • 3499 幸运数字
  • LeetCode 2140.解决智力问题:记忆化搜索(DFS) / 动态规划(DP)
  • 使用 React 和 Konva 实现一个在线画板组件
  • 前端对接下载文件接口、对接dart app
  • 【解决】VsCode中code runner无法使用cin 输入
  • 大学生机器人比赛实战(一)综述篇
  • 用树莓派和ads1115采样模拟量 保姆级教程
  • 基于CYT4BB MCAL完成对DS_SA47321功能开发
  • python match case语法
  • 2025年中级社会工作者考试模拟题
  • 大模型备案材料:评估测试题集真实案例详解
  • 基数排序算法解析与TypeScript实现
  • 《双影奇境》手机版上线?ToDesk用跨平台技术实现「全设备云电脑3A游戏」
  • liunx日志查询常用命令总结
  • Cesium 时间线 及 坐标转换
  • PyTorch复现逻辑回归
  • 高效深度学习lecture03
  • 强化学习DDPG算法
  • 【C++进阶九】继承和虚继承