一、数据库级别
1.1 表设计
create_time
默认值添加CURRENT_TIMESTAMP
。
update_time
默认值添加CURRENT_TIMESTAMP
,更新打勾。
1.2 验证是否成功
-- 插入
INSERT INTO `xiaoqiangzai`.`user_info` (`nickname`) VALUES ('小强');
-- 更新
UPDATE `xiaoqiangzai`.`user_info` SET `nickname` = '辣鸡' where id = 15
二、代码填充级别
2.1 实体类加上注解
// 插入时填充
@TableField(fill = FieldFill.INSERT)
// 插入和更新时填充
@TableField(fill = FieldFill.INSERT_UPDATE)
package com.qiang.mybaties.plus.test.mysql.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author 小强崽
* @create: 2020-12-24 16:04:44
* @description: 实体类
*/
@Data
public class FileInfo extends Model<FileInfo> {
/**
* 主键
*/
private Integer id;
/**
* 用户ID
*/
private Integer userId;
/**
* 文件名
*/
private String name;
/**
* 文件位置
*/
private String location;
/**
* 文件大小
*/
private Integer sizes;
/**
* 文件类型
*/
private String type;
/**
* 文件描述
*/
private String description;
/**
* 文件属性: 0只读1读写
*/
private Integer property;
/**
* 状态: 0关闭1启用
*/
private Integer status;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 获取主键值
*
* @return 主键值
*/
@Override
protected Serializable pkVal() {
return this.id;
}
}
2.2 自动填充配置类
package com.qiang.mybaties.plus.test.mysql.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* @author: 小强崽
* @create: 2020/12/24 16:08
* @description: 自动填充字段
**/
@Component
public class AutoFillConfig implements MetaObjectHandler {
private static final Logger logger = LoggerFactory.getLogger(AutoFillConfig.class);
@Override
public void insertFill(MetaObject metaObject) {
logger.info("插入数据填充字段createTime和updateTime!");
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
logger.info("更新数据填充字段updateTime!");
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
2.3 验证是否成功
2.3.1 插入数据
@Test
public void testInsert() {
FileInfo fileInfo = new FileInfo();
fileInfo.setUserId(1);
fileInfo.setName("Spring");
boolean save = fileInfoService.save(fileInfo);
logger.info(String.valueOf(save));
}
填充成功
2.3.2 更新数据
Lambda 表达式执行后使用 update 方法进行部分字段更新时,并没有实体作为参数,都会引起无法触发自动填充。
失效
@Test
public void testUpdate1() {
// 自动填充失效,因为Lambda没有实体作为参数,无法触发填充。
LambdaUpdateWrapper<FileInfo> lambdaUpdateWrapper = new LambdaUpdateWrapper<FileInfo>()
.eq(FileInfo::getId, 25)
.set(FileInfo::getName, "Boot");
boolean update = fileInfoService.update(lambdaUpdateWrapper);
logger.info(String.valueOf(update));
}
填充失败
生效
@Test
public void testUpdate2() {
// 自动填充生效,因为使用了实体作为参数,触发填充。
UpdateWrapper<FileInfo> fileInfoUpdateWrapper = new UpdateWrapper<>();
fileInfoUpdateWrapper.eq("id", 25);
FileInfo fileInfo = new FileInfo();
fileInfo.setName("Boot");
boolean update = fileInfoService.update(fileInfo, fileInfoUpdateWrapper);
logger.info(String.valueOf(update));
}
填充成功