SpringMVC 和Mybatis 集成 出现了一个问题,搜索了半天也没有解决;
Console 输出的错误:
严重: Servlet.service() for servlet spring threw exception
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.test.www.dao.MainEntityMapper.selectByPrimaryKey
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:184)
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:38)
at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:49)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:42)
at $Proxy12.selectByPrimaryKey(Unknown Source)
at com.test.www.service.impl.MainEntityServiceImpl.selectByPrimaryKey(MainEntityServiceImpl.java:24)
at com.test.www.controller.MyTestController.sayHello(MyTestController.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
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:116)
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:963)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
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:617)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:864)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1665)
at java.lang.Thread.run(Thread.java:619)只跑SpringMVC是没有问题的,和 Mybatis 数据库结合就出问题了:Spring的 配置文件:ApplicationContext.xml 的内容:   <!-- 配置数据库 -->  <!-- 配置数据源 -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
        <property name="locations">  
            <list>  
                <value>classpath:database.properties</value>  
            </list>  
        </property>  
    </bean>  
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <property name="driverClassName" value="${mysql.database.driver}" />  
        <property name="url" value="${mysql.database.url}" />  
        <property name="username" value="${mysql.database.user}" />  
        <property name="password" value="${mysql.database.password}" />  
    </bean> 
     <!-- 配置spring的JdbcTemplate --> 
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
         <property name="dataSource" ref="dataSource" />  
    </bean>
  <!-- 配置SqlSessionFactory -->
<bean id="sqlMapClient" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" >          
        </property>
        <!-- mybatis 全局配置文件 --> 
        <property name="configLocation" value="classpath:mybatisconfig/SqlMapConfig.xml"></property>
</bean>   
      
    <!-- 把加载了 配置文件的 sqlMapClient 注入 SqlSessionTemplate模板-->  
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">  
    <constructor-arg index="0" ref="sqlMapClient" />  
    </bean>  
      
    <!-- 注册Mapper:也可不指定特定mapper,而使用自动扫描包的方式来注册各种Mapper ,配置如下:-->  
    <!-- mapper 扫描器 -->  
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">    
        <property name="basePackage" value="com.test.www.dao" />    
    </bean> 
  
<context:annotation-config/> <!-- 开启注解 -->
<context:component-scan base-package="com.test.www" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" />
<context:include-filter type="annotation" expression="org.springframework.stereotype.Component" />
</context:component-scan> 目录结构:
不知道问题出在哪了,困扰了好几天了。

解决方案 »

  1.   

    错误原因很明显了啊,就是你mapper中定义的方法和你mybatis中方法名称不一致,spring找不到这个方法selectByPrimaryKey,仔细确认下吧
      

  2.   

    MainEntityMapper.xml和MainEntityMapper.class要在同一个目录下
      

  3.   

    看你的Mapper.class 以及 Mapper.xml  
    1、如果不在一个目录下在mapper.xml中要 注明报名.mapper
    2、看看mapper.class中的方法名与mapper.xml 中相关操作id一致
      

  4.   

    MainEntityMapper.selectByPrimaryKey    可能是你的类型写错了 resulttype resultmap用得对不
      

  5.   

    我感觉是 MainEntityMapper.selectByPrimaryKey 中的参数有问题  或者是在 mapper文件中获取参数错误 
      

  6.   

    dao文件夹里面的
    studentMapper.xml文件的
    select语句的
    id

    对应的studentMapper.java文件的
    方法名
    不一样