在使用Maven工程管理工具整合SSM框架时,Mybatis使用逆向工程生成的pojo,mapper接口及映射文件,把mapper接口和映射文件放在DAO工程的同一级src/main/java目录下。正常启动服务器,浏览器执行业务Console控制台抛出异常:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)。
一、异常描述:
1 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 2 cn.e3mall.mapper.TbItemMapper.selectByExample 3 at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:189) 4 at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:43) 5 at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:58) 6 at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:51) 7 at com.sun.proxy.$Proxy31.selectByExample(Unknown Source) 8 at cn.e3mall.service.impl.ItemServiceImpl.getItemById(ItemServiceImpl.java:34) 9 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 10 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 11 at sun.reflect.DelegatingMethodAccessorImpl.invoke 12 (DelegatingMethodAccessorImpl.java:43) 13 at java.lang.reflect.Method.invoke(Method.java:498) 14 at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection 15 (AopUtils.java:302) 16 at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint 17 (ReflectiveMethodInvocation.java:190) 18 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed 19 (ReflectiveMethodInvocation.java:157) 20 at org.springframework.transaction.interceptor. 21 TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 22 at org.springframework.transaction.interceptor.TransactionAspectSupport. 23 invokeWithinTransaction(TransactionAspectSupport.java:281) 24 at org.springframework.transaction.interceptor.TransactionInterceptor.invoke 25 (TransactionInterceptor.java:96) 26 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed 27 (ReflectiveMethodInvocation.java:179) 28 at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke 29 (ExposeInvocationInterceptor.java:92) 30 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed 31 (ReflectiveMethodInvocation.java:179) 32 at org.springframework.aop.framework.JdkDynamicAopProxy.invoke 33 (JdkDynamicAopProxy.java:208) 34 at com.sun.proxy.$Proxy34.getItemById(Unknown Source) 35 at cn.e3mall.controller.ItemController.getItemById(ItemController.java:27) 36 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 37 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 38 at sun.reflect.DelegatingMethodAccessorImpl.invoke 39 (DelegatingMethodAccessorImpl.java:43) 40 at java.lang.reflect.Method.invoke(Method.java:498) 41 at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke 42 (InvocableHandlerMethod.java:222) 43 at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest 44 (InvocableHandlerMethod.java:137) 45 at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod. 46 invokeAndHandle(ServletInvocableHandlerMethod.java:110) 47 at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter. 48 invokeHandlerMethod(RequestMappingHandlerAdapter.java:814) 49 at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter. 50 handleInternal(RequestMappingHandlerAdapter.java:737) 51 at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle 52 (AbstractHandlerMethodAdapter.java:85) 53 at org.springframework.web.servlet.DispatcherServlet.doDispatch 54 (DispatcherServlet.java:959) 55 at org.springframework.web.servlet.DispatcherServlet.doService 56 (DispatcherServlet.java:893) 57 at org.springframework.web.servlet.FrameworkServlet.processRequest 58 (FrameworkServlet.java:969) 59 at org.springframework.web.servlet.FrameworkServlet.doGet 60 (FrameworkServlet.java:860) 61 at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 62 at org.springframework.web.servlet.FrameworkServlet.service 63 (FrameworkServlet.java:845) 64 at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 65 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter 66 (ApplicationFilterChain.java:305) 67 at org.apache.catalina.core.ApplicationFilterChain.doFilter 68 (ApplicationFilterChain.java:210) 69 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 70 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter 71 (ApplicationFilterChain.java:243) 72 at org.apache.catalina.core.ApplicationFilterChain.doFilter 73 (ApplicationFilterChain.java:210) 74 at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal 75 (CharacterEncodingFilter.java:121) 76 at org.springframework.web.filter.OncePerRequestFilter.doFilter 77 (OncePerRequestFilter.java:107) 78 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter 79 (ApplicationFilterChain.java:243) 80 at org.apache.catalina.core.ApplicationFilterChain.doFilter 81 (ApplicationFilterChain.java:210) 82 at org.apache.catalina.core.StandardWrapperValve.invoke 83 (StandardWrapperValve.java:222) 84 at org.apache.catalina.core.StandardContextValve.invoke 85 (StandardContextValve.java:123) 86 at org.apache.catalina.authenticator.AuthenticatorBase.invoke 87 (AuthenticatorBase.java:502) 88 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 89 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 90 at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 91 at org.apache.catalina.core.StandardEngineValve.invoke 92 (StandardEngineValve.java:118) 93 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 94 at org.apache.coyote.http11.AbstractHttp11Processor.process 95 (AbstractHttp11Processor.java:1041) 96 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process 97 (AbstractProtocol.java:603) 98 at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 99 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 100 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 101 at java.lang.Thread.run(Thread.java:748)
二、错误分析:
此异常的原因是由于mapper接口编译后在同一个目录下没有找到mapper映射文件而出现的。由于maven工程在默认情况下src/main/java目录下的mapper文件是不发布到target目录下的。
三、解决办法:
方法1:将Mapper映射文件放到src/main/resources目录下,然后再建一个和mapper接口所在的包名一样的包。
方法2:在此工程pom文件中配置一下resources。
1 <!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 --> 2 <build> 3 <resources> 4 <resource> 5 <directory>src/main/java</directory> 6 <includes> 7 <include>**/*.properties</include> 8 <include>**/*.xml</include> 9 </includes> 10 <filtering>false</filtering> 11 </resource> 12 </resources> 13 </build>
四、注意事项:
原配置文件默认放在src/main/resources目录下,这样配置了之后,就指定src/main/java它是资源目录,src/main/resources目录就会不起作用了。如果不想这样,需要在配置中再加上一个resource节点,把src/main/resources目录也添加进来,即:
1 <!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 --> 2 <build> 3 <resources> 4 <resource> 5 <directory>src/main/java</directory> 6 <includes> 7 <include>**/*.properties</include> 8 <include>**/*.xml</include> 9 </includes> 10 <filtering>false</filtering> 11 </resource> 12 <resource> 13 <directory>src/main/resources</directory> 14 <includes> 15 <include>**/*.properties</include> 16 <include>**/*.xml</include> 17 </includes> 18 <filtering>false</filtering> 19 </resource> 20 </resources> 21 </build>