在实际的开发中,由于一些数据,经常的去添加或者修改是比较麻烦的,而且这些数据还是一些不怎么重要的数据,例如,更新时间以及修改时间,那么可不可以通过一种方式,自动的添加以及修改这些数据呢,答案是可以的,mybatisplus提供了自动填充的功能,而这个功能正好可以自动的修改更新时间以及创建时间。
创建数据库
主要创建红线框中的字段
实体类创建
package com.example.mybatisdemo3.domain;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.example.mybatisdemo3.enums.GenderEnums;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @TableName student
*/
@EqualsAndHashCode(callSuper = true)
@TableName(value ="student")
@Data
public class Student extends Model<Student> implements Serializable {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
// 枚举类型
private GenderEnums gender;
// 该注解表示 在创建数据的时候 自动添加时间
@TableField(fill = FieldFill.INSERT)
private Date createTime;
// 该注解表示 在创建数据或者修改数据的时候 自动添加时间以及修改时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
注意:由于我设置了驼峰命名规则,所有可以在数据库中以下划线的形式的创建字段,而在实体类中没有以下划线的形式创建。
可以在全局配置中配置一条mybatisplus的驼峰命名规则,true表示开启,false表示关闭。
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
在设置自动填充时间的时候,还必须设置一个时间自动添加以及更新的处理器类
package com.example.mybatisdemo3.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* @BelongsProject: mybatisplusdemo
* @BelongsPackage: com.example.mybatisdemo3.handler
* @Author: 云边小屋(My.Tears)
* @CreateTime: 2023-06-20 00:12
*/
/**
* 时间自动填充更新处理类
*/
@Component
public class AutoTimeHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
// 创建数据的时候 自动添加时间
setFieldValByName("createTime",new Date(),metaObject);
// 修改数据的时候 自动修改时间
setFieldValByName("updateTime",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
// 修改数据的时候 自动修改时间
setFieldValByName("updateTime",new Date(),metaObject);
}
}
测试数据
package com.example.mybatisdemo3;
import com.example.mybatisdemo3.domain.Student;
import com.example.mybatisdemo3.enums.GenderEnums;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @BelongsProject: mybatisplusdemo
* @BelongsPackage: com.example.mybatisdemo3
* @Author: 云边小屋(My.Tears)
* @CreateTime: 2023-06-20 00:17
*/
@SpringBootTest
public class AutoTimeTest {
@Test
void autoTime(){
/**
* 未设置具体的创建时间
* 但是
* ==> Preparing: INSERT INTO student ( name, age, gender, create_time, update_time ) VALUES ( ?, ?, ?, ?, ? )
* ==> Parameters: 自动添加时间(String), 20(Integer), 0(Integer), 2023-06-20 00:19:01.993(Timestamp), 2023-06-20 00:19:01.993(Timestamp)
* <== Updates: 1
* 底层SQL自动得帮我添加了
*/
Student student = new Student();
student.setAge(20);
student.setName("自动添加时间");
student.setGender(GenderEnums.MAN);
student.insert();
}
}
测试结果
数据库是否发生改变
我们可以看到数据发生了改变
再来测试一下,修改操作
@Test
void autoTime2(){
/**
* ==> Preparing: UPDATE student SET name=?, update_time=? WHERE id=?
* ==> Parameters: 我是修改后的自动添加时间(String), 2023-06-20 00:25:17.203(Timestamp), 8(Long)
* <== Updates: 1
* 成功修改
*/
Student student = new Student();
student.setId(8L);
student.setName("我是修改后的自动添加时间");
student.updateById();
}
测试结果
在以上代码中,我并未设置具体的修改时间,而这个修改的时间自动的修改了,说明成功了
再来看看数据库是否发生改变
数据库也确实发生了改变。
由此,我们可以通过这个mybatisplus的自动填充来完成一些比较繁琐的数据更新以及数据创建的时间的问题。
自动填充的功能有助于我们提高开发效率、减少出错效率,并且可以保证数据的一致性。