一、使用数据库的自动更新机制
1.创建表时设置创建时间和更新时间的默认值
ALTER TABLE lspace_diga.hot_city
MODIFY COLUMN gmtCreate TIMESTAMP DEFAULT CURRENT_TIMESTAMP;ALTER TABLE lspace_diga.hot_city
MODIFY COLUMN gmtModified TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
2.更新时间
触发器:创建一个数据库触发器,当记录被更新时自动更新
gmtModified
字段。
CREATE TRIGGER before_update_hot_city
BEFORE UPDATE ON lspace_diga.hot_city
FOR EACH ROW
SET NEW.gmtModified = CURRENT_TIMESTAMP;
二、使用 MyBatis-Plus 提供的功能
1.注解实体类(使用 @TableField
的 fill
属性)
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;@Data
@TableName("lspace_diga.hot_city")
public class HotCity {@TableId(value = "id", type = IdType.AUTO)private Long id;private Long shopId;private Integer cityScore;private Integer hometownScore;private String name;private String code;@TableField(fill = FieldFill.INSERT)@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date gmtCreate;@TableField(fill = FieldFill.INSERT_UPDATE)@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date gmtModified;
}
2.编写 MetaObjectHandler(创建一个类实现 MetaObjectHandler
接口,用于自动填充字段)
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "gmtCreate", Date.class, new Date());this.strictInsertFill(metaObject, "gmtModified", Date.class, new Date());}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "gmtModified", Date.class, new Date());}
}
3.MyBatisPlus自动填充功能不生效的原因
3.1 没有正确配置MetaObjectHandler
- 实现类未被扫描到(使用 @Component 注解)
- 实体类和实现类字段对应
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "gmtCreate", Date.class, new Date());this.strictInsertFill(metaObject, "gmtModified", Date.class, new Date());}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "gmtModified", Date.class, new Date());}
}
3.2 注解配置不正确
@TableField(fill = FieldFill.INSERT)
private Date gmtCreate;@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;
3.3 MyBatis-Plus 版本问题
版本问题:确保你使用的 MyBatis-Plus 版本支持自动填充功能。较旧的版本可能不支持或者存在 Bug。建议使用最新的稳定版本。
3.4 插入或更新操作不使用 MyBatis-Plus 提供的方法
直接使用 MyBatis 操作:如果你直接通过 MyBatis (而非 MyBatis-Plus 提供的 Mapper 接口) 操作数据库,自动填充可能不会生效。确保使用 MyBatis-Plus 的 Mapper 方法,如 insert、updateById 等。
3.5 数据库字段名与实体字段名不匹配
@TableField(value = "gmt_create", fill = FieldFill.INSERT)
private Date gmtCreate;
三、手动设置时间戳
HotCity hotCity = new HotCity();
hotCity.setShopId(123L);
hotCity.setCityScore(10);
hotCity.setHometownScore(5);
hotCity.setName("Sample City");
hotCity.setCode("SC");// 手动设置创建和更新时间
Date now = new Date();
hotCity.setGmtCreate(now);
hotCity.setGmtModified(now);// 插入记录
hotCityMapper.insert(hotCity);// 更新记录时,手动更新修改时间
hotCity.setGmtModified(new Date());
hotCityMapper.updateById(hotCity);