Mybatis-plus自动填充不生效或自动填充数据为null原因及解决方案

2023-12-07数据库
1092

下面将详细讲解"Mybatis-plus自动填充不生效或自动填充数据为null原因及解决方案"的攻略。

一、问题描述

当我们在使用Mybatis-plus的自动填充功能时,有时候会遇到自动填充不生效或自动填充数据为null的情况,这时候我们需要找到问题所在并进行解决。

二、原因分析

自动填充不生效或自动填充数据为null的原因通常有以下几种情况:

  1. 没有开启自动填充功能。 在Mybatis-plus中,自动填充功能需要在实体类中使用注解进行配置,如果没有进行配置则无法使用自动填充功能。

  2. 自动填充字段的属性值为null。 Mybatis-plus自动填充功能需要实体类的属性值,在sql执行前进行自动填充,如果属性值为null,则无法自动填充。

  3. 自动填充注解使用不正确。 Mybatis-plus提供了多个自动填充注解,注解使用不正确也会导致自动填充不生效或自动填充数据为null。

三、解决方案

针对上述问题所列出的原因,下面我们分别提供解决方案:

  1. 配置自动填充功能

在实体类中开启自动填充功能需要使用Mybatis-plus提供的注解。例如,我们可以在需要自动填充创建时间和更新时间的实体类中添加如下的注解:

@Data
public class User {
    @TableId
    private Long id;

    private String name;

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

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

其中,@TableField(fill = FieldFill.INSERT)表示在插入数据时自动填充createTime属性,@TableField(fill = FieldFill.INSERT_UPDATE)表示在插入和更新数据时自动填充updateTime属性。

  1. 验证自动填充字段的属性值

如果自动填充字段的属性值为null,则无法自动填充。因此,我们需要在插入或更新数据前,确保自动填充字段的属性值不为null。例如,我们可以在service层的insert方法中添加如下代码:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public boolean save(User entity) {
        entity.setCreateTime(LocalDateTime.now());
        entity.setUpdateTime(LocalDateTime.now());
        return super.save(entity);
    }
}
  1. 使用正确的自动填充注解

Mybatis-plus提供了多个自动填充注解,为了避免使用不正确的注解而导致自动填充不生效或自动填充数据为null,我们需要使用正确的注解。以下是常用的自动填充注解:

  • @TableField(fill = FieldFill.INSERT):插入数据时自动填充字段的值

  • @TableField(fill = FieldFill.UPDATE):更新数据时自动填充字段的值

  • @TableField(fill = FieldFill.INSERT_UPDATE):插入和更新数据时自动填充字段的值

四、示例说明

以下是针对自动填充不生效或自动填充数据为null的解决方案的两个示例说明:

示例1

在实体类中没有配置自动填充,导致自动填充不生效。这时候我们需要在实体类中添加相应的注解来开启自动填充功能。例如,如下User实体类中,我们需要添加createTime和updateTime属性的自动填充注解。

@Data
public class User {
    @TableId
    private Long id;

    private String name;

    private LocalDateTime createTime;

    private LocalDateTime updateTime;
}

添加自动填充注解后的实体类代码如下:

@Data
public class User {
    @TableId
    private Long id;

    private String name;

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

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

示例2

在插入数据时,自动填充字段的属性值为null,导致自动填充不生效。这时候我们需要在插入数据前,对自动填充字段的属性值进行设置。例如,如下的UserServiceImpl中,我们在save方法中对自动填充字段的属性值进行设置。

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public boolean save(User entity) {
        entity.setCreateTime(LocalDateTime.now());
        entity.setUpdateTime(LocalDateTime.now());
        return super.save(entity);
    }
}

五、总结

以上就是关于"Mybatis-plus自动填充不生效或自动填充数据为null原因及解决方案"的攻略。我们可以通过配置自动填充功能、验证自动填充字段的属性值或使用正确的自动填充注解来解决自动填充不生效或自动填充数据为null的问题。

The End

相关推荐

liunx mysql root账户提示:Your password has expired. To log in yo
liunx mysql root账户提示:Your password has expired. To log in you must change it using a client that supports expired passwords,要怎么操作呢? 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动...
2024-12-24 数据库
149

快速解决PostgreSQL中的Permission denied问题
下面是针对PostgreSQL中的权限问题的完整攻略。...
2023-12-07 数据库
3413

MySQL时间类型和模式详情
MySQL是一种流行的关系型数据库系统,它提供了多种时间类型和模式,用于存储和处理时间数据。本文将详细介绍MySQL时间类型和模式的详细攻略。...
2023-12-07 数据库
15

VMware中安装CentOS7(设置静态IP地址)并通过docker容器安装mySql数据库(超详细教程)
首先在官网下载CentOS7镜像,并在VMware虚拟机中新建一台CentOS7虚拟机,将镜像挂载到虚拟机中并启动。...
2023-12-07 数据库
11

SpringBoot项目报错:”Error starting ApplicationContext̷
首先,当我们使用Spring Boot开发项目时,可能会遇到Error starting ApplicationContext错误,一般这种错误是由于配置文件、依赖包或者代码逻辑等原因引起的。下面我将提供一条包含两条详细示例说明的完整攻略,用来解决上述问题。...
2023-12-07 数据库
489

Postgresql 赋予用户权限和撤销权限的实例
下面我将详细讲解如何为PostgreSQL数据库中的用户授予权限和撤销权限,包括两个实例。...
2023-12-07 数据库
30