2015-11-02 111 views
2

我使用Spring MVC的帶彈簧的MyBatis進行使用註釋(@Insert@Select等)基本的CRUD操作和獲得本以下異常MyBatis的org.apache.ibatis.binding.BindingException:無效的綁定聲明(未找到)

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

這裏有一個相關的問題,mybatis spring mvc application, getting Invalid bound statement (not found)但因爲它使用XML(UserMapper.xml),用於在那裏我用註解Java接口(UserMapper.java)查詢映射不解決我的問題。

異常堆棧跟蹤:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.spring.mybatisdemo.mappers.UserMapper.selectNationality 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:801) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) 
    at org.eclipse.jetty.server.handler.ContextHandler.__doHandle(ContextHandler.java:1126) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1060) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215) 
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:113) 
    at org.eclipse.jetty.server.Server.handle(Server.java:509) 
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:288) 
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:240) 
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:539) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:620) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:540) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.spring.mybatisdemo.mappers.UserMapper.selectNationality 
    at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:196) 
    at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:44) 
    at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:59) 
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52) 
    at com.sun.proxy.$Proxy41.selectNationality(Unknown Source) 
    at com.spring.mybatisdemo.service.UserServiceImpl.selectNationalityById(UserServiceImpl.java:69) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.zeroturnaround.javarebel.fY.invoke(JRebel:1114) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
    at com.sun.proxy.$Proxy43.selectNationalityById(Unknown Source) 
    at com.spring.mybatisdemo.controller.UserController.getUsers(UserController.java:65) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) 

springConfig.xml

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="typeAliasesPackage" value="com.spring.mybatisdemo.model"/> 
    <property name="mapperLocations" value="classpath*:com/spring/mybatis/mappers/*.xml" /> 
</bean> 

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> 
    <constructor-arg index="0" ref="sqlSessionFactory" /> 
</bean> 

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
    <property name="basePackage" value="com.spring.mybatisdemo.mappers" /> 
</bean> 

國籍 POJO類,

public class Nationality { 
    private Long nationalityId; 
    private String name; 

    //ignoring getters and setters 
} 

我使用的標註爲查詢和下面是我從UserMapper.java界面相關的代碼,

@Select("SELECT nationalityId, name FROM nationality where nationalityId = #{nationalityId} ") 
public Nationality selectNationality(Long nationalityId); 

調用上面的方法一樣,

Nationality nationality = userService.selectNationalityById(new Long("1")); 

而在UserServiceImpl.java我已經注射了UserMapper豆並使用它像,

userMapper.selectNationality(nationalityId); 

我用於選擇teamById做工精細同樣的查詢,

userMapper.getTeamById(teamId) 

@Select("SELECT teamId, name FROM TEAM WHERE teamId = #{teamId}") 
public Team getTeamById(Long teamId); 

,並在控制檯相應teamById查詢,

[artifact:mvn] 2015-11-02 18:51:20 DEBUG SpringManagedTransaction:54 - JDBC Connection [[email protected]] will be managed by Spring 
[artifact:mvn] 2015-11-02 18:51:20 DEBUG getTeamById:54 - ==> Preparing: SELECT teamId, name FROM TEAM WHERE teamId = ? 
[artifact:mvn] 2015-11-02 18:51:20 DEBUG getTeamById:54 - ==> Parameters: 4(Long) 
[artifact:mvn] 2015-11-02 18:51:20 DEBUG getTeamById:54 - <==  Total: 1 

我不知道爲什麼只有國籍有這個問題而Team類相同的方法工作正常。我的代碼中提取國籍數據的問題可能是什麼?

回答

1

我曾經犯過類似的錯誤,結果證明這些目錄不正確。
如果UserMapper的名稱空間爲com.mybatisdemo.mappers.UserMapper,請確保映射程序位置爲src/resources/com/mybatisdemo/mappers/
有時我們可能會創建一個名爲com.mybatisdemo.mappers的目錄,那麼它的位置就是src/resources/com.mybatisdemo.mappers,這是錯誤的。