本文为Mybatis Plus系列文章的第9篇,前8篇访问地址如下:

  • 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查
  • 小书MybatisPlus第2篇-条件构造器的应用及总结
  • 小书MybatisPlus第3篇-自定义SQL
  • 小书MybatisPlus第4篇-表格分页与下拉分页查询
  • 小书MybatisPlus第5篇-Active Record模式精讲
  • 小书MybatisPlus第6篇-主键生成策略精讲
  • 小书MybatisPlus第7篇-代码生成器的原理精讲及使用方法
  • 小书MybatisPlus第8篇-逻辑删除实现及API细节精讲

一、填充字段处理

需求案例:在插入数据的时候自动填充createTime和updateTime为当前插入数据的时间,在数据更新的时候修改updateTime为修改数据的时间。不需要人为的手动赋值。

  • 在数据库表层面需要先添加2个日期类型的字段create_tme和update_time

  • 使用@TableField注解标记实体类中的哪些字段需要填充:
@Data
public class User {private Long id;private String name;private Integer age;private String email;@TableField(fill = FieldFill.INSERT)private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime;
}

FieldFill是一个枚举,用于指定在何种情况下会自动填充,有如下几种可选值:

  • DEFAULT:默认不处理
  • INSERT:插入时自动填充字段
  • UPDATE:更新时自动填充字段
  • INSERT_UPDATE:插入和更新时自动填充字段

二、自定义填充默认数值

编写公共字段填充处理器类,该类继承了MetaObjectHandler类,重写 insertFill和updateFill方法,我们在这两个方法中获取需要填充的字段以及默认填充的值。

  • 填充处理器MyMetaObjectHandler在Spring Boot中需要声明@Component或@Bean注入
  • strictInsertFill和strictUpdateFill方法第二个参数写的是实体类里的属性名,不是对应数据库字段名。
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", Date.class, new Date());this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());}
}

如果是3.3.0后面的版本,比如3.3.1.8,也可以改用下面更简单的写法(3.3.0不要用该方法,有bug)

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.fillStrategy(metaObject, "createTime", new Date());this.fillStrategy(metaObject, "updateTime", new Date());}@Overridepublic void updateFill(MetaObject metaObject) {this.fillStrategy(metaObject, "updateTime", new Date());}
}

在一些比较旧的版本,为填充字段设置值的API如下,3.3.0之后已经不建议使用

this.setFieldValByName("createTime",new Date(),metaObject);this.setFieldValByName("updateTime",new Date(),metaObject);

三、开始测试

  • 插入一条数据,注意我们没有为createTime和updateTime赋值
@Test
public void testInsert() {User user = new User();user.setName("字母哥");user.setAge(18);userMapper.insert(user);
}

但是运行的结果是:createTime和updateTime被自动赋值

  • 根据Id更新一条数据,注意我们没有为updateTime赋值
@Test
public void testUpdate() {User user = new User();user.setId(1287387821681790977L);user.setName("字母哥&curry");user.setAge(18);userMapper.updateById(user);
}

但是运行的结果是:updateTime在执行数据记录修改操作时被自动赋值

小书MybatisPlus第9篇-常用字段默认值自动填充相关推荐

  1. 设置字段默认值Java_小书MybatisPlus第9篇-常用字段默认值自动填充

    本文为Mybatis Plus系列文章的第9篇,前8篇访问地址如下: 一.填充字段处理 需求案例:在插入数据的时候自动填充createTime和updateTime为当前插入数据的时间,在数据更新的时 ...

  2. 关于MySQL中date字段默认值为“0000-00-00 00:00:00“导致MyBatisPlus无法正常list()而报系统异常错误码500的问题

    今天在SpringBoot整合MyBatisPlus的时候,使用自动代码生成的功能,对User表生成了entity.mapper.service代码,之后编写测试类调用userService.list ...

  3. MySQL 字段默认值该如何设置

    MySQL 字段默认值该如何设置 前言: 在 MySQL 中,我们可以为表字段设置默认值,在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值.关于默认值,有些知识还是需要 ...

  4. SqlServer 增加字段,修改字段名,删除字段,修改字段默认值

    SqlServer 增加字段,修改字段名,删除字段,修改字段默认值 1:增加字段 语法:alter table 表名 add 新增字段名 字段类型 默认值- 2:修改字段名 语法:exec sp_re ...

  5. SQL Server2000导出数据时包含主键、字段默认值、描述等信息

    时经常用SQL Server2000自带的导出数据向导将数据从一台数据库服务器导出到另一台数据库服务器: 结果数据导出了,但表的主键.字段默认值.描述等信息却未能导出,一直没想出什么方法,今天又尝试了 ...

  6. mybatis-plus 初始化项目 主键自增策略 自动填充 逻辑删除 乐观锁 复杂查询 分页查询

    一创建数据库(添加数据) 二 创建springboot工程 导入工程所需要的依赖(mybatis-plus,mysql-connector-java,lombok) <dependency> ...

  7. mysql字段默认值不生效的问题解决(上)

    mysql字段默认值不生效的问题解决(上) 参考文章: (1)mysql字段默认值不生效的问题解决(上) (2)https://www.cnblogs.com/yuhuameng/p/10703931 ...

  8. mysql创建表的时候日期给个默认值_mysql 创建表时 日期字段默认值为当前时间...

    mysql 创建表时 日期字段默认值为当前时间 mysql version 5.1 在mysql创建表的时候经常会遇到创建日期字段需要设置当前时间为默认值的时候,就如sqlserver2000一样,把 ...

  9. Mysql 修改字段默认值问题

    临下班前,测试测出所有的返回报文中有一个版本号的值没有上送,最后定位是由于数据库配置表里版本号是空. 这应该属于前辈们留下的bug了.... 首先试了下 ALTER TABLE newftp alte ...

  10. EAS BOS 单据打开新增界面设置字段默认值

    EAS BOS 单据打开新增界面设置字段默认值 1.通常情况下,新增一张单据的时候,表体的一些字段值是需要自动带出来. 2.例如上图圈中的部分,业务日期.单据状态.公司.创建者.创建时间:以及默认添加 ...

最新文章

  1. 机器学习视频第二章2
  2. 【转载】谈谈我对Java中CallBack的理解
  3. 从这个11.11开始,终结数据结构与算法的噩梦
  4. 物联网推动时代进步 中小玩家如何傍上运营商这棵大树
  5. 2021-07-01 和的平方与平方的和
  6. Java设计模式之双向责任链COR模式
  7. LINUX警告:检测到时钟错误。您的创建可能是不完整的。-转
  8. js排序的时间复杂度_js 排序算法之快速排序
  9. H3C交换机常用配置命令大全
  10. 错误: 找不到符号 符号: 类 ActivityMainBindingImpl
  11. 特殊用途的句子 - 虚拟
  12. java sqlite sqlite_busy_SQLite 关闭时SQLITE_BUSY
  13. web常见特效——floor电梯导航
  14. 在Linux上配置DRBD部署
  15. 达梦数据库喜中国家电网公司信息化软件框架采购竞争性谈判项目
  16. 微信JS接口开发指南
  17. 从截图中提取文字的在线工具
  18. 警惕企业发展过程中的灰犀牛
  19. html语言字体上下滚动代码,div+css+jquery公告栏垂直(上下)文字单行滚动特效代码(三种样式)...
  20. Scrapy使用——抓取赶集网北京公交信息

热门文章

  1. Nerv-京东高性能前端框架
  2. 康宁发布第五代大猩猩玻璃 坚韧度更强更耐摔
  3. 智能暖风机——3.利用B3950实现温度采集功能
  4. Unity3D高级编程之进阶主程-陆泽西 (Jesse Lu)
  5. 显示前半内容后半内容用省略号_省略号前后的标点用法
  6. 计算几何(中线长计算三角形面积) - Medians - UVA 10347
  7. 移动内部疯传的11篇VoLTE学习笔记,看懂了你也是技术大神(二)
  8. 史上最全的自动驾驶研究报告(下)
  9. 车联网白皮书 (网联自动驾驶分册)
  10. CPU32和CPU64区别