
一、MyBatis 的默认 Mapper XML 文件路径默认情况下MyBatis 在启动时会扫描classpath*:/mapper/**/*.xml也就是说默认在resources 目录下文件夹名通常叫mapper可以有多级子目录所有.xml文件都会被扫描。举例默认结构标准项目目录推荐写法src └─ main ├─ java │ └─ com/itheima/mapper/ArticleMapper.java └─ resources └─ mapper ├─ ArticleMapper.xml ├─ CategoryMapper.xml └─ UserMapper.xml配置文件application.yml中默认就会识别mybatis: mapper-locations: classpath:/mapper/**/*.xml type-aliases-package: com.itheima.pojo1-1、解释一下 classpathclasspath:指打包后target/classes中的根路径resources 下的所有文件都会自动复制到 target/classes而 java 下的源码.java编译后只有 .class 文件所以如果你把 xml 放在 java 里MyBatis 默认扫描不到。1、 验证路径的方法你可以在启动日志中搜索Loading XML resource: mapper/ArticleMapper.xml如果能看到类似日志说明加载成功。如果报错Invalid bound statement (not found)说明 xml 没被扫描到要么路径不在 classpath要么 mapper-locations 配置不对。2、对比总结项目结构是否能默认识别原因✅resources/mapper/*.xml是默认 classpath 路径✅resources/com/itheima/mapper/*.xml是仍在 classpath 下⚠️java/com/itheima/mapper/*.xml否不在 classpath需修改 pom✅java/com/itheima/mapper/xml/*.xml可以配合 pom mapper-locations二、一一对应的包路径镜像问题不是说resources下的文件路径要和main/java中的一样吗也就是说com/itheima/mapper/ArticleMapper.java 对应 com/itheima/mapper/ArticleMapper.xml你说的这种“一一对应的包路径镜像”是常见约定但不是硬性要求。MyBatis 绑定Mapper 接口 ↔ XML真正靠的是这两点XML 的mappernamespace必须等于接口的全限定名mapper namespacecom.itheima.mapper.ArticleMapper select idlist.../select /mapperXML 要能被 MyBatis 扫描到在 classpath 且被 mapper-locations 匹配因此XML 放哪里都行只要满足上面两点。之所以很多项目把 XML 放成与 Java 包路径镜像是为了好找、IDE 插件如 MyBatisX能跳转、避免多人协作混乱。1、两种常见放置方式方式 A默认/推荐resources/mapper/**.xml目录src/main/resources/mapper/ArticleMapper.xmlSpring Boot Starter 默认就会扫classpath*:/mapper/**/*.xml一般不用额外配置。方式 B镜像 Java 包路径resources/com/itheima/mapper/**.xml目录src/main/java/com/itheima/mapper/ArticleMapper.java src/main/resources/com/itheima/mapper/ArticleMapper.xml需要显式指定扫描路径否则默认的/mapper/**/*.xml匹配不到mybatis: mapper-locations: classpath*:com/itheima/mapper/*.xml type-aliases-package: com.itheima.pojo仍需保证mappernamespacecom.itheima.mapper.ArticleMapper。2、常见误区澄清❌ “必须放 resources 下而且路径必须和 Java 完全一致”→ 不必须一致只是约定。关键是namespace 匹配mapper-locations 能扫到。❌ “只要在 java 目录里和接口放一起就行”→ 直接放src/main/java下的 XML不会自动进入 classpath。如果一定要放在java目录里需在pom.xml里把**/*.xml当资源打包。3、对比理解放置方案目录例子mapper-locations写法需改 pom默认方案resources/mapper/ArticleMapper.xml默认即可classpath*:/mapper/**/*.xml否镜像 Java 包resources/com/itheima/mapper/ArticleMapper.xmlclasspath*:com/itheima/mapper/*.xml否放到java目录java/com/itheima/mapper/xml/ArticleMapper.xml取决于你想扫哪里✅ 需要把**/*.xml打进资源三、项目结构优化问题我的xml文件不想写在resources里面想和mapper类放在一起比如放在mapper文件夹下的xml文件夹中我要做什么配置吗1、为什么默认要求放在 resources因为MyBatis 默认只会从classpath即resources中加载 XML而src/main/java目录下的.java文件会被编译为.class不会自动包含 XML 文件所以如果你直接把.xml放在java目录下它在运行时会被忽略。换句话说不是 MyBatis 不支持放一起而是默认编译时没有把这些 XML 打包进 classpath。2、解决方案推荐方式方式一修改pom.xml让 Java 下的 XML 一并打包这是最推荐的做法简单、安全。在pom.xml中加入如下配置让src/main/java目录下的 XML 文件也被编译进 classpathbuild resources resource directorysrc/main/java/directory includes include**/*.xml/include /includes /resource resource directorysrc/main/resources/directory /resource /resources /build效果你可以把ArticleMapper.xml放在src/main/java/com/itheima/mapper/xml/ArticleMapper.xml启动项目后MyBatis 就能正确加载到。方式二在application.yml指定 mapper 路径在配置文件中修改路径mybatis: mapper-locations: classpath*:com/itheima/mapper/xml/*.xml type-aliases-package: com.itheima.pojo注意前缀要写成classpath*:路径分隔符/路径要对应编译后的包路径但仍需保证你的 XML 能被打包否则这配置找不到文件。所以通常还是要配合上面第 1 种做法。依旧要修改pom.xml方式三Spring Boot MyBatis-Plus 写法如果用 MP如果你使用的是 MyBatis-Plus Startermybatis-plus-boot-starter可以这样mybatis-plus: mapper-locations: classpath*:com/itheima/mapper/xml/*.xml逻辑一样只是 key 名不同。3、常见错误排坑错误现象可能原因解决办法启动报错Invalid bound statement (not found)XML 没被加载进 classpath用方式①或②修复XML 改名后没生效Maven 缓存未更新执行mvn clean compile配置路径写成反斜杠\Windows 特有问题改成/多模块项目中找不到 XML子模块没配置资源打包子模块也加上resources4、举个最终成品例子结构src └─ main ├─ java │ └─ com/itheima/mapper/ │ ├─ ArticleMapper.java │ └─ xml/ │ └─ ArticleMapper.xml └─ resources └─ application.ymlapplication.ymlmybatis: mapper-locations: classpath*:com/itheima/mapper/xml/*.xml type-aliases-package: com.itheima.pojopom.xmlbuild resources resource directorysrc/main/java/directory includes include**/*.xml/include /includes /resource resource directorysrc/main/resources/directory /resource /resources /build这样运行时XML 会和 class 文件一起被打包MyBatis 就能自动扫描加载。