mybatis plus报Invalid bound statement (not found):解决

emmm,写了一天的bug后又回到了原点
先说一下网上的解决步骤

1、mapper.xml的namespace是否是对应接口类的全名(包括包名和类名):这个是必须要保证相同,需要进行检查,而且全类名最好通过复制,通过Copy Reference来赋值路径名。

2、 mapper接口类和mapper.xml是否在同一个包下,文件名称是否一致(仅后缀不同):其实,这个并不需要在同一个包下面,通常mapper.xml文件是存放在src/main/resources目录下,而mapper接口类是在src/main/java目录下面;名称是否相同也不重要,我的命名分贝为ProductCategoryDao.java和ProductCategoryMapper.xml,实际也可以运行成功 。

3、mapper接口类的方法名是否与mapper.xml中sql标签的id相同:这个也需要进行检查,必须保证一致 。

4、 mapper.xml文件中用resultMap,而不用resultType(当sql操作结果是List或其他复杂结果集时):我经过实践检验,我的查询结果是一个Integer的List集合,用resultMap反而报错,异常信息如下:

5、 还有网上说配置路径:classpath:mapper/.xml 改为 classpath:mapper/*.xml,这个修改是不起作用的,同样报错。

6、如果以上的的修改你都改正过来了还是报错的话,我建议你去仔细看看配置文件具体的字母有没有写错

上面的办法都对我没用,后来突发奇想,会不会跟mybatis-plus有关系呢?

然后看了几篇文章后,终于看到了这句话:
SqlSessionFactory不要使用原生的,请使用MybatisSqlSessionFactory

这个才是问题的根源,欲哭无泪
下面是配置类:

package top.chyandzhc.auth.api.auth.config;

import com.baomidou.mybatisplus.MybatisConfiguration;
import com.baomidou.mybatisplus.MybatisXMLLanguageDriver;
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean;
import com.baomidou.mybatisplus.spring.boot.starter.MybatisPlusProperties;
import com.baomidou.mybatisplus.spring.boot.starter.SpringBootVFS;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.plugin.Interceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

import javax.sql.DataSource;
import java.io.IOException;

@Configuration
@MapperScan("api.script.caidan.mapper")
public class MybatisPlusConfig {
    @Autowired
    private DataSource dataSource;
 
    @Autowired
    private MybatisPlusProperties properties;
 
    @Autowired
    private ResourceLoader resourceLoader = new DefaultResourceLoader();
 
    @Autowired(required = false)
    private Interceptor[] interceptors;
 
    @Autowired(required = false)
    private DatabaseIdProvider databaseIdProvider;
 
    /**
     * mybatis-plus分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor page = new PaginationInterceptor();
        page.setDialectType("mysql");
        return page;
    }
 
    /**
     * 这里全部使用mybatis-autoconfigure 已经自动加载的资源。不手动指定 配置文件和mybatis-boot的配置文件同步
     * 
     * @return
     * @throws IOException
     */
    @Bean
    public MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean() throws IOException {
        MybatisSqlSessionFactoryBean mybatisPlus = new MybatisSqlSessionFactoryBean();
        mybatisPlus.setDataSource(dataSource);
        mybatisPlus.setVfs(SpringBootVFS.class);
        String configLocation = this.properties.getConfigLocation();
        if (StringUtils.isNotBlank(configLocation)) {
            mybatisPlus.setConfigLocation(this.resourceLoader.getResource(configLocation));
        }
        mybatisPlus.setConfiguration(properties.getConfiguration());
        mybatisPlus.setPlugins(this.interceptors);
        MybatisConfiguration mc = new MybatisConfiguration();
        mc.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
        mc.setMapUnderscoreToCamelCase(false);// 数据库和java都是驼峰,就不需要
        mybatisPlus.setConfiguration(mc);
        if (this.databaseIdProvider != null) {
            mybatisPlus.setDatabaseIdProvider(this.databaseIdProvider);
        }
        mybatisPlus.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
        mybatisPlus.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
        mybatisPlus.setMapperLocations(this.properties.resolveMapperLocations());
        // 设置mapper.xml文件的路径
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Resource[] resource = resolver.getResources("classpath:mapper/**/*.xml");
        mybatisPlus.setMapperLocations(resource);
        return mybatisPlus;
    }
}

然后再跑起来,终于解决了,具体原因还不明确,后面有空再更新


版权声明:本文为qq_40088207原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。