上一篇文章《Mybatis plus应用(二)实体类id实现雪花id》我们介绍了id相关的使用,这篇文章我们介绍下mybatis plus的自动填充功能。
在真实的业务中,我们对于每一张设计表都做硬性要求即必须要要有cts(创建时间)和uts(更新时间)这两个字段,并且这两个字段在新增或者更新的时候需要会做适时的变动用以回溯数据的改动。在小公司里面,由于开发人员的能力参吃不齐,所以我们为了避免给每个人都将或者开发人员在开发过程中给忘掉,所以我们再设计数据库的时候,在里面做了默认值和触发器,例如做cts的时候,自动设置。这时候行程的sql语句就是这样的:
`cts` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `uts` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
备注:
1、在小公司里面一般都是业务众多,对于招聘的开发人员来说大多都是能干活即可,很少有招高级或者资深的开发人员,在开发的过程中,很多规范等实施起来很费劲。
2、在小公司里面主要以干活为主,学习的时间有限,所以这也是很多开发人员能力提升不上的原因。
3、在小公司里面,有时候项目众多,都在赶工,所以在开发中有时候能省则省,慢慢的大家都养成了这种习惯,开发的时候很多东西缺乏考虑导致后续扩展较难。
4、所以这里不是歧视咱们开发人员,仅是个人在一些小公司待的时候遇到的情况。
在大厂里面,这种在数据设计的时候做这种操作就是不现实的,因为几点
1、尽量在业务中定义数据 2、timestamp只能维持到2038年。
所以在大厂,像这种必填的字段都是需要业务填充的,为了方便,一般我们会在代码里面做自动填充,这里的mybatis也提供自动填充的功能,下面我们介绍下如何操作。(备注:我们还是在原来的代码里面修改)
一、创建user表
CREATE TABLE `user` ( `id` bigint(20) NOT NULL COMMENT '主键id', `name` varchar(20) DEFAULT NULL COMMENT '姓名', `age` tinyint(1) DEFAULT NULL COMMENT '性别,1:男,2:女', `tel` varchar(11) DEFAULT NULL COMMENT '手机号码', `cts` datetime DEFAULT NULL COMMENT '创建时间', `uts` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
二、在user的实体中添加注解@TableField(fill = FieldFill.INSERT)和@TableField(fill = FieldFill.INSERT_UPDATE),完整的实体如下:
package com.mybatis.demo.model; import java.io.Serializable; import java.util.Date; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.ToString; import lombok.experimental.Builder; @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode @ToString @Builder public class User implements Serializable { /** * */ private static final long serialVersionUID = 4824273035410072985L; @TableId private Long id; private String name; private Integer age; private String tel; @TableField(fill = FieldFill.INSERT) private Date cts; @TableField(fill = FieldFill.INSERT_UPDATE) private Date uts; }
三、需要编写一个处理器来处理当前的自动填充时间
package com.mybatis.demo.handler; import java.util.Date; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; @Component public class DateHandler implements MetaObjectHandler { /** * 这里主要是插入的时候需要设置的默认值 */ @Override public void insertFill(MetaObject metaObject) { // 需要给哪个字段设置默认值就给哪个字段设置默认值即可。 this.setFieldValByName("cts", new Date(), metaObject); this.setFieldValByName("uts", new Date(), metaObject); } /** * 这里主要是更新的时候需要设置的默认值 */ @Override public void updateFill(MetaObject metaObject) { // 需要给哪个字段设置默认值就给哪个字段设置默认值即可。 this.setFieldValByName("uts", new Date(), metaObject); } }
备注:
1、这里我们写的handler不需要做配置,只需要保证能被spring扫描到即可,只要能扫描到,在执行的时候他就会去执行这个类。
四、controller方法新增一个更新,代码如下:
package com.mybatis.demo.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.mybatis.demo.dao.UserMapper; import com.mybatis.demo.model.User; @RestController public class HelloController { @Autowired UserMapper userMapper; @RequestMapping("/userAdd") String userAdd() { User user = User.builder().name("张三").age(15) .tel("13888888888") .build(); userMapper.insert(user); return "SUCCESS"; } @RequestMapping("/userUpdate") String userUpdate() { User user = User.builder().id(1L).name("张三").age(15) .tel("13888888888") .build(); userMapper.updateById(user); return "SUCCESS"; } }
五、测试下
可以看到在新增和更新的时候自动插入了cts和uts。
最后我们附上本案例的源码,登录后即可下载。
还没有评论,来说两句吧...