整合SSM时,访问接口时报错:意思是,根据UserMapper.java 没有找到对应的UserMapper.xml文件

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.itcast.mapper.UserMapper.queryUserById
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	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:107)
root cause

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.itcast.mapper.UserMapper.queryUserById
	org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:214)
	org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48)
	org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:59)
	org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52)
	com.sun.proxy.$Proxy12.queryUserById(Unknown Source)
	com.itcast.service.impl.UserServiceImpl.queryUserById(UserServiceImpl.java:17)
	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:497)
	org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
	org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
	org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:266)
	org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
	com.sun.proxy.$Proxy15.queryUserById(Unknown Source)
	com.itcast.controller.UserController.queryUserById(UserController.java:17)
	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:497)
	org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
	org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
	org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721)
	org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	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:107)

 

 

spring文件相关内容如下:加载了SqlMapConfig.xml文件

<!-- 配置SqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource" />

        <!-- 加载mybatis的全局配置文件 -->
        <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" />


        <!-- 配置实体类型别名的扫描包 -->
        <property name="typeAliasesPackage" value="com.itcast.entity"></property>
    </bean>

 

SqlMapConfig.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

</configuration>

 

UserMapper.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,使用动态代理开发DAO -->
<!-- 1. namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itcast.mapper.UserMapper">

    <!-- 2. id必须和Mapper接口方法名一致 -->
    <!-- 3. parameterType必须和接口方法参数类型一致 -->
    <!-- 4. resultType必须和接口方法返回值类型一致 -->
    <!-- 根据id查询用户 -->
    <select id="queryUserById" parameterType="int" resultType="UserEntity">
      select * from t_user where id = #{id}
   </select>

</mapper>

 

思考:

我确定UserMapper.xml中的namespace路径,以及方法名称,参数类型,及字段名称都是对的。

于是我在SqlMapConfig.xml文件加载 UserMapper.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <mappers>
        <mapper resource="/mybatis/mapper/UserMapper.xml" />
    </mappers>
</configuration>

这样,再启动,发现是没有问题的,因为在spring文件中加载了 SqlMapConfig.xml,在SqlMapConfig.xml 加载了UserMapper.xml,这样启动没有问题,说明 UserMapper.xml 是没有问题的,那就是项目没有加载到 UserMapper.xml文件。

 

 

于是,我在spring文件中,配置加载所有的mapper.xml文件,再启动发现是可以访问的。

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource" />

        <!-- 加载mybatis的全局配置文件 -->
<!--
        <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" />
-->

        <!-- 加载mybatis的mapper.xml文件 -->
        <property name="mapperLocations" value="classpath:mybatis/mapper/*.xml" />

        <!-- 配置实体类型别名的扫描包 -->
        <property name="typeAliasesPackage" value="com.itcast.entity"></property>
    </bean>

 

于是,我发现了我的问题,之前我在spring文件中加载了 SqlMapConfig.xml,但是SqlMapConfig.xml 是空的,没有加载UserMapper.xml文件,所以找不到对应的mapper.xml文件,我一直以为只要mapper.xml中namespace配置了mapper.java的全路径,就会自动加载mapper.xml文件,其实不是这样的,namespace的全路径,是确保mapper.xml文件可以找到对应的mapper.java文件,而不是spring会自动加载mapper.xml文件。

 

所以,只要在spring的配置文件中,配置加载mapper.xml文件就可以了,SqlMapConfig.xml既然没有定义内容,就可以直接删除了。

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource" />

        <!-- 加载mybatis的mapper.xml文件 -->
        <property name="mapperLocations" value="classpath:mybatis/mapper/*.xml" />

        <!-- 配置实体类型别名的扫描包 -->
        <property name="typeAliasesPackage" value="com.itcast.entity"></property>
    </bean>

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐