【问题标题】:Mapped Statements collection does not contain value for mybatis mapperMapped Statements 集合不包含 mybatis mapper 的值
【发布时间】:2016-01-31 08:57:17
【问题描述】:

我是用户 mybatis 和 spring 来创建一些测试网站。现在我在尝试使用 mybatis xml 映射器时遇到了问题。问题类似于“java.lang.IllegalArgumentException:映射语句集合不包含 com.cooldrinker.mybatis.mapper.AdminMapper.getAdminByUsername 的值”

servlet.xml

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

Java 映射器

package com.cooldrinker.mybatis.mapper;

import com.cooldrinker.mybatis.model.Admin;

public interface AdminMapper {
    public Admin getAdminByUsername(String username);
}

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">

<mapper namespace="com.cooldrinker.mybatis.mapper.AdminMapper">
    <select id="getAdminByUsername" parameterType="java.lang.String" resultType="adminResultMap">
        SELECT first_name, last_name, password, username
        FROM admin
        WHERE username = #{username}
    </select>

    <resultMap id="adminResultMap" type="com.cooldrinker.mybatis.model.Admin">
        <result property="firstName" column="first_name" />
        <result property="username" column="last_name"/>
        <result property="password" column="password"/>
        <result property="username" column="username"/>
    </resultMap>
</mapper>

堆栈跟踪

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.cooldrinker.mybatis.mapper.AdminMapper.getAdminByUsername
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

root cause

java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.cooldrinker.mybatis.mapper.AdminMapper.getAdminByUsername
    org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:672)
    org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:507)
    org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:500)
    org.apache.ibatis.binding.MapperMethod.setupCommandType(MapperMethod.java:240)
    org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:71)
    org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:39)
    com.sun.proxy.$Proxy38.getAdminByUsername(Unknown Source)
    com.cooldrinker.mybatis.dao.impl.AdminDaoImpl.getAdminByUsername(AdminDaoImpl.java:24)
    com.cooldrinker.dataservice.service.impl.AdminServiceImpl.getAdminByUsername(AdminServiceImpl.java:26)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    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.invoke(TransactionInterceptor.java:110)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    com.sun.proxy.$Proxy42.getAdminByUsername(Unknown Source)
    com.cooldrinker.controller.AdminLoginController.login(AdminLoginController.java:39)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214)
    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:749)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

【问题讨论】:

  • 确保您的 xml 映射器的名称以“AdminMapper.xml”结尾
  • xml文件位置不需要和接口包在同一路径。它可以在类路径根目录或任何子目录中。最重要的是 mapper namespace 必须等于 interface fullqualified name xml 内容似乎没问题,那么 xml 文件可能根本没有加载。尝试在属性 mapperLocations 中显式引用文件,问题可能与通配符有关

标签: java mysql xml spring mybatis


【解决方案1】:

这种错误是由于 DAO ↔ XML 之间的引用错误

让我在“AdminMapper”和“AdminMapperDAO”中展示 IMPLEMENTS 也许这就是重点。

【讨论】:

    【解决方案2】:

    您可以在mybatis-config.xml 文件中注册您的映射器

    <configuration>
    
      <properties resource="db.dev.properties">
      </properties>
    
        <typeHandlers>
            <package name="com.newtonx.model.typehandlers"/>
        </typeHandlers>
        <environments default="development">
         ...
        </environments>
        <mappers>
          <mapper resource="com/project/model/xml/SomeMapper.xml"/>
          // other mapper here
        </mappers>
        ...
    </configuration>
    

    【讨论】:

      【解决方案3】:

      The three names have to match:

      • interface = com.cooldrinker.mybatis.mapper.AdminMapper.class
      • 映射器文件 = com/cooldrinker/mybatis/mapper/AdminMapper.xml
      • 映射器命名空间 = com.cooldrinker.mybatis.mapper.AdminMapper

      如果它们不匹配,它将不起作用。

      【讨论】:

        猜你喜欢
        • 2014-10-11
        • 1970-01-01
        • 2017-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-10
        • 2011-04-20
        相关资源
        最近更新 更多