天天看點

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 SqlCommand.(MapperMethod.java:189)org.apache.ibatis.binding.MapperMethod.(MapperMethod.java:43)org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:58)org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:51)com.sun.proxy. 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)

一、項目結構

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

二、網上找的一些方法(對于我的錯誤沒有用)

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打包時會預設去編譯該包下檔案。

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

3、如果mapper接口與mapper.xml既不同包,也不在resource同包名檔案下,隻是在resource的檔案下,那麼就需要更改Mybatis-config.xml或者appicationContext.xml檔案的配置來指定mapper.xml的位置。

更改appicationContext.xml檔案,即不引用Mybatis-config.xml,而在appicationContext.xml中指定mapperLocations屬性:

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

更改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:
           
Intelij IDEA中web項目抛org.apache.ibatis.binding.BindingException: Invalid bound statement(not found):異常

四、總結

該問題出現是因為預設配置檔案編譯的問題,隻要配置好配置檔案路徑就能夠解決問題,希望對大家有幫助。水準有限,如果有不足之處,歡迎指正!

繼續閱讀