MyBatis-Plus中MetaObjectHandler没生效完美解决

 更新时间:2023年11月13日 14:59:55   作者:xhx949  
在进行测试时发现配置的MyMetaObjectHandler并没有生效,本文主要介绍了MyBatis-Plus中MetaObjectHandler没生效完美解决,具有一定的参考价值,感兴趣的可以了解一下

Mybatisplus自动填充功能失效

通过SpringBoot框架集成 mybatis-plus首先导入需要的依赖

		<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.2</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.2</version>
        </dependency>

在appication.yml添加相关配置

mybatis-plus  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl//打印sql语句
  mapper-locations: com/example/mapper/xml/*.xml // 配置mapper的扫描,找到所有的mapper.xml映射文件

创建实体类对象

@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderMaster implements Serializable {
    @TableId(type = IdType.ASSIGN_UUID)//自动生成
    private String orderId;
    private String Name;
    private String Phone;
    private String Address;
    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * 修改时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}

按照官方文档进行配置
要记得添加@Component注解

@Component
//自动填充配置
public class FillHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("开始填充时间");

        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        this.setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
    }

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

正常来说到了这一步,一般情况下就好了常见的错误有这几种

  • 日期类不一致导致 创建日期、更新日期 为 null
  • @Component 没有被扫到,可以看下启动类的位置,启动类扫描的包是在其所在包以下的包
  • 还有就是填充的字段属性不一致,比如Date和LocalDateTime
  • 检查MetaObjectHandler实现类是否使用@Component
  • 实体类字段使用注解 @TableField(fill = FieldFill.INSERT)

可惜我的问题不是以上几种,于是我打了断点,发现根本没有执行到 MetaObjectHandler的实现类=>FillHandler于是我输出了所有的bean,发现MetaObjectHandler并没有注入进去。
这里的原因在于mybatis有自己默认的配置文件,所以我们自定义的没有生效,自定义Bean sqlSessionFactory 影响到了 globalConfig ,导致配置失效。
添加这样一个配置类即可

import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.example.handler.FillHandler;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

public class sqlSessionFactory {

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        //获取mybatis-plus全局配置
        GlobalConfig globalConfig = GlobalConfigUtils.defaults();
        //mybatis-plus全局配置设置元数据对象处理器为自己实现的那个
        globalConfig.setMetaObjectHandler(new FillHandler());
        mybatisSqlSessionFactoryBean.setDataSource(dataSource);
        //mybatisSqlSessionFactoryBean关联设置全局配置
        mybatisSqlSessionFactoryBean.setGlobalConfig(globalConfig);
        return mybatisSqlSessionFactoryBean.getObject();
    }

}

到这里就终于好了,这个问题困扰了我一整天,终于解决了!

到此这篇关于MyBatis-Plus中MetaObjectHandler没生效完美解决的文章就介绍到这了,更多相关MyBatis-Plus MetaObjectHandler没生效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java IO流之字节输入流的使用详解

    Java IO流之字节输入流的使用详解

    这篇文章主要为大家详细介绍了Java IO流中字节输入流的使用,文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
    2022-08-08
  • java仿枚举实例

    java仿枚举实例

    下面小编就为大家带来一篇java仿枚举实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • IDEA 2020.1打开时闪退的问题及解决方法(完美解决方法)

    IDEA 2020.1打开时闪退的问题及解决方法(完美解决方法)

    这篇文章主要介绍了IDEA 2020.1打开时闪退问题及解决方法,本文给大家分享我的处理方案,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • 利用Spring Session和redis对Session进行共享详解

    利用Spring Session和redis对Session进行共享详解

    这篇文章主要给大家介绍了关于利用Spring、Session和redis对Session进行共享的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • Java编程中的防转义和转义技巧汇总

    Java编程中的防转义和转义技巧汇总

    在编程过程中,我们常常需要处理特殊字符和特定上下文,以确保生成的内容在正确的环境中能够被解析和显示,本文将介绍一些常见的防转义或者转义处理的编程技巧,需要的可以参考一下
    2023-07-07
  • SpringCloud 集成Sentinel的实战教程

    SpringCloud 集成Sentinel的实战教程

    这篇文章主要介绍了SpringCloud 集成Sentinel的详细过程,本文通过实例代码图文相结合给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-08-08
  • SpringBoot集成EasyExcel的步骤

    SpringBoot集成EasyExcel的步骤

    EasyExcel是阿里巴巴开源poi插件之一,主要解决了poi框架使用复杂,sax解析模式不容易操作,数据量大起来容易OOM,解决了POI并发造成的报错。主要解决方式:通过解压文件的方式加载,一行一行的加载,并且抛弃样式字体等不重要的数据,降低内存的占用。
    2021-06-06
  • Spring Boot中自定义注解结合AOP实现主备库切换问题

    Spring Boot中自定义注解结合AOP实现主备库切换问题

    这篇文章主要介绍了Spring Boot中自定义注解+AOP实现主备库切换的相关知识,本篇文章的场景是做调度中心和监控中心时的需求,后端使用TDDL实现分表分库,需要的朋友可以参考下
    2019-08-08
  • Spring基于xml实现自动装配流程详解

    Spring基于xml实现自动装配流程详解

    自动装配是使用spring满足bean依赖的一种方法,spring会在应用上下文中为某个bean寻找其依赖的bean,Spring中bean有三种装配机制,分别是:在xml中显式配置、在java中显式配置、隐式的bean发现机制和自动装配
    2023-01-01
  • Java 数组内置函数toArray详解

    Java 数组内置函数toArray详解

    这篇文章主要介绍了Java 数组内置函数toArray详解,文本详细的讲解了toArray底层的代码和文档,需要的朋友可以参考下
    2021-06-06

最新评论