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

相关推荐
ANGLAL1 小时前
17.MyBatis动态SQL语法整理
java·sql·mybatis
北城以北88886 小时前
SSM--MyBatis框架之缓存
java·缓存·intellij-idea·mybatis
凌波粒9 小时前
MyBatis完整教程IDEA版(3)--动态SQL/MyBatis缓存
sql·intellij-idea·mybatis
小马爱打代码11 小时前
MyBatis:进阶 - 动态 SQL、关联查询与缓存
sql·缓存·mybatis
cici1587414 小时前
MyBatis注解的运用于条件搜索实践
java·tomcat·mybatis
fenglllle19 小时前
mybatis-plus SQL 注入漏洞导致版本升级引发的问题
数据库·sql·mybatis
C++chaofan1 天前
MyBatis - Plus学习笔记
java·spring boot·笔记·后端·mysql·架构·mybatis
只因在人海中多看了你一眼2 天前
B.40.3.2-MyBatis核心技术详解与性能优化
性能优化·mybatis
.又是新的一天.2 天前
健身房预约系统SSM+Mybatis(五、预约展示)
前端·mybatis
北城以北88882 天前
SSM--MyBatis框架之动态SQL
java·开发语言·数据库·sql·mybatis