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();}}
到这里就终于好了,这个问题困扰了我一整天,终于解决了!
版权归原作者 xhx949 所有, 如有侵权,请联系我们删除。