在mybatisplus中使用自动填充时间的方法:
package com.candy.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
//字段添加填充内容
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
package com.candy.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Date;
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//更新填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
测试语句:
@Test
public void tInsert(){
User user =new User();
user.setName("阿泽");
user.setAge(23);
user.setEmail("aichiniangaodeazhe@qq.com");
int re = userMapper.insert(user);
System.out.println(re);
System.out.println(user);
}
把官网的方法都用了一遍,不是存成null,就是有时差!!!
官网的方法:
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
// 或者
this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
// 或者
this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
// 或者
this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
// 或者
this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
}
}
测试之后的数据:
null原因:
实体类类型不一致!!!
之前create_time和update_time的类型是java.util.Date,如果想要用官网的LocalDateTime.now(),需要把类型改成java.time.LocalDateTime:
package com.candy.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
//字段添加填充内容
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
package com.candy.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Date;
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
// this.setFieldValByName("createTime",new Date(),metaObject);
// this.setFieldValByName("updateTime",new Date(),metaObject);
this.fillStrategy(metaObject, "createTime", LocalDateTime.now());
this.fillStrategy(metaObject, "updateTime", LocalDateTime.now());
}
//更新填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
// this.setFieldValByName("updateTime",new Date(),metaObject);
this.fillStrategy(metaObject, "updateTime", LocalDateTime.now());
}
}
测试:
@Test
public void tInsert(){
User user =new User();
user.setName("啧啧");
user.setAge(9);
user.setEmail("zeze@qq.com");
int re = userMapper.insert(user);
System.out.println(re);
System.out.println(user);
}
成功!!!!😓
有时差的原因:
我突然就想起来了我的sql是8版本的,然后在数据库配置中有配置时区:
# 应用名称
spring.application.name=mybatisplus
# 应用服务 WEB 访问端口
server.port=8002
#数据库连接
spring.datasource.username=root
spring.datasource.password=root12345
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.driver-class-name= com.mysql.cj.jdbc.Driver
#配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
然后我就想是不是这个时区不对所以数据库中的数据有时差,然后我去搜了一下中国上海的时区:
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&useSSL=true&erverTimezone=Asia/Shanghai
改成了上海的,那我们浅浅系系吧:
先看一下控制台的日志:
再看看数据库中:
我真的会谢!!我真是个小机灵鬼呢!:happy: