MyBatis-plus自动填充功能之自动填充时间

2年前 (2022) 程序员胖胖胖虎阿
175 0 0

MyBatis-plus自动填充功能之自动填充时间

  • 一、前期工作
  • 二、自动填充
    • 2.1 数据库级别
    • 2.2 代码级别

在实际操作过程中,我们并不希望创建时间、修改时间这些来手动进行,而是希望通过自动化来完成,而mybatis-plus则也提供了自动填充功能来实现这一操作,接下来,就来了解一下mybatis-plusz的自动填充功能是如何进行操作的。

一、前期工作

准备工作完全可以参考上一篇笔记MyBatis-plus快速入门https://blog.csdn.net/junR_980218/article/details/124816265
参考mybatis-plus笔记一直到测试前面部分,然后开始参考下面的操作进行今天的内容部分。

二、自动填充

2.1 数据库级别

1、在数据库的user表中添加create_time、update_time字段
MyBatis-plus自动填充功能之自动填充时间
2、在实体类User中添加字段 并且天界set/get方法,有参构造方法等


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 java.util.Date;


public class User {

    @TableId(type = IdType.AUTO)
    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;


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    public User() {
    }

    public User(Long id, String name, Integer age, String email, Date createTime, Date updateTime) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.email = email;
        this.createTime = createTime;
        this.updateTime = updateTime;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                ", createTime=" + createTime +
                ", updateTime=" + updateTime +
                '}';
    }
}

3、测试

@Test
//测试更新
public void testUpdate(){
    User user1 = new User();
    user1.setId(81L);
    user1.setName("关注我的公众号:狂神说java");
    user1.setAge(3);
    user1.setEmail("18058429082qq.com");
    //updateById 参数是一个对象
    int i = userMapper.updateById(user1);
    System.out.println(user1);

}

MyBatis-plus自动填充功能之自动填充时间
测试结果
MyBatis-plus自动填充功能之自动填充时间
可以从控制台的日志中看到,根本没有对时间的这两个字段进行操作,但是数据库中的时间已经进行了修改,这就是数据库级别的自动填充
MyBatis-plus自动填充功能之自动填充时间
但是在我们日常的开发过程中,是不允许轻易修改数据库的,所以上面这种数据库级别的操作不实用,于是我们进行下一种代码级别的操作,来实现同样的时间填充功能。

2.2 代码级别

1、还原上面步骤对于数据库表结构的操作,只留下create_time/update_time这两个字段即可
MyBatis-plus自动填充功能之自动填充时间
2、在实体类User中,对相关字段添加填充内容

/**
 * 字段添加填充内容
 */
@TableField(fill= FieldFill.INSERT)
private Date createTime;
@TableField(fill=FieldFill.INSERT_UPDATE)
private Date updateTime;

3、编写处理器MyMetaObjectHandler来处理,对实体类字段上添加的操作
MyBatis-plus自动填充功能之自动填充时间


import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 这个注解 表示就是要把处理器 丢到IOC容器中  这一点千万不能忘记 !
 */
@Component
/**
 * @author ctgu
 * @date 2022/5/18 8:55
 */
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入时候的填充策略
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill");
        // setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
        //给createTime这个字段和updateTime这俩字段 来一个什么值呢 来一个自动插入时间 传一个数据 这个数据就是mataObject
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);



    }

    /**
     * 更新时候的填充策略
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill");
        this.setFieldValByName("updateTime",new Date(),metaObject);

    }
}

4、测试

先进行插入测试

//测试插入
@Test
public void testInsert(){
    User user = new User();
    user.setName("狂神说java");
    user.setAge(3);
    user.setEmail("18058429082qq.com");
    int insert = userMapper.insert(user);
    System.out.println(insert);
    System.out.println(user);
    //User{id=1526399165514063874, name='狂神说java', age=3, email='18058429082qq.com'}
    //没有插入id,但是却存在id  说明他帮我们自动生成了id
}

更新测试

 @Test
    //测试更新
    public void testUpdate(){
        User user1 = new User();
        user1.setId(1526399165514063878L);
        user1.setName("关注我的公众号:狂神说java");
        user1.setAge(3);
        user1.setEmail("18058429082qq.com");
        //updateById 参数是一个对象
        int i = userMapper.updateById(user1);
        System.out.println(user1);

    }

测试结果 插入的时候已经把时间插入进去了,更新时候也对时间进行了更新
MyBatis-plus自动填充功能之自动填充时间
至此,MyBatis-plus自动填充功能之自动填充时间操作全部完成。

版权声明:程序员胖胖胖虎阿 发表于 2022年9月22日 下午12:48。
转载请注明:MyBatis-plus自动填充功能之自动填充时间 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...