Mybatis中mapper.xml文件无法编译到target目录下的问题

本文介绍了解决SpringBoot项目中使用MyBatis时遇到的映射文件未找到的问题。主要原因是XML映射文件放置位置不当,导致编译时未能将其包含在内。文中提供了修改POM文件及配置文件的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.community.mapper.DiscussPostMapper.selectDiscussPostRows

问题:

springboot项目使用 XxxMapper接口同目录下的XxxMapper.xml 时,并且没有指定XxxMapper.xml 映射文件的位置,启动项目执行对象方法时就会报以上错误。
在这里插入图片描述

原因:

这是因为我们将 XxxMapper.xml 映射文件定义在了 src.main.java 目录下,而不是 resources 目录下,这样在编译的时候是不会将 src.main.java 目录下 XxxMapper.xml 映射文件编译到 target 目录中,那么程序在执行过程中去 target 目录中找寻需要的文件时,就会找不到,进而报以上错误。

解决办法:

首先排除 mapper.java 和 mapper.xml 文件之间的定义、关联问题。
比如:
1.是否在XxxMapper.java文件上使用了注解@Mapper 或者 在启动类上扫描了Mapper类 @MapperScan(“com.zsh.mapper”)

2.XxxMapper.xml文件中的namespace是否正确指向到XxxMapper.java类的位置 【】

3.注意被调用的方法名在XxxMapper.java中和XxxMapper.xml中的id保持一致性

4.注意XxxMapper.java在被调用的地方需要注入 @Autowired

1、pom.xml

在pom文件中:
1)如果没有手动在 <build></build> 标签中指定 <resources></resources> 使特定文件编译到target中,springboot项目默认会将 src/main/resources 目录下的文件编译到target中;
2)如果在pom文件中以 <resources></resources> 的形式在 <build></build> 标签里手动指定了 src/main/resources 目录以外的文件,则需要我们再手动指定一下 src/main/resources 目录下的文件,否则不会将src/main/resources目录下的文件编译到target中。

现在,我们需要将 src/main/main 目录下的 .xml文件 编译到target中,需要在pom文件中增加一下代码

<build>
	<resources>
		<!-- src/main/resources目录下的所有文件 -->
		<resource>
	        <directory>src/main/resources</directory>
	    </resource>
	    
	    <!-- src/main/java目录下的xml文件,也就是我们需要的 XxxMapper.xml 映射文件 -->
	    <resource>
	        <directory>src/main/java</directory>
	        <includes>
	            <include>**/*.xml</include>
	        </includes>
	        <filtering>true</filtering>
	    </resource>
	</resources>
</build>
2、在application.properties 或 application.yaml 指定mybatis映射文件的classpath
mybatis:
  mapper-locations: classpath:com/community/mapper/**/*.xml

在这里插入图片描述

<think>好的,我现在要解决用户关于MyBatis-Plus项目中mapper.xml文件存放位置的问题。首先,我需要回顾一下MyBatisMyBatis-Plus的基本知识,确保自己理解正确。 用户提到的引用中有几个关键点。引用[1]和[2]提到mapper-locations配置项,通常是在application.yml或application.properties中设置。例如,classpath:mapper/*.xml或者更具体的路径如classpath:com/xyxy/srb/core/mapper/xml/*.xml。这说明配置文件的位置需要与这个路径匹配。 引用[3]指出MyBatis-Plus可以不用写mapper.xml,但用户显然需要用到自定义SQL,所以必须配置。而引用[4]提到了xml文件中的配置问题,但用户的问题是关于存放位置,可能相关但次要。 接下来,我需要确定常见的存放位置。传统MyBatis项目通常将mapper.xml放在src/main/resources下的对应包路径,比如resources/mapper目录。而在Maven或Gradle项目中,src/main/java下的xml文件默认不会被复制到classpath,除非特别配置。但用户引用[2]提到有人将mapper.xml放在src/main/java目录下,这可能通过配置pom.xml的resources插件实现,不过这可能引发问题,需要确认是否正确。 最佳实践应该是什么?根据官方文档或社区推荐,通常建议将xml文件放在resources目录下的对应包结构中,这样构建工具会自动包含它们。例如,resources/com/example/mapper/xxx.xml,并在配置中指定mapper-locations: classpath*:com/example/mapper/**/*.xml。 同时,需要考虑到多模块项目的情况,如果模块结构复杂,可能需要使用classpath*:来确保所有模块的xml文件都被扫描到。 此外,需要注意yml配置中的路径是否正确,比如是否使用了正确的通配符,路径分隔符是否使用/而不是.等。 可能的错误情况包括:路径配置错误导致xml文件未被扫描到,文件放置位置错误导致编译后不存在于target/classes目录,或文件名、命名空间与Mapper接口不匹配。 最后,总结步骤:确定存放位置(resources目录下的对应包结构),正确配置mapper-locations,验证构建后的文件是否被正确打包,检查日志是否有加载失败的提示。</think>在MyBatis-Plus项目中,$mapper.xml$ 文件的存放位置需遵循以下最佳实践: --- ### 1. **存放路径的两种常见方式** #### **方式一:`src/main/resources` 目录下** - **推荐路径**:`src/main/resources/mapper/*.xml` 或按包结构分类:`src/main/resources/com/example/mapper/*.xml` - **配置示例**(在 `application.yml` 中): ```yaml mybatis-plus: mapper-locations: classpath:mapper/*.xml ``` 若按包结构存放: ```yaml mybatis-plus: mapper-locations: classpath*:com/example/mapper/**/*.xml ``` - **优势**:Maven/Gradle默认会将 `resources` 目录下的文件打包到 `classpath`,无需额外配置[^2][^3]。 #### **方式二:`src/main/java` 目录下** - **路径示例**:`src/main/java/com/example/mapper/xml/*.xml` - **配置示例**: ```yaml mybatis-plus: mapper-locations: classpath*:com/example/mapper/xml/*.xml ``` - **关键步骤**:需在 `pom.xml` 中添加配置,确保 XML 文件编译到 `target/classes`: ```xml <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build> ``` - **风险**:可能导致 Java 代码和 XML 文件混杂,降低可维护性[^2]。 --- ### 2. **最佳实践建议** 1. **优先选择 `resources` 目录** 将 XML 文件Java 代码分离,避免路径配置冲突。 2. **使用通配符 `classpath*:`** 在多模块项目中确保扫描到所有路径,例如: ```yaml mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml ``` 3. **检查编译后的 `target/classes`** 确保 XML 文件最终出现在 `target/classes/mapper` 或对应包路径中[^4]。 --- ### 3. **常见问题排查** - **报错 “Invalid bound statement (not found)”** 通常由 XML 文件未被扫描到或命名空间与 Mapper 接口不匹配导致[^4]。 - **路径配置错误示例** 错误:`classpath:com.example.mapper/*.xml`(使用 `.` 分隔路径) 正确:`classpath:com/example/mapper/*.xml`(使用 `/` 分隔路径) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值