Open AlexanderShichaoYan opened 6 years ago
me too
我也是
我的已经解决 原因:mybatis配置 bean.setMapperLocations(resolver.getResources("classpath:mapper/.xml")); bean.setMapperLocations(resolver.getResources("classpath:mapper//.xml")); 最后一条配置导致的问题,把 bean.setMapperLocations(resolver.getResources("classpath:mapper//*.xml")); 去掉就可以了。
扫描不到,或者打包路径下不存在xml。
我也遇到了这个问题,这是个神坑。
mybatis.mapper-locations=classpath*:com/test/mapper/*.xml
我是这里配置错了(classpath*写成了classpath),这样就只能匹配到一个文件。
@abel533 通用mapper自带的增删改查方法可以正常使用 自己写的xml查询报invalid bound statement (not found) 注解的mapper都也有写 问题出在哪呢?
@diaodiaofly mybatis配置有问题或者找不到xml文件。
坑死,同样问题,顶起来!!
已解决该问题,各位出现此类问题的小伙伴们,看看自己mapper接口文件里是否加上@mapper注解,若果没有加上,则无法扫描到自定义扩展的mapper方法,加上即可!!
同样的问题,springboot 2.0.4.RELEASE + tk.mybatis:mapper-spring-boot-starter:2.0.4 ,楼上的问题都检查了,没有问题, 启动类注解添加了, mapper注解也添加了, maven也配置了打包, 解压jar里面也把xml打进去了, 路径都是对的, 配置文件里面也没问题, mapper中只能使用注解自定义sql方法, 在xml中写sql无法访问, 各种方式都试了, 试了一天, 依然没有成功, org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
同样的问题,springboot 2.0.4.RELEASE + tk.mybatis:mapper-spring-boot-starter:2.0.4 ,楼上的问题都检查了,没有问题, 启动类注解添加了, mapper注解也添加了, maven也配置了打包, 解压jar里面也把xml打进去了, 路径都是对的, 配置文件里面也没问题, mapper中只能使用注解自定义sql方法, 在xml中写sql无法访问, 各种方式都试了, 试了一天, 依然没有成功, org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
application.yml 配置 扫描xml 时候使用 ps : 路径自行更换
mybatis-plus: mapper-locations: classpath:/mapper/.xml type-aliases-package: me.ckai.model configuration: map-underscore-to-camel-case: true use-generated-keys: true
同样的问题,springboot 2.0.4.RELEASE + tk.mybatis:mapper-spring-boot-starter:2.0.4 ,楼上的问题都检查了,没有问题, 启动类注解添加了, mapper注解也添加了, maven也配置了打包, 解压jar里面也把xml打进去了, 路径都是对的, 配置文件里面也没问题, mapper中只能使用注解自定义sql方法, 在xml中写sql无法访问, 各种方式都试了, 试了一天, 依然没有成功, org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
application.yml 配置 扫描xml 时候使用 ps : 路径自行更换
mybatis-plus: mapper-locations: classpath:/mapper/.xml type-aliases-package: me.ckai.model configuration: map-underscore-to-camel-case: true use-generated-keys: true
同样的问题,springboot 2.0.4.RELEASE + tk.mybatis:mapper-spring-boot-starter:2.0.4 ,楼上的问题都检查了,没有问题, 启动类注解添加了, mapper注解也添加了, maven也配置了打包, 解压jar里面也把xml打进去了, 路径都是对的, 配置文件里面也没问题, mapper中只能使用注解自定义sql方法, 在xml中写sql无法访问, 各种方式都试了, 试了一天, 依然没有成功, org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
application.yml 配置 扫描xml 时候使用 ps : 路径自行更换
mybatis-plus: mapper-locations: classpath:/mapper/.xml type-aliases-package: me.ckai.model configuration: map-underscore-to-camel-case: true use-generated-keys: true
试了一下还是不行
mybatis-plus: 和 mybatis: 两种都试了不行,
启动类 tk.的mapperscan和mybatis的都试过了也,
mapper里面也加了 @Mapper ,
pom.xml也加了
我这边 启动入口 用的是 tk的MapperScan mapper包 下面的接口没有 加mapper 注解 yml配置就是我刚才复制的 plus, xml 位置在resources 下。 版本跟你这边的情况基本一致,可以参考下; 当时我这边情况跟你的一样,在yml 配置 plus 后解决了问题。
另外,你打包时候你看一下 xml 在包里吗
还有个思路,把xml放到跟src下,我看有人也这么放,避开配置resources下的xml
我的版本情况如下
tk.mybatis mapper 4.0.0
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
我的版本情况如下
<groupId>tk.mybatis</groupId> <artifactId>mapper</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.5</version> </dependency>
3.0.7.1 我这边 启动入口 用的是 tk的MapperScan mapper包 下面的接口没有 加mapper 注解 yml配置就是我刚才复制的 plus, xml 位置在resources 下。 版本跟你这边的情况基本一致,可以参考下; 当时我这边情况跟你的一样,在yml 配置 plus 后解决了问题。 另外,你打包时候你看一下 xml 在包里吗 还有个思路,把xml放到跟src下,我看有人也这么放,避开配置resources下的xml
我的版本号
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
打成jar包之后jar包里面xml存在, 整整弄了一天多了, 各种组合方式都试过了, 都不行, 另外下载的作者的springboot+通用mapper的例子测试是可以的, 改成我使用的版本也可以, 在项目里面就不行, 已经无力排查了, 先用注解吧,
之前我们这有问题是因为有另外一个同事引了baomidou,然后我在pom里面把prent里面的依赖屏蔽了,我估计也是有其他依赖干扰了,有时间了再看看
之前我们这有问题是因为有另外一个同事引了baomidou,然后我在pom里面把prent里面的依赖屏蔽了,我估计也是有其他依赖干扰了,有时间了再看看
恩, 作者的demo试了同版本没问题, 应该是项目里面什么别人配置的地方冲突了, 回头有时间一点一点的排查一下, 咱们上面讨论的配置基本都全了, 这些都没问题, 那基本就是别的东西影响了, 谢谢大佬耐心解答.
全
共勉,欢迎讨论
已修复,在config配置中注入SqlSessionFactory Bean,里面手动配置扫描包即可 @Bean(name ={"SqlSessionFactory"}) public SqlSessionFactory localhostSqlSessionFactory(@Qualifier("DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean(); //因为new了一个SqlSessionFactoryBean 所以yml的mapper-locations的配置没有用,需要手动配置扫描的包 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sqlSessionFactory.setMapperLocations(resolver.getResources("classpath:/mapper/.xml")); //设置扫描的实体包 sqlSessionFactory.setTypeAliasesPackage("com.abc.model"); sqlSessionFactory.setDataSource(dataSource); return sqlSessionFactory.getObject(); }
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.00</version>
</dependency>
关于此mybatis 配置没加载上问题已经解决: 将匹配模式改成 "classpath:*/mapper/.xml" 就是在classpath: 后面加两个**,不然就是找不到资源,
具体查看MybatisProperties 下面:private static final ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
也就这个方法 resourceResolver.getResources(location)
具体匹配规则请看源码
我也遇到这个问题.我发现我的mybatis-locations配置是classpath:com/xx/星号星号(shift+8,打上不显示)/.xml, 再com前面少了个斜线/ . 还有就是,路径很长,我就用 星号星号 来代替中间的,但是,用 星号星号 就报这个错,把 星号星号 去掉,把路径写全, 就不报这个错. 关键配置如下:@MapperScan(value="com.yyy.example.dao") mybatis.mapper-locations=classpath:/com/yyy/example/mapper/.xml
已修复,在config配置中注入SqlSessionFactory Bean,里面手动配置扫描包即可 @bean(name ={"SqlSessionFactory"}) public SqlSessionFactory localhostSqlSessionFactory(@qualifier("DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean(); //因为new了一个SqlSessionFactoryBean 所以yml的mapper-locations的配置没有用,需要手动配置扫描的包 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sqlSessionFactory.setMapperLocations(resolver.getResources("classpath:/mapper/.xml")); //设置扫描的实体包 sqlSessionFactory.setTypeAliasesPackage("com.abc.model"); sqlSessionFactory.setDataSource(dataSource); return sqlSessionFactory.getObject(); }
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
//因为new了一个SqlSessionFactoryBean 所以yml的mapper-locations的配置没有用,需要手动配置扫描的包
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
factoryBean.setMapperLocations(resolver.getResources("classpath*:/mapper/*.xml"));
factoryBean.setTypeAliasesPackage("com.harley.**.entity");
factoryBean.setDataSource(dataSource());
return factoryBean.getObject();
}
按照你的方式终于解决了,非常感谢。
我也遇到了这个问题,我整整解决了一天一夜,才搞定。
我用的是tk.mybatis,自动生成的、和数据库中表一一对应的mapper及xml,用着都没有问题。我自已定义了一个复杂的sql,结果就出现了这个问题。xml是和生成的xml放在一个包下的,Mapper也是和生成的Mapper放在一块。但是我手工写的就是不行,我把百度、google上所有的解决方案都至少试了两遍以上,包含本页内的上述各种解决方案,都没有解决我的问题。整整过了23个小时,郁闷至极。 后来不知道脑子里哪根弦灵光一闪,发现编译后的class文件夹下竟然一个xml文件也没有,竟是没有编译。再仔细一下,原来是把resources文件夹名称写错了。也就是说,自动生成的和数据库表一一对应的xml配置文件,其实根本是没用到的,完全可以不用。这也太坑了。。。。它严重误导了我。。。。
所以我把这个过程写了出来,怀着悲愤的心情,给同样遇到此问题的你,提一个醒。
我也遇到了,是因为resources目录下mybatis目录结构错了,与application.yml里面配置的mapper-locations: classpath:mybatis/mapper/.xml对应不上;晃眼一看mybatis.mapper以为就是mybatis/mapper,其实建目录的时候命名为mybatis.mapper**了,重建目录结构就好了;
SqlSessionFactoryBean
用这个方法解决了问题,这个问题的根因在哪里有人知道吗?
已修复,在config配置中注入SqlSessionFactory Bean,里面手动配置扫描包即可 @bean(name ={"SqlSessionFactory"}) public SqlSessionFactory localhostSqlSessionFactory(@qualifier("DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean(); //因为new了一个SqlSessionFactoryBean 所以yml的mapper-locations的配置没有用,需要手动配置扫描的包 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sqlSessionFactory.setMapperLocations(resolver.getResources("classpath:/mapper/.xml")); //设置扫描的实体包 sqlSessionFactory.setTypeAliasesPackage("com.abc.model"); sqlSessionFactory.setDataSource(dataSource); return sqlSessionFactory.getObject(); }
用这个方法解决了问题,这个问题的根因在哪里有人知道吗?
给你自定义的SqlSessionFactoryBean中.setMapperLocations(),添加你的mapper扫描路径即可。 或者:
@Bean
@Primary
public SqlSessionFactory sqlSessionFactory(DataSource dataSource, MybatisProperties properties,
ResourceLoader resourceLoader) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setVfs(SpringBootVFS.class);
if (StringUtils.hasText(properties.getConfigLocation())) {
factory.setConfigLocation(resourceLoader.getResource(properties.getConfigLocation()));
}
org.apache.ibatis.session.Configuration configuration = properties.getConfiguration();
if (configuration == null && !StringUtils.hasText(properties.getConfigLocation())) {
configuration = new org.apache.ibatis.session.Configuration();
}
factory.setConfiguration(configuration);
String typeAliasesPackage = properties.getTypeAliasesPackage();
if (StringUtils.hasLength(typeAliasesPackage)) {
factory.setTypeAliasesPackage(typeAliasesPackage);
}
if (properties.getTypeAliasesSuperType() != null) {
factory.setTypeAliasesSuperType(properties.getTypeAliasesSuperType());
}
if (StringUtils.hasLength(properties.getTypeHandlersPackage())) {
factory.setTypeHandlersPackage(properties.getTypeHandlersPackage());
}
if (!ObjectUtils.isEmpty(properties.resolveMapperLocations())) {
factory.setMapperLocations(properties.resolveMapperLocations());
}
return factory.getObject();
}
然后在你的ymal中配置一下
mybatis:
type-aliases-package: com.xxx.xxxx.xx.xx
mapper-locations: classpath*:mapper/*.xml
...
已解决
已修复,在config配置中注入SqlSessionFactory Bean,里面手动配置扫描包即可 @bean(name ={"SqlSessionFactory"}) public SqlSessionFactory localhostSqlSessionFactory(@qualifier("DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean(); //因为new了一个SqlSessionFactoryBean 所以yml的mapper-locations的配置没有用,需要手动配置扫描的包 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sqlSessionFactory.setMapperLocations(resolver.getResources("classpath:/mapper/.xml")); //设置扫描的实体包 sqlSessionFactory.setTypeAliasesPackage("com.abc.model"); sqlSessionFactory.setDataSource(dataSource); return sqlSessionFactory.getObject(); }
@Bean public SqlSessionFactory sqlSessionFactory() throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); //因为new了一个SqlSessionFactoryBean 所以yml的mapper-locations的配置没有用,需要手动配置扫描的包 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); factoryBean.setMapperLocations(resolver.getResources("classpath*:/mapper/*.xml")); factoryBean.setTypeAliasesPackage("com.harley.**.entity"); factoryBean.setDataSource(dataSource()); return factoryBean.getObject(); }
按照你的方式终于解决了,非常感谢。
折腾了一下午就你的可以,必须赞一个
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.test.dao.ServiceOrderMapper.selectServiceOrderById at org.apache.ibatis.binding.MapperMethod$SqlCommand.(MapperMethod.java:227)
at org.apache.ibatis.binding.MapperMethod.(MapperMethod.java:49)
at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58)
at com.sun.proxy.$Proxy68.selectServiceOrderById(Unknown Source)
at com.test.service.impl.ServiceOrderServiceImpl.queryServiceOrderById(ServiceOrderServiceImpl.java:36)
at com.test.controllor.ServiceOrderControllor.testOrder(ServiceOrderControllor.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:108)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
求助: 项目可以正常启动,调用tk原生的API也正常使用。但是一旦调用自定义的mapper.xml文件里自定义DAO方法,就会出现这个异常。我的项目版本spring boot2.0.1 + tk mapper2.0.2 。网上有说类名、路径错误、扫描注解没加等等的原因,但这些都验证过了,启动类有 @MapperScan(basePackages = {"com.test.dao"}, markerInterface = Mapper.class )。application.yml文件的mapper路径是对的,mappering.xml文件也配置无误。我还试了很多不同的版本,boot和tk的都不行。请问还有会什么原因会导致这个错误吗?