配置公共字段全局填充createTime和updateTime

  • 一、创建公共表字段
    • 1、 公共字段实体类
    • 2、User实体类,继承公共实体类
  • 二、未全局配置时操作接口测试
    • 1、新增用户信息接口
    • 2、启动项目新增一条用户数据
  • 三、全局配置公共字段填充
    • 1、在common模块创建config和handler
    • 2、handler中创建MetaHandler类实现MetaObjectHandler
    • 3、config中创建MybatisPlusConfig类
  • 四、全局配置后操作接口测试
    • 1、重启项目进行新增数据测试
我们的数据库表中一般都会有几个公共字段,这些字段的值不需要手动设置,全局配置后,就会自动填充公共字段值。

一、创建公共表字段

  • 每个数据库表中公共字段一般包括主键id、创建时间createTime、更新时间updateTime、逻辑删除字段isDelete等。
  • 创建mysql数据库中的用户表字段如下

1、 公共字段实体类

/*** 实体父类** @author wangjiao* @since 2020/11/13*/
@Data
@SuperBuilder
@ApiModel("BaseEntity")
@AllArgsConstructor
@NoArgsConstructor
public abstract class BaseEntity implements Serializable {@ApiModelProperty(value = "主键ID,这里使用自增ID")@TableId(value = "id", type = IdType.AUTO)private Long id;@ApiModelProperty(value = "创建时间")@TableField(value = "create_time", fill = FieldFill.INSERT)private Date createTime;@ApiModelProperty(value = "更新时间")@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)private Date updateTime;@ApiModelProperty(value = "逻辑未删除:0,逻辑已删除:1")private Boolean isDelete;
}
  • 注解@TableId(value = “id”, type = IdType.AUTO) 的type = IdType.AUTO,表示主键id字段自增;
  • @TableField(value = “create_time”, fill = FieldFill.INSERT)的fill = FieldFill.INSERT,表示在新增数据时自动填充日期,需要去全局配置后该注解才生效;
  • @TableField(value = “update_time”, fill = FieldFill.INSERT_UPDATE)的 fill = FieldFill.INSERT_UPDATE,表示在新增或修改数据时自动填充日期,需要去全局配置后该注解才生效。
  • isDelete:逻辑删除字段数据库默认false,需要在yml文件中配置才生效,逻辑删除配置如下

2、User实体类,继承公共实体类

  • UserPoJo是与service层相互关联的,数据库字段以下划线分隔,实体字段以小驼峰形式命名,如:create_time对应实体createTime;
  • service接口:public interface UserService extends BaseService {},进行数据操作时,sql字段与实体会自动进行转换。
  • 当数据库表名称与实体名称不一致时,需要在实体类上注明表名称:@TableName(value = “tb_user”),这样数据库表字段才能正确映射到对应的实体字段。
  • 为了使我们的程序更具高内聚低耦合,各个模块做好各自的事情,我们将实体分为pojo(与数据库进行交互service层),request(客户端请求入参交互controller层),response(服务端对数据进行处理后返回给客户端的数据信息)
  • UserPoJo实体代码清单
/*** 用户信息** @author WangJiao* @since 2019-12-19*/
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("用户表")
@TableName(value = "tb_user")
public class UserPoJo extends BaseEntity {@ApiModelProperty(value = "电话", example = "156****12")private String tel;@ApiModelProperty(value = "密码", example = "******")private String password;@ApiModelProperty(value = "用户头像", example = "http://test.jpg")private String avatar;@ApiModelProperty(value = "姓名", example = "周深")private String name;@ApiModelProperty(value = "账号状态1:正常,2:停用", example = "1")private Integer status;@ApiModelProperty(value = "openId", example = "34655*********6774df")private String openId;public static UserPoJo of() {return new UserPoJo();}public static UserPoJo of(UserReq req) {UserPoJo poJo = UserPoJo.of();
// bean工具类,将一个实体对象属性赋值给另一个实体对象,这两个实体中的属性字段名称和字段类型必须保持一致,否则将拷贝不成功BeanUtils.copyProperties(req, poJo);return poJo;}
}
  • UserReq实体,一般会对入参进行简单的校验;
/*** 用户信息请求** @author WangJiao* @since 2019-12-19*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("用户信息请求")
public class UserReq implements Serializable {private static final long serialVersionUID = 1L;@NotBlank(message = "电话不能为空")@ApiModelProperty(value = "电话", example = "156****12")private String tel;@NotBlank(message = "密码不能为空")@ApiModelProperty(value = "密码", example = "*****")private String password;@NotBlank(message = "确认密码不能为空")@ApiModelProperty(value = "确认密码", example = "*****")private String rePassword;@ApiModelProperty(value = "用户头像", example = "http://test.jpg")private String avatar;@NotBlank(message = "用户名不能为空")@ApiModelProperty(value = "姓名", example = "周深")private String name;public static UserReq of() {return new UserReq();}
}
  • UserResponse 返回给客户端需要的信息,一般不包含敏感信息
/*** 用户信息Response** @author WangJiao* @since 2019-12-19*/
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("用户信息Response")
public class UserResponse extends BaseEntityResponse {@ApiModelProperty(value = "电话", example = "156****12")private String tel;@ApiModelProperty(value = "用户头像", example = "http://test.jpg")private String avatar;@ApiModelProperty(value = "姓名", example = "周深")private String name;@ApiModelProperty(value = "账号状态1:正常,2:停用", example = "1")private Integer status;public static UserResponse of() {return new UserResponse();}public static UserResponse of(UserPoJo poJo) {UserResponse response = UserResponse.of();
// bean工具类,将一个实体对象属性赋值给另一个实体对象,这两个实体中的属性字段名称和字段类型必须保持一致,否则将拷贝不成功BeanUtils.copyProperties(poJo, response);return response;}
}

二、未全局配置时操作接口测试

  • 编写一个新增用户数据接口

1、新增用户信息接口

  • 新增用户信息接口代码清单如下
  • 此时在写入或更新数据时未全局配置创建时间和更新时间,也没有手动设置者两个字段的值,所以数据库表中的create_time和update_time字段的值是空值。
  • UserController代码清单
/*** 用户注册** @param req 注册信息* @return obj*/
@PostMapping("/register")
@ApiOperation("注册")
public ApiResult register(@Valid @RequestBody UserReq req) {log.info("register:user register info[req:{}]", JSON.toJSONString(req));// 新增用户条件密码校验判断if (!Objects.equals(req.getPassword(), req.getRePassword())) {return ApiResult.fail(ApiCode.USER_TWO_PASSWORDS_INCONSISTENT);}// 手机号作为账号唯一性校验UserPoJo findUser = service.getByTel(req.getTel());if (Objects.nonNull(findUser)) {return ApiResult.fail(ApiCode.USER_ACCOUNT_REGISTERED);}// 密码进行md5加密req.setPassword(DigestUtils.md5DigestAsHex(req.getPassword().getBytes()));boolean res = service.saveUser(UserPoJo.of(req));log.info("register:[res:{}]", res);return ApiResult.ok(res);
}
  • UserService 保存用户信息接口
/*** save userInfo** @param of user* @return true*/
boolean saveUser(UserPoJo of);
  • UserServiceImpl 保存用户信息接口实现
@Transactional(rollbackFor = Exception.class)
@Override
public boolean saveUser(UserPoJo of) {boolean save = this.save(of);log.info("saveUser:[save:{}]", save);return save;
}

2、启动项目新增一条用户数据

  • 向数据库用户表中插入一条数据
  • 数据库中create_time和update_time字段是的值没有自动填充

三、全局配置公共字段填充

1、在common模块创建config和handler

2、handler中创建MetaHandler类实现MetaObjectHandler

  • 用于处理全局填充公共字段,代码清单如下。
package yooo.yun.com.common.handler;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;/*** 处理新增和更新的基础数据填充,配合BaseEntity和MyBatisPlusConfig使用** @author wangjiao* @since 2020/1217*/
@Component
public class MetaHandler implements MetaObjectHandler {/*** 新增数据执行** @param metaObject metaObject*/@Overridepublic void insertFill(MetaObject metaObject) {this.setFieldValByName("createTime", new Date(), metaObject);this.setFieldValByName("updateTime", new Date(), metaObject);}/*** 更新数据执行** @param metaObject metaObject*/@Overridepublic void updateFill(MetaObject metaObject) {this.setFieldValByName("updateTime", new Date(), metaObject);}public static MetaHandler of() {return new MetaHandler();}
}

3、config中创建MybatisPlusConfig类

package yooo.yun.com.common.config;import com.baomidou.mybatisplus.core.config.GlobalConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import yooo.yun.com.common.handler.MetaHandler;/*** MybatisPlus配置** @author wangjiao* @since 2020/12/17*/
@Configuration
public class MybatisPlusConfig {/*** 自动填充功能** @return GlobalConfig*/@Beanpublic GlobalConfig globalConfig() {GlobalConfig globalConfig = new GlobalConfig();globalConfig.setMetaObjectHandler(MetaHandler.of());return globalConfig;}
}
  • GlobalConfig中的metaObjectHandler,
  • 类型:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
  • 默认值:null元对象字段填充控制器(starter 下支持@bean注入)
  • GlobalConfig其他属性值使用详解请查看链接:https://www.bookstack.cn/read/mybatis-plus-3.x/spilt.4.09e8fb6c9a564182.md

四、全局配置后操作接口测试

1、重启项目进行新增数据测试

  • 数据库新增的数据创建时间和更新时间字段的值已经自动填充上了

    -:来到这里,相信你已经get到了喔!!!

配置公共字段全局填充createTime和updateTime相关推荐

  1. 数据库公共字段自动填充

    引言 很多项目的数据库表都会设置create_time.update_time等公共字段,这些公共字段都是在数据库创建或更新时需要设置值:如果自己设置还需要额外写set代码,一旦这样的表多了之后就很麻 ...

  2. SpringBoot公共字段自动填充

    大家好,我是小羽,今天做项目的时候遇到一个问题,每次添加数据时都要设置创建时间,创建人,修改时间,修改人等字段,实在是太繁琐了.那我能不能让他们添加这些字段的信息呢? 问题分析 创建时间,创建人,修改 ...

  3. Java开发 - 公共字段的自动填充

    前言 如果说Java开发中有什么是让人很烦的一件事,那一定是无尽的填充字段,本篇作为观众瑰宝系列第二篇,将带来公共字段填充相关的知识点,学完此篇,让你摆脱公共字段填充带来的麻烦,节省代码,降低冗余,妥 ...

  4. MyBatisPlus-9-公共字段自动填充

    公共字段自动填充 1.1 元数据处理器接口 com.baomidou.mybatisplus.mapper.MetaObjectHandlerinsertFill(MetaObject metaObj ...

  5. R语言ggplot2可视化条形图(bar plot)、配置因子变量的全局填充色方案、这样不同数据集相同因子的填充色具有一致性(Fix colors to factor levels)

    R语言ggplot2可视化条形图(bar plot).配置因子变量的全局填充色方案.这样不同数据集相同因子的填充色具有一致性(Fix colors to factor levels) 目录

  6. MySQL实现字段自动填充功能

    根据阿里巴巴开发手册,有这么一句话:所有的数据库表当中必须有gmt_create.gmt_modified,几乎所有的表都要配置上!而且需要自动化!!! 对于创建时间.修改时间这些字段,我们是希望在添 ...

  7. MyBatisPlus中使用 @TableField完成字段自动填充

    场景 官方文档: 字段注解 @TableField com.baomidou.mybatisplus.annotations.TableField 值 描述 value 字段值(驼峰命名方式,该值可无 ...

  8. axios 最全 请求拦截器 响应拦截器 配置公共请求头 超时时间 以及get delete post put 四种请求传参方式

    axios 拦截器 请求拦截器 请求拦截器的作用是在请求发送前进行一些操作 例如在每个请求体里加上token,统一做了处理如果以后要改也非常容易 响应拦截器 响应拦截器的作用是在接收到响应后进行一些操 ...

  9. 【MyBatis-Plus】实现字段自动填充功能

    一.前言 在项目中,我们有一些公共的字段需要做修改 如: gmt_create:创建时间 creator_id:创建人 gmt_modified:修改时间 modifier_id:修改人 这时候我们可 ...

最新文章

  1. BizTalk 2006 简单入门示例程序(附源项目文件下载)
  2. 青光眼-复内路粘小管成形术(ABiC)-转载
  3. 在linux中加固mysql_mysql在linux下的安装
  4. Oracle 数据库-分组函数总结
  5. mysql数据库基础 博客园_MySQL数据库基础
  6. python增量更新数据_Python标准库——加密
  7. JavaScript高级语法打包 - babel插件安装配置报错!Error: Cannot find module ‘@babel/preset-preset.env‘
  8. 升级Struts2.5后使用DMI动态方法调用遇到问题
  9. 如何设置VSCode以提高生产力
  10. python的os库_os库(python)—总结
  11. The Normal Distributions Transform: A New Approach to Laser Scan Matching
  12. C#自定义RSA加密解密及RSA签名和验证封装类
  13. STM32编译生成的BIN文件详解
  14. android 获取路由器mac,android设备获取当前wifi下的路由器的mac和路由器的名称
  15. Android学习笔记3-开发过程中一些常用操作
  16. 计算机网络常见面试题目
  17. 人民币和美元兑换的编程python_python人民币和美元转换
  18. IObit Driver Booster 无法更新驱动的解决办法
  19. 计算机网络漫谈:OSI七层模型与TCP/IP四层(参考)模型(转载)
  20. 计算机视觉—期刊|会议名称以及出版社对应大全

热门文章

  1. js设置button和input不可点击
  2. Error: Assignments can only be reset if the group ‘group‘ is inactive, but the current state is Stab
  3. Environment.SpecialFolder的值的含义(本地打印)
  4. 生活随记-安心照顾母亲
  5. ERROR: cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdistro/ma
  6. 查询2021年天柱二中高考成绩喜报,凯里一中2013年高考喜报教学内容(11页)-原创力文档...
  7. 谷歌邮箱无法与服务器建立连接失败,GMAIL SMTP错误:无法连接到服务器
  8. 小波学习笔记——模极大值去噪
  9. oracle数据库block、tigger、function、package
  10. java随笔三,真正的class大总结