Mybatis plus配置MetaObjectHandler无效

项目环境

<dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-boot-starter</artifactId>
   <version>3.4.2</version>
</dependency>
<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.3.4.RELEASE</version>
   <relativePath/>
</parent>

自动填充功能

项目引入mybatis-plus后,尝试使用它的自动填充功能,按照官方文档步骤实现,下面列出部分具体代码

注解填充字段

@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updatedTime;

@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createdTime;
自定义实现类TableMetaObjectHandler
@Component
public class TableMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createdTime", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "updatedTime", LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updatedTime", LocalDateTime.class, LocalDateTime.now());
    }
}

自动填充字段代码未执行

由于MetaObjectHandler实现类中的代码未执行,所以我debug寻找mybatis-plus源码中执行 insertFill方法的类

com.baomidou.mybatisplus.core.MybatisParameterHandler

在这里插入图片描述
在这里插入图片描述
从图中可以看出,MetaObjectHandler没有注入到配置中

解决方案

  1. 检查MetaObjectHandler实现类是否使用 @Component,实体类字段使用注解 @TableField(fill = FieldFill.INSERT)
  2. 手动注入MetaObjectHandler
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
 //获取mybatis-plus全局配置
    GlobalConfig globalConfig = GlobalConfigUtils.defaults();
    //mybatis-plus全局配置设置元数据对象处理器为自己实现的那个
    globalConfig.setMetaObjectHandler(new TableMetaObjectHandler());
    mybatisSqlSessionFactoryBean.setDataSource(dataSource);
    //mybatisSqlSessionFactoryBean关联设置全局配置
    mybatisSqlSessionFactoryBean.setGlobalConfig(globalConfig);
    ...
    return mybatisSqlSessionFactoryBean.getObject();
}
  1. 删除bean sqlSessionFactory, 这是最终解决我问题的方案。
    这是我原来的Mybatis配置类,主要配置了mapper路径和配置文件路径,后来我删除了此类,将这两项配置写到了yml文件里。
    出现这个问题的具体原因我没有再跟源码了,猜测是自定义Bean sqlSessionFactory 影响到了 globalConfig ,导致配置失效。
@Configuration
@EnableTransactionManagement
public class MybatisConfig {

    private static final String CONFIG_XML_PATH = "classpath:mybatis-config.xml";
    private static final String MAPPER_XML_PATH = "classpath:mapping/**/*.xml";

    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
        PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactory.setConfigLocation(pathMatchingResourcePatternResolver.getResource(CONFIG_XML_PATH));
        sqlSessionFactory.setMapperLocations(pathMatchingResourcePatternResolver.getResources(MAPPER_XML_PATH));
        sqlSessionFactory.setDataSource(dataSource);

        return sqlSessionFactory.getObject();
    }

    @Bean
    public DataSourceTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

在这里插入图片描述

其他

以上第三种方案还解决另一个问题;使用MyBatis-Plus的 通用枚举 特性,进行数据库查询时报错:

No enum constant com.**.workbench.model.enums.SystemStatusEnum.1

这个问题的原因应该和上述自动填充失效一样;由于 global-config.type-enums-package 配置失效,所以枚举类未被扫描。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis Plus是一个基于MyBatis的增强工具,可以简化MyBatis开发过程中的许多常见操作。在使用MyBatis Plus之前,你需要进行一些配置。 首先,你需要在你的项目中引入MyBatis Plus的依赖。你可以在你的项目的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本号</version> </dependency> ``` 接下来,你需要配置MyBatis Plus的一些参数,比如数据库连接信息、实体类扫描路径等。可以在application.properties或者application.yml文件中添加相应的配置,例如: ```properties # 数据库连接信息 spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver # 实体类扫描路径 mybatis-plus.type-aliases-package=com.example.entity # Mapper文件扫描路径 mybatis-plus.mapper-locations=classpath:mapper/*.xml # 开启MyBatis Plus自动填充(可选) mybatis-plus.global-config.db-config.auto-fill= true ``` 在以上配置中,你需要根据你的实际情况修改数据库连接信息、实体类扫描路径等。 最后,你可以在你的Mapper接口中直接继承MyBatis Plus提供的基础Mapper接口,来实现一些常用的数据库操作。例如: ```java @Repository public interface UserMapper extends BaseMapper<User> { // 自定义的查询方法 List<User> findByName(String name);} ``` 通过继承BaseMapper接口,你就可以直接使用MyBatis Plus提供的常用方法,如插入、更新、删除等。 这就是MyBatis Plus的基本配置过程,希望能对你有所帮助!如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值