0


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@NoArgsConstructorpublicclassOrderMasterimplementsSerializable{@TableId(type =IdType.ASSIGN_UUID)//自动生成privateString orderId;privateStringName;privateStringPhone;privateStringAddress;/**
     * 创建时间
     */@TableField(fill =FieldFill.INSERT)privateLocalDateTime createTime;/**
     * 修改时间
     */@TableField(fill =FieldFill.INSERT_UPDATE)privateLocalDateTime updateTime;}

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

@Component//自动填充配置publicclassFillHandlerimplementsMetaObjectHandler{@OverridepublicvoidinsertFill(MetaObject metaObject){
        log.info("开始填充时间");this.strictInsertFill(metaObject,"createTime",LocalDateTime.class,LocalDateTime.now());this.setFieldValByName("updateTime",LocalDateTime.now(),metaObject);}@OverridepublicvoidupdateFill(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 ,导致配置失效。
添加这样一个配置类即可

importcom.baomidou.mybatisplus.core.config.GlobalConfig;importcom.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;importcom.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;importcom.example.handler.FillHandler;importorg.apache.ibatis.session.SqlSessionFactory;importorg.springframework.context.annotation.Bean;importjavax.sql.DataSource;publicclass sqlSessionFactory {@BeanpublicSqlSessionFactorysqlSessionFactory(DataSource dataSource)throwsException{MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean =newMybatisSqlSessionFactoryBean();//获取mybatis-plus全局配置GlobalConfig globalConfig =GlobalConfigUtils.defaults();//mybatis-plus全局配置设置元数据对象处理器为自己实现的那个
        globalConfig.setMetaObjectHandler(newFillHandler());
        mybatisSqlSessionFactoryBean.setDataSource(dataSource);//mybatisSqlSessionFactoryBean关联设置全局配置
        mybatisSqlSessionFactoryBean.setGlobalConfig(globalConfig);return mybatisSqlSessionFactoryBean.getObject();}}

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


本文转载自: https://blog.csdn.net/xhx949/article/details/128781536
版权归原作者 xhx949 所有, 如有侵权,请联系我们删除。

“MyBatis-Plus,MetaObjectHandler没生效,完美解决”的评论:

还没有评论