mysql 创建 update_time字段的时候, update_time not null Default CURRENT_TIMESTAMP ON UPDAET CURRENT_TIMESTA

mysql 创建 update_time字段的时候, update_time not null Default CURRENT_TIMESTAMP ON UPDAET CURRENT_TIMESTAMP 当我更新数据的时候,是否就是使用的mysql 数据库的时间

是的,当你在 MySQL 中创建一个 update_time 字段并使用 ON UPDATE CURRENT_TIMESTAMP 时,MySQL 会自动使用数据库服务器的当前时间来更新这个字段。具体来说,当你更新一条记录时,update_time 字段会自动被设置为执行更新操作时数据库服务器的时间。

以下是创建表时的一个示例:

CREATE TABLE your_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    data VARCHAR(255),
    update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

在这个示例中,update_time 字段具有以下行为:

  • 默认值:当插入一条新记录时,update_time 字段会被自动设置为插入操作执行时的数据库服务器的当前时间。
  • 更新值:当更新一条记录时,update_time 字段会被自动更新为更新操作执行时的数据库服务器的当前时间。

示例操作

  1. 插入新记录

    sqlINSERT INTO your_table (data) VALUES ('example data'); 

    插入后,update_time 字段会被设置为插入操作执行时的数据库服务器时间。

  2. 更新记录

    sqlUPDATE your_table SET data = 'new data' WHERE id = 1; 

    更新后,update_time 字段会被自动更新为更新操作执行时的数据库服务器时间。

检查服务器时间

如果你想查看数据库服务器的当前时间,可以使用以下查询:

sqlSELECT NOW(); 

这将返回数据库服务器的当前时间,这也是 update_time 字段在执行插入和更新操作时使用的时间。

注意事项

  1. 时区:数据库服务器的时间是基于其时区设置的。如果你的应用程序运行在不同的时区,可能需要考虑时区转换。
  2. 精度TIMESTAMP 类型的精度通常是秒。如果需要更高的精度,可以使用 DATETIMETIMESTAMP 类型并指定毫秒精度(在 MySQL 5.6.4 及以上版本支持)。

通过这种方式设置 update_time 字段,可以确保所有时间戳都由数据库自动管理,避免手动设置时间戳可能带来的错误和不一致。

mybatis plus 中的一个 注解 @TableField(fill = FieldFill.INSERT_UPDATE),是什么意思,

在 MyBatis-Plus 中,注解 @TableField(fill = FieldFill.INSERT_UPDATE) 用于指定字段在插入和更新操作时的自动填充策略。这个注解用于实体类的字段上,以便在执行插入或更新操作时,MyBatis-Plus 可以自动为该字段赋值。

@TableField 注解

@TableField 是 MyBatis-Plus 提供的注解,用于标记实体类的字段与数据库表字段的对应关系及相关操作。

FieldFill 枚举

FieldFill 是 MyBatis-Plus 中的一个枚举类型,用于指定字段的自动填充策略。它有以下几个常量:

  • DEFAULT:默认不进行填充。
  • INSERT:在插入操作时进行填充。
  • UPDATE:在更新操作时进行填充。
  • INSERT_UPDATE:在插入和更新操作时进行填充。

示例

假设你有一个实体类 User,其中有一个字段 updateTime,你希望这个字段在插入和更新记录时自动填充为当前时间。你可以这样定义这个实体类:

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;

import java.time.LocalDateTime;

public class User {
    @TableId(type = IdType.AUTO)
    private Long id;

    private String name;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    // Getters and setters
}

自动填充处理器

为了使 updateTime 字段在插入和更新时自动填充,你需要定义一个自动填充处理器类,实现 MetaObjectHandler 接口,并在该类中实现自动填充的逻辑。例如:

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

import java.time.LocalDateTime;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
    }
}

总结

@TableField(fill = FieldFill.INSERT_UPDATE) 注解的作用是指定实体类的字段在插入和更新操作时进行自动填充。结合实现 MetaObjectHandler 接口的处理器类,可以实现自动为字段赋值的功能,从而简化代码和避免手动设置这些字段值的繁琐工作。

我从数据库中查询出来一条数据,MyMetaObjectHandler 中的getFieldValByName 返回的是什么数据

在 MyBatis-Plus 中,MetaObjectHandler 接口用于自动填充字段值。当插入或更新操作执行时,MyBatis-Plus 会调用 MetaObjectHandlerinsertFillupdateFill 方法,您可以在这些方法中使用 MetaObject 对象来获取和设置字段值。

getFieldValByName 方法

getFieldValByName 方法用于从 MetaObject 中获取指定字段的值。它接受字段的名称作为参数,并返回该字段当前的值。

方法签名
javaObject getFieldValByName(String fieldName, MetaObject metaObject); 
  • fieldName:要获取值的字段名称。
  • metaObject:包含字段的 MetaObject 实例。
返回值

getFieldValByName 方法返回指定字段的当前值。如果字段不存在或没有设置值,返回值可能为 null

示例代码

以下是一个简单的示例,展示如何在 MetaObjectHandlerupdateFill 方法中使用 getFieldValByName 方法:

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

import java.time.LocalDateTime;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        // 插入时自动填充创建时间和更新时间
        this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        // 获取当前更新时间字段的值
        Object updateTime = getFieldValByName("updateTime", metaObject);
        System.out.println("Current updateTime: " + updateTime);

        // 更新时自动填充更新时间
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
    }
}

在上面的代码中:

  • updateFill 方法中,首先通过 getFieldValByName 方法获取 updateTime 字段的当前值,并输出该值。
  • 然后,通过 strictUpdateFill 方法将 updateTime 字段更新为当前时间。

实际应用

当从数据库中查询一条数据并进行更新操作时,MetaObjectHandler 中的 getFieldValByName 方法将返回数据库中该字段的当前值。例如,如果 updateTime 字段在数据库中的当前值是 2023-06-15T10:00:00,则 getFieldValByName("updateTime", metaObject) 将返回这个时间。

总结

  • getFieldValByName 方法用于从 MetaObject 中获取指定字段的当前值。
  • 该方法的返回值是字段的当前值,可能是从数据库中查询出的值。
  • 结合 MetaObjectHandler 的使用,可以在自动填充字段值时获取和使用这些值。

通过这种方式,可以在插入和更新操作时自动处理字段值,简化代码逻辑并确保数据的一致性和完整性。

  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值