Intelij IDEA中web项目抛org.apache.ibatis.binding.BindingException: Invalid bound statement(not found):异常

今天在Intellij IDEA中运行spring mvc+spring+mybatis的web项目时,出现下列错误。把该项目放在eclipse和myeclipse中运行没有问题。

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.dao.OrderMapper.queryOrderByProdName
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:963)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:842)
javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:827)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)
Root Cause

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.dao.OrderMapper.queryOrderByProdName
org.apache.ibatis.binding.MapperMethod S q l C o m m a n d . ( M a p p e r M e t h o d . j a v a : 189 ) o r g . a p a c h e . i b a t i s . b i n d i n g . M a p p e r M e t h o d . ( M a p p e r M e t h o d . j a v a : 43 ) o r g . a p a c h e . i b a t i s . b i n d i n g . M a p p e r P r o x y . c a c h e d M a p p e r M e t h o d ( M a p p e r P r o x y . j a v a : 58 ) o r g . a p a c h e . i b a t i s . b i n d i n g . M a p p e r P r o x y . i n v o k e ( M a p p e r P r o x y . j a v a : 51 ) c o m . s u n . p r o x y . Proxy12.queryOrderByProdName(Unknown Source)
com.service.OrderServiceImpl.queryOrder(OrderServiceImpl.java:20)
com.controller.OrderController.queryOrder(OrderController.java:28)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:743)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:672)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:82)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:933)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:867)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:951)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:842)
javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:827)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)
一、项目结构
这里写图片描述
二、网上找的一些方法(对于我的错误没有用)
1. mapper的namespace写的不对!!!注意系修改。
2. UserDao的方法在UserDao.xml中没有,然后执行UserDao的方法会报此。
3. UserDao的方法返回值是List,而select元素没有正确配置ResultMap,或者只配置ResultType!
这些方法对于我的项目来说并没有用,因为项目在eclipse上能正常运行,说明整个项目本身并没有问题,以上几种错误导致的是项目本身就不能正常运行,而不是编译器不同导致的。
三、解决措施
既然问题并不是出在项目上,那么只有一种可能,那就事mapper.xml文件并没有编译,然后我就从这方面找问题,最后发现Intellij IDEA对xml文件的编译需要配置resource,否则只编译resources文件夹下的文件,而我的mapper.xml放在与mapper接口的同包下面,不在resources文件夹下。
解决方法:
1、maven项目,可在maven中配置resource,例如:

 <build>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
      <!-- 当前resource指定src/main/java文件夹下的.xml和.properties文件可编译-->
      <resource>
            <directory>src/main/java</directory>
            <includes>
              <include>**/*.properties</include>
              <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
       </resource>
    </resources>
  </build>

2、在src/main/resources中命名一个与mapper接口同名的包(如果包名不同,同样不会编译),然后把mapper.xml文件放在该包下,这样maven打包时会默认去编译该包下文件。
这里写图片描述
3、如果mapper接口与mapper.xml既不同包,也不在resource同包名文件下,只是在resource的文件下,那么就需要更改Mybatis-config.xml或者appicationContext.xml文件的配置来指定mapper.xml的位置。
更改appicationContext.xml文件,即不引用Mybatis-config.xml,而在appicationContext.xml中指定mapperLocations属性:
这里写图片描述
更改Mybatis-config.xml文件。首先appicationContext.xml中configLocation指定Mybatis-config.xml文件路径。

<bean id="mySqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
        <property name="dataSource" ref="dataSource"/>
        <!--<property name="mapperLocations" value="classpath*:mappers/**/*.xml" />-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
然后,在Mybatis-config.xml中配置mappers:

这里写图片描述
四、总结
该问题出现是因为默认配置文件编译的问题,只要配置好配置文件路径就能够解决问题,希望对大家有帮助。水平有限,如果有不足之处,欢迎指正!

猜你喜欢

转载自blog.csdn.net/sinat_37729104/article/details/79674159