繁体   English   中英

MyBatis 无法识别映射器 xml 文件 - 无效的绑定语句(未找到)

[英]MyBatis not recognizing mapper xml file - Invalid bound statement (not found)

当我尝试从数据库中提取数据时出现此类错误。 MyBatis 无法识别我的映射器 xml 文件,其中接口映射器和 xml 映射器具有相同的文件名和相同的目录。 但是,当我使用此注释时,它可以工作@Select("SELECT id, client_number, name, email, health_condition FROM client.data WHERE id = #{id}")我不想使用 @Select 注释但想使用我的映射器 xml 文件代替。 有没有人有任何想法来解决这个问题? 我正在使用 Gradle(最新)、Java15 和 SpringBoot2.4.1

出现意外错误(类型=内部服务器错误,状态=500)。 Invalid bound statement (not found): nutri.api.infrastructure.datasource.client.ClientMapper.getClientById org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): nutri.api.infrastructure.datasource.client.ClientMapper .getClientById at org.apache.ibatis.binding.MapperMethod$SqlCommand.(MapperMethod.java:235) at org.apache.ibatis.binding.MapperMethod.(MapperMethod.java:53) at org.apache.ibatis.binding.MapperProxy .lambda$cachedInvoker$0(MapperProxy.java:115) at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708) at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProx y.java:102) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85) at com.sun.proxy.$Proxy58.getClientById(Unknown Source) at nutri.api.infrastructure.datasource.client .ClientDatasource.getClientById(ClientDatasource.java:18) at nutri.api.infrastructure.datasource.client.ClientDatasource$$FastClassBySpringCGLIB$$fcc24d17.invoke() at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java: 218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework .CglibAopProxy$Cgli bMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org .springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) at nutri.api.infrastructure.datasource.client .ClientDatasource$$EnhancerBySpringCGLIB$$42a63ac2.getClientById() at nutri.api.application.service.ClientService.getClientById(ClientService.java:15) at nutri.api.prese ntation.controller.ClientApiController.get(ClientApiController.java:20) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java :64) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.springframework. web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.Z93F725A 07423FE1C889F448B33D21F46Z:141) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter. java:894) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java: 87) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) 在 org.springframework .web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java :898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service( HttpServlet.java:733) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Z93F725A07423FE1C889F4238B33) 606D118D0F62066E31419FF04CCZ.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter( ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web .filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) 在 org.apache.catal ina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java: 93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain .doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(Characte rEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina .core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97 ) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) 在 org.ZB6EFD606D11810F620466E .catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java :78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) at org.apache.coyote.AbstractProcessorLight. process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) at org.apache.Z1B359D8753858B5 5BEFA0441067AAED3Z.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.base/java.util.concurrent. ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run( TaskThread.java:61) 在 java.base/java.lang.Thread.run(Thread.java:832)

要在 xml 文件中使用映射器的声明,您应该在包含映射器声明的类路径 (/src/main/resources) 中声明配置文件,例如mybatis-config.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>
        <settings>
<!--        <setting name="aggressiveLazyLoading" value="false"/>-->
<!--        <setting name="lazyLoadingEnabled" value="false"/>-->
<!--        <setting name="mapUnderscoreToCamelCase" value="true"/>-->
<!--        <setting name="logImpl" value="SLF4J"/>-->
<!--        <setting name="jdbcTypeForNull" value="NULL"/>-->
<!--        <setting name="callSettersOnNulls" value="true"/>-->
        </settings>
        <typeAliases>
            <!-- Data Transfer Objects -->
        </typeAliases>
    
        <typeHandlers>
    <!--        <typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler"/>-->
        </typeHandlers>
    
        <!-- explicit inclusion of reusable elements -->
        <mappers>
            <mapper resource="yourMapper.xml" />
        </mappers>
    </configuration>

此外,您应该在 SqlSessionFactory bean 中设置配置文件的路径,例如:

@Bean
public SqlSessionFactory sqlSessionFactory(final DataSource dataSource) throws Exception {
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:mybatis-config.xml"));   
    bean.setDataSource(dataSource);

    return bean.getObject();
}

我遇到了类似的问题,一位高级开发人员帮我弄清楚,Clientmapper.xml 文件应该与 ClientMapper Z93F725A07423FE1C8846F448B33D21 接口位于类似的 package 中。

有时,当我们在src/main/resources中创建一个目录为nutri.api.infrastructure.datasource.client时,它会创建一个文件夹名称为"nutri.api.infrastructure.datasource.client"的文件夹。

go 的一种方法是使用 System Explorer 手动创建此文件夹结构,并且可以肯定的是,您还可以检查 Project Structure>Modules并确认它具有分层文件夹结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM