配置多数据源导致的 invalid bound statement (not found)问题

之前由于给springboot项目实现了读写分离的方案,结果发现调用dao层始终提示如下问题:

invalid bound statement (not found)

因为这个问题寻找了半天解决方案,网上的文章无非集中在namespace、mapper文件路径、启动扫描包、文件名不一致等等,但是无一例外,都没能解决我的问题


解决方法(Solve Problem):

在要实现SqlSessionFactory的地方,加入:

bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/**/*Mapper.xml"));

如:

@Bean
    public SqlSessionFactory getSqlSessionFactory(@Qualifier("dataSource") DynamicDataSource dataSource) {
        try {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            // 如果不写这里,会导致 mybatis 出现 invalid bound statement (not found) 的问题
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/**/*Mapper.xml"));
            bean.setDataSource(dataSource);
            return bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

评论

《 “配置多数据源导致的 invalid bound statement (not found)问题” 》 有 3 条评论

  1. 请问bean.setMapperLocations(newPathMatchingResourcePatternResolver().getResources(“classpath:mapper/**/*Mapper.xml”)); 中classpath:mapper/**/*Mapper.xml” 与 classpath:mapper/”name”/*Mapper.xml” 的区别,使用前者,其他的数据源工厂需要再set吗?前者与后者的区别在哪?

    1. 这两者的区别就是Mapper文件夹下面是否有多级目录,采用前者这种方式,如果底下比如有多个层级的目录,也是会将里面的mapper扫描到的,如果多数据源是同类型的库,比如都是oracle或者mysql,则只用一个就行,如果是多个不同类型的数据源,则建议分开,否则可能会语句不同导致报错

  2. 感谢大佬,我还是同样的问题,配置多数据源后,无法识别xml

回复 阿泽 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据