美文网首页
记一次Mybatis-Plus使用xml定义sql报Invali

记一次Mybatis-Plus使用xml定义sql报Invali

作者: 余于鱼不是鱼鱼鱼 | 来源:发表于2021-11-12 11:48 被阅读0次

    Mybatis-Plus增强了Mybatis。那自然Mybatis能做的Mybatis-Plus照样能做。在一次使用Mybatis-Plus开发过程中。碰到这么个异常Invalid bound statement (not found)意思是找不到这个xml文件。而我在编译后的target文件夹下也找到了Mapper.xml文件

    解决方案

    1.首先肯定是自检代码有没有写错了,Mapper.xml的namespace确认是指向Mapper接口的


    使用idea的话,按住ctrl键能够跳到Mapper接口就是正确的

    2.另一方面是参照Mybatis-Plus官网

    我的问题出现在定义了MybatisSqlSessionFactory,却没有指定我没有使用原生的SqlSessionFactory,重新定义了MybatisSqlSessionFactoryBean,正是因为这个操作。导致了xml文件扫描不到


    在此之前先看一段源码,参考MybatisPlusAutoConfiguration

        @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
        @Bean
        @ConditionalOnMissingBean
        public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
            // TODO 使用 MybatisSqlSessionFactoryBean 而不是 SqlSessionFactoryBean
            MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
            factory.setDataSource(dataSource);
            factory.setVfs(SpringBootVFS.class);
            if (StringUtils.hasText(this.properties.getConfigLocation())) {
                factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
            }
            applyConfiguration(factory);
            if (this.properties.getConfigurationProperties() != null) {
                factory.setConfigurationProperties(this.properties.getConfigurationProperties());
            }
            if (!ObjectUtils.isEmpty(this.interceptors)) {
                factory.setPlugins(this.interceptors);
            }
            if (this.databaseIdProvider != null) {
                factory.setDatabaseIdProvider(this.databaseIdProvider);
            }
            if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
                factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
            }
            if (this.properties.getTypeAliasesSuperType() != null) {
                factory.setTypeAliasesSuperType(this.properties.getTypeAliasesSuperType());
            }
            if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
                factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
            }
            if (!ObjectUtils.isEmpty(this.typeHandlers)) {
                factory.setTypeHandlers(this.typeHandlers);
            }
            Resource[] mapperLocations = this.properties.resolveMapperLocations();
            if (!ObjectUtils.isEmpty(mapperLocations)) {
                factory.setMapperLocations(mapperLocations);
            }
    
            // TODO 对源码做了一定的修改(因为源码适配了老旧的mybatis版本,但我们不需要适配)
            Class<? extends LanguageDriver> defaultLanguageDriver = this.properties.getDefaultScriptingLanguageDriver();
            if (!ObjectUtils.isEmpty(this.languageDrivers)) {
                factory.setScriptingLanguageDrivers(this.languageDrivers);
            }
            Optional.ofNullable(defaultLanguageDriver).ifPresent(factory::setDefaultScriptingLanguageDriver);
    
            // TODO 自定义枚举包
            if (StringUtils.hasLength(this.properties.getTypeEnumsPackage())) {
                factory.setTypeEnumsPackage(this.properties.getTypeEnumsPackage());
            }
            // TODO 此处必为非 NULL
            GlobalConfig globalConfig = this.properties.getGlobalConfig();
            // TODO 注入填充器
            this.getBeanThen(MetaObjectHandler.class, globalConfig::setMetaObjectHandler);
            // TODO 注入主键生成器
            this.getBeanThen(IKeyGenerator.class, i -> globalConfig.getDbConfig().setKeyGenerator(i));
            // TODO 注入sql注入器
            this.getBeanThen(ISqlInjector.class, globalConfig::setSqlInjector);
            // TODO 注入ID生成器
            this.getBeanThen(IdentifierGenerator.class, globalConfig::setIdentifierGenerator);
            // TODO 设置 GlobalConfig 到 MybatisSqlSessionFactoryBean
            factory.setGlobalConfig(globalConfig);
            return factory.getObject();
        }
    

    可以看到在我自己定义的这个SqlSessionFactory中并没有设置Mapper.xml文件路径

    Resource[] mapperLocations = this.properties.resolveMapperLocations();
            if (!ObjectUtils.isEmpty(mapperLocations)) {
                factory.setMapperLocations(mapperLocations);
            }
    

    这回真相大白了,在中注入Mapper.xml文件路径


    相关文章

      网友评论

          本文标题:记一次Mybatis-Plus使用xml定义sql报Invali

          本文链接:https://www.haomeiwen.com/subject/lbmnzltx.html