Mybatis-plus 自动填充功能 自动填充数据为null或者有时差 原因及解决方案

Mybatis-plus 自动填充功能 自动填充数据为null或者有时差 原因及解决方案,第1张

在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("[email protected]");
  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("[email protected]");
  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:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/726344.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存