当新增字段定义为 not null default 的时候,insert和insertSelective两种不同的插入语法会有不同的影响:

  • insert into (x,y,z) values(a, b,c)和insert into (x,y) values(a, b),对应字段z,前者数据库中的默认值不生效(即使c是null也不生效,并且会报错),后者生效
  • insertSelective这种方式:不传值或者传的值为null的时候默认值会都会生效,注意:传的值为null的时候和insert的方式是有区别的

总结
1.因此,变更ddl的时候,对于新增字段一般都不要定义为not null,可能会对之前的业务有影响,即使定义为了not null default也会对之前的业务有影响(具体要看之前的sql)
2.尽量使用insertSelective的方式插入数据,防止插入数据报错
3.数据默认值尽量不要设置具有业务含义的默认值,否则不能看出是否是正常数据还是异常数据
4.实体层如果有默认值,尽量不要设置具有业务含义的默认值,否则不能看出是否是正常数据还是异常数据

案例分析:

  1. 成绩单数据插入
DDL: create table `score` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '成绩id',
`math` tiny(2) NOT NULL DEFAULT '0' COMMENT '数学分数',
`english` tiny(2)  DEFAULT '0' COMMENT '英语分数',
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '名字'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='成绩单'
如果表`score`对应的实体是
public class Score {private Long id;private Long math;private Long english;private String name;
}
Score score = new Score();
score.setEnglish(90);
score.setName("狗蛋");
scoreMapper.insert(score);

如果对应的插入语句是 insert into(english, name, math) values(#{english}, #{name},#{math}) 系统报错
如果对应的插入语句是 insert into(english, name) values(#{english}, #{name})默认值生效
如果对应的插入语句是 insertSelective的方式默认值生效

insert insertSelective
math不传值 默认值生效 默认值生效
math传null 系统报错 默认值生效(< if test=“math != null”>)
math传普通值 默认值不生效 默认值不生效

参考文档:
insert和insertSelective区别

insert和insertSelective的区别相关推荐

  1. insert 和 insertSelective的区别

    使用逆向工程生成的代码做一个添加时通常都会给出两个答案,如题目想要增加一条数据会让你选择insert或者insertSelective 两者的区别在于如果选择insert 那么所有的字段都会添加一遍即 ...

  2. MyBatis插入相关问题(insert、InsertSelective)

    自动生成代码insert和insertSelective的区别 自动生成的mybatis对应配置文件里面,有两个方法,分别为insert和insertSelective.这两个方法均是插入对象的方法. ...

  3. SELECT INTO和INSERT INTO SELECT的区别 类似aaa?a=1b=2c=3d=4,如何将问号以后的数据变为键值对 C# 获取一定区间的随即数 0、1两个值除随机数以外...

    SELECT INTO和INSERT INTO SELECT的区别 数据库中的数据复制备份 SELECT INTO: 形式: [sql] view plaincopyprint? SELECT val ...

  4. [c++] insert和emplace的区别

    emplace()和emplace_back()是c++11新引入的方法. emplace()也是在iter处插入元素,其他元素后移. insert和emplace的区别在于: insert是插入一个 ...

  5. insert和insertSelective区别

    在数据库中给一些字段设置了默认值 调用mybatis逆向工程生成的insert方法保存时并没有给这些字段传值,insert的结果却是这些字段的值依旧为null 之后查看源码发现insert方法会给所有 ...

  6. python学习笔记:插入函数append,extend与insert的使用与区别

    python中的几个插入函数: append( )函数    函数功能:append( )函数是在列表末尾添加新的对象. 易错点:使用 append() 函数添加列表时,是添加列表的「引用地址」而不是 ...

  7. Oracle中selec ... into ... from 和 insert into ... select...from区别

    1.语句形式为: Insert into Table2(field1,field2,...) select value1,value2,... from Table1  2.注意地方: (1)要求目标 ...

  8. mybatis自动生成代码只有insert()和insertSelective()

    在jdbc url后增加nullCatalogMeansCurrent=true即可(但此时不会生成withBLOBs类) 案例 jdbc:mysql://127.0.0.1:3306/dianpin ...

  9. Mybatis JPA-集成方案+代码解析

    为什么80%的码农都做不了架构师?>>>    源码地址(git):https://github.com/LittleNewbie/mybatis-jpa 一.Mybatis简介 m ...

最新文章

  1. Android之EventBus使用详解
  2. 设计,成本与开发细节的讨论
  3. .net Framework各个版本之间的发展
  4. Ubuntu下 VirtualBox的卸载和升级 (转载)
  5. 正则表达式批量替换 单引号
  6. 一种调用dll的巧妙方法
  7. 利用docker-machine安装swarm
  8. 程序员面试金典——2.3访问单个结点的删除
  9. mysql里的数据输入窗口是哪个_WINDOWS下使用Mysql 中碰到的问题记录
  10. StretchBlt()函数
  11. noteexpress选择网页作为题录的使用方法
  12. 网易云音乐软件没有视频的版本
  13. 怎么做到css和html分开,CSS结构与表现分离怎么实现?
  14. HI3515海思开发板移植3G模块笔记
  15. C# 修改图片文件分辨率大小
  16. openvz相关资料
  17. 嵌入式制造愿景:选择智能相机的好处
  18. 云桌面是什么意思?与堡垒机有什么区别?
  19. 《天空之音VR》即将发售,挥手击中音符就能秒变“节奏大师”
  20. sql报错:Error Code: 1292. Incorrect date value: ‘1978‘ for column ‘video_date‘ at row 1记录

热门文章

  1. Hive基本SQL操作
  2. 免费在线PDF工具,支持全平台!强烈建议收藏!
  3. 使用 FFmpeg 转换视频/音频格式 | 开源 免费 | 不用套壳软件
  4. 周志华教授力作,豆瓣10分好评,集成学习如何破解AI实践难题 | 赠书
  5. 联想笔记本不能开机进入BIOS设置怎么办?
  6. 06-void类型和never类型
  7. linux下查询主机名和主机ID
  8. 南方科技大学计算机系优秀毕业生,南科大2020届本科十佳毕业生评选结果揭晓...
  9. 为了疫情防控,发短信可查自己的行踪轨迹,是什么技术在帮忙?
  10. “0X00000000”指令引用的“0x00000000”内存,该内存不能为“read”或“written”