MyBatis-Plus,MetaObjectHandler没生效

基于若依框架集成 mybatis-plus

<dependency>
     <groupId>com.baomidou</groupId>
     <artifactId>mybatis-plus-boot-starter</artifactId>
     <version>3.4.3.4</version>
 </dependenacy>

appication.yml如下(因为若依集成了mybatis,所以一些相关的配置我放在mybatis上了)

# MyBatis配置
mybatis:
    # 搜索指定包别名
    typeAliasesPackage: com.surfilter.**.domain
    # 配置mapper的扫描,找到所有的mapper.xml映射文件
    mapperLocations: classpath*:mapper/**/*Mapper.xml
    # 加载全局的配置文件
    configLocation: classpath:mybatis/mybatis-config.xml

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted #这个是假删除(非必要配置)

创建对象类

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName("t_project")
public class ProjectEntity {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String name;
    private String description;
    @TableField(fill = FieldFill.INSERT)
    private String createBy;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;
    //这个就是假删除用的
    @TableLogic
    private Integer deleted;
    private Integer isValid;

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

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

按照官方文档配置

@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("insert fill");
        this.strictInsertFill(metaObject,"createTime", Date.class,new Date());
        this.strictInsertFill(metaObject,"createBy", String.class,SecurityUtils.getUsername());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("update fill");
        this.strictInsertFill(metaObject,"updateTime", Date.class,new Date());
        this.strictInsertFill(metaObject,"updateBy", String.class,SecurityUtils.getUsername());
    }
}

到了这一步,一般情况下就好了,结果就踩坑了!

然后我就上网找呀,大概几种原因(建议先debug一下进没进去这个handler,俺就是没进去):

  • 日期类不一致导致 创建日期、更新日期 为 null
  • @Component 没有被扫到,可以看下启动类的位置,启动类扫描的包是在其所在包以下的包
  • 还有就是填充的属性字段不一致

**emmm,几种原因都跟咱没关系 **

不想看我踩坑直接跳过来

我看了一下,ruoyi框架存在一个MybatisConfig,里面有这么一个东西,这个东西,已经配好了SqlSessionFactory的bean了,所以你这handler加@Component好像也没注入进去,然后我就加了这两句。

@Autowired
private MyMetaObjectHandler myMetaObjectHandler;

@Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
    {
        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
        String mapperLocations = env.getProperty("mybatis.mapperLocations");
        String configLocation = env.getProperty("mybatis.configLocation");
        typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
        VFS.addImplClass(SpringBootVFS.class);

        final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
        //下面三句,把刚刚写的handler,放在sessionFactory中
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setMetaObjectHandler(myMetaObjectHandler);
        sessionFactory.setGlobalConfig(globalConfig);
        return sessionFactory.getObject();
    }

这一步之前其实还踩了个坑,只不过很明显,idea直接报错了哈哈

如果你是从0开始集成mybatis-plus,可以通过按照下面配置。

就是,我按照网上,配了个Config,然后配置了上面那个bean,idea报错说有两个这种玩意儿。

@Configuration
public class MybatisPlusConfig {
    
   @Bean
    public MybatisSqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws IOException {
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        //全局配置
        GlobalConfig globalConfig  = new GlobalConfig();
        //配置填充器 MyMetaObjectHandler 可以直接 @Autowired 先注入,就不用new了
        sessionFactory.setMetaObjectHandler(new MyMetaObjectHandler());
        mybatisPlus.setGlobalConfig(globalConfig);
        return sessionFactory;
    }
}

收工~

感谢国家感谢党。

Logo

快速构建 Web 应用程序

更多推荐