MySQL自动填充

一、数据库级别

1.1 表设计

create_time默认值添加CURRENT_TIMESTAMP

update_time默认值添加CURRENT_TIMESTAMP,更新打勾。

image-20201225011112005

1.2 验证是否成功

-- 插入
INSERT INTO `xiaoqiangzai`.`user_info` (`nickname`) VALUES ('小强');
-- 更新
UPDATE `xiaoqiangzai`.`user_info` SET `nickname` = '辣鸡' where id = 15

image-20201225011321977

二、代码填充级别

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));
}

填充成功

image-20201225002802324

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));
}

填充失败

image-20201225011753081

生效

@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));
}

填充成功

image-20201225005753721

作者(Author):小强崽
来源(Source):https://www.wuduoqiang.com/archives/MySQL自动填充
协议(License):署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
版权(Copyright):商业转载请联系作者获得授权,非商业转载请注明出处。 For commercial use, please contact the author for authorization. For non-commercial use, please indicate the source.

posted @ 2021-03-12 21:59  小强崽  阅读(471)  评论(0编辑  收藏  举报