MyBatis-Plus多模块项目Mapper.xml加载问题排查与解决方案
MyBatis-Plus多模块项目Mapper.xml加载问题排查与解决方案
在多模块项目中使用MyBatis-Plus时,可能会遇到Mapper.xml文件加载不全的问题。本文详细记录了一个关于"Invalid bound statement (not found)"异常的排查过程,最终发现解决方案在于配置文件中
mybatis-plus.mapper-locations
的正确设置。
背景
在一个多模块的项目中,每个模块都有自己的Mapper.xml文件。但在执行SQL查询时,MyBatis却抛出了"Invalid bound statement (not found)"的异常。
排查过程
检查Mapper扫描配置
首先检查Mapper扫描是否正确配置。在Spring Boot启动类中,使用通配符方式匹配Mapper路径:
通过测试发现,只有第一个模块下的两个Mapper的自定义查询方法能够正常映射,其他模块的Mapper都会报同样的异常。这说明MyBatis确实没有扫描到全部的Mapper.xml文件。
源码调试
为了定位问题,直接从异常堆栈信息开始调试源码:
ms == null
这里的ms
是MappedStatement
对象,通过resolveMappedStatement
方法获取。进一步调试发现,configuration.hasStatement(statementId)
返回false,说明配置中没有找到对应的语句。
继续追踪到buildAllStatements
方法,发现所有映射语句都存储在mappedStatements
中:
通过设置断点观察映射过程,发现mapperLocations
只包含了meeting模块下的两个Mapper.xml文件,而其他模块的Mapper.xml文件并未被加载。
配置分析
继续向上追踪mapperLocations
的来源,发现它是由MybatisPlusProperties
类注入的。在配置文件中搜索mybatis-plus
相关配置,最终发现问题出在mybatis-plus.mapper-locations
的配置上。
解决方案
要让多个模块中的Mapper.xml文件都被正确加载,需要将配置文件中的mybatis-plus.mapper-locations
设置为:
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
这样配置后,重启应用并执行相关方法,问题得以解决。
结论
在多模块项目中使用MyBatis-Plus时,如果遇到Mapper.xml文件加载不全的问题,需要确保mybatis-plus.mapper-locations
配置以classpath*:
开头,这样才能正确加载所有模块下的Mapper.xml文件。