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

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

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

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


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


1. insert(全字段插入)

行为

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

SQL 示例

sql 复制代码
INSERT INTO table (col1, col2, col3)
VALUES (#{col1}, #{col2}, #{col3});
  • 如果 defaultFlagnull,SQL 会插入 NULL(覆盖数据库默认值)。

适用场景

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

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

行为

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

SQL 示例

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

适用场景

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

3. insertUseGeneratedKeys(返回自增主键)

行为

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

SQL 示例

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)时使用,否则可能破坏数据库默认值逻辑。

相关推荐
计算机学姐1 天前
基于微信小程序的垃圾分类管理系统【2026最新】
java·vue.js·spring boot·mysql·微信小程序·小程序·mybatis
哲此一生9842 天前
SpringBoot3集成Mybatis(开启第一个集成Mybatis的后端接口)
java·spring boot·mybatis
九转苍翎2 天前
Java外功精要(3)——Spring配置文件和mybatis
spring boot·mybatis
程序员三明治2 天前
【Mybatis从入门到入土】ResultMap映射、多表查询与缓存机制全解析
java·sql·缓存·mybatis·resultmap·缓存机制·多表查询
此剑之势丶愈斩愈烈2 天前
mybatis-plus分页插件使用
mybatis
!if2 天前
springboot mybatisplus 配置SQL日志,但是没有日志输出
spring boot·sql·mybatis
讓丄帝愛伱2 天前
Mybatis Log Free插件使用
java·开发语言·mybatis
gaoshan123456789102 天前
‌MyBatis-Plus 的 LambdaQueryWrapper 可以实现 OR 条件查询‌
java·tomcat·mybatis
The best are water3 天前
jeesite mybatis添加拦截器,推送指定表的变更数据到其他数据库
数据库·mybatis
lunz_fly19923 天前
【源码解读之 Mybatis】【核心篇】-- 第6篇:StatementHandler语句处理器
mybatis