abel533 / Mapper

Mybatis Common Mapper - Easy to use
https://mybatis.io
MIT License
7.34k stars 1.63k forks source link

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) #319

Open AlexanderShichaoYan opened 6 years ago

AlexanderShichaoYan commented 6 years ago

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的都不行。请问还有会什么原因会导致这个错误吗?

zhenggch commented 6 years ago

me too

lengmianshi commented 6 years ago

我也是

zhenggch commented 6 years ago

我的已经解决 原因:mybatis配置 bean.setMapperLocations(resolver.getResources("classpath:mapper/.xml")); bean.setMapperLocations(resolver.getResources("classpath:mapper//.xml")); 最后一条配置导致的问题,把 bean.setMapperLocations(resolver.getResources("classpath:mapper//*.xml")); 去掉就可以了。

abel533 commented 6 years ago

扫描不到,或者打包路径下不存在xml。

makejavas commented 6 years ago

我也遇到了这个问题,这是个神坑。 mybatis.mapper-locations=classpath*:com/test/mapper/*.xml 我是这里配置错了(classpath*写成了classpath),这样就只能匹配到一个文件。

diaodiaofly commented 6 years ago

@abel533 通用mapper自带的增删改查方法可以正常使用 自己写的xml查询报invalid bound statement (not found) 注解的mapper都也有写 问题出在哪呢?

abel533 commented 6 years ago

@diaodiaofly mybatis配置有问题或者找不到xml文件。

Houvzhi-Von commented 5 years ago

坑死,同样问题,顶起来!!

Houvzhi-Von commented 5 years ago

已解决该问题,各位出现此类问题的小伙伴们,看看自己mapper接口文件里是否加上@mapper注解,若果没有加上,则无法扫描到自定义扩展的mapper方法,加上即可!!

chengzime commented 5 years ago

同样的问题,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):

ckaige commented 5 years ago

同样的问题,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

chengzime commented 5 years ago

同样的问题,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也加了mapper/ mapper.xml中的路径什么的都没问题 打成jar包解压里面xml存在 MapperProxy类下面的private final Map<Method, MapperMethod> methodCache;启动获取到的都是null的

ckaige commented 5 years ago

我这边 启动入口 用的是 tk的MapperScan mapper包 下面的接口没有 加mapper 注解 yml配置就是我刚才复制的 plus, xml 位置在resources 下。 版本跟你这边的情况基本一致,可以参考下; 当时我这边情况跟你的一样,在yml 配置 plus 后解决了问题。

另外,你打包时候你看一下 xml 在包里吗

还有个思路,把xml放到跟src下,我看有人也这么放,避开配置resources下的xml

ckaige commented 5 years ago

我的版本情况如下

tk.mybatis mapper 4.0.0
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.2.5</version>
    </dependency>
3.0.7.1
chengzime commented 5 years ago

我的版本情况如下

        <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的例子测试是可以的, 改成我使用的版本也可以, 在项目里面就不行, 已经无力排查了, 先用注解吧,

ckaige commented 5 years ago

之前我们这有问题是因为有另外一个同事引了baomidou,然后我在pom里面把prent里面的依赖屏蔽了,我估计也是有其他依赖干扰了,有时间了再看看

chengzime commented 5 years ago

之前我们这有问题是因为有另外一个同事引了baomidou,然后我在pom里面把prent里面的依赖屏蔽了,我估计也是有其他依赖干扰了,有时间了再看看

恩, 作者的demo试了同版本没问题, 应该是项目里面什么别人配置的地方冲突了, 回头有时间一点一点的排查一下, 咱们上面讨论的配置基本都全了, 这些都没问题, 那基本就是别的东西影响了, 谢谢大佬耐心解答.

ckaige commented 5 years ago

共勉,欢迎讨论

darkwu commented 5 years ago

已修复,在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(); }

nice01qc commented 5 years ago
    <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)

具体匹配规则请看源码

Scalaaaaaa commented 4 years ago

我也遇到这个问题.我发现我的mybatis-locations配置是classpath:com/xx/星号星号(shift+8,打上不显示)/.xml, 再com前面少了个斜线/ . 还有就是,路径很长,我就用 星号星号 来代替中间的,但是,用 星号星号 就报这个错,把 星号星号 去掉,把路径写全, 就不报这个错. 关键配置如下:@MapperScan(value="com.yyy.example.dao") mybatis.mapper-locations=classpath:/com/yyy/example/mapper/.xml

harleyxt commented 4 years ago

已修复,在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();

}

按照你的方式终于解决了,非常感谢。

okuc commented 3 years ago

我也遇到了这个问题,我整整解决了一天一夜,才搞定。

我用的是tk.mybatis,自动生成的、和数据库中表一一对应的mapper及xml,用着都没有问题。我自已定义了一个复杂的sql,结果就出现了这个问题。xml是和生成的xml放在一个包下的,Mapper也是和生成的Mapper放在一块。但是我手工写的就是不行,我把百度、google上所有的解决方案都至少试了两遍以上,包含本页内的上述各种解决方案,都没有解决我的问题。整整过了23个小时,郁闷至极。 后来不知道脑子里哪根弦灵光一闪,发现编译后的class文件夹下竟然一个xml文件也没有,竟是没有编译。再仔细一下,原来是把resources文件夹名称写错了。也就是说,自动生成的和数据库表一一对应的xml配置文件,其实根本是没用到的,完全可以不用。这也太坑了。。。。它严重误导了我。。。。

所以我把这个过程写了出来,怀着悲愤的心情,给同样遇到此问题的你,提一个醒。

zhangjin2233 commented 3 years ago

我也遇到了,是因为resources目录下mybatis目录结构错了,与application.yml里面配置的mapper-locations: classpath:mybatis/mapper/.xml对应不上;晃眼一看mybatis.mapper以为就是mybatis/mapper,其实建目录的时候命名为mybatis.mapper**了,重建目录结构就好了;

wylswz commented 2 years ago

SqlSessionFactoryBean

用这个方法解决了问题,这个问题的根因在哪里有人知道吗?

wylswz commented 2 years ago

已修复,在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(); }

用这个方法解决了问题,这个问题的根因在哪里有人知道吗?

trifolium-x commented 1 year ago

给你自定义的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
  ...
wangpf1024 commented 4 months ago

已解决

liangxianjin commented 4 weeks ago

已修复,在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();

}

按照你的方式终于解决了,非常感谢。

折腾了一下午就你的可以,必须赞一个