问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

MyBatis-Plus多模块项目Mapper.xml加载问题排查与解决方案

创作时间:
作者:
@小白创作中心

MyBatis-Plus多模块项目Mapper.xml加载问题排查与解决方案

引用
1
来源
1.
https://www.cnblogs.com/little-nobody/p/18243764

在多模块项目中使用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

这里的msMappedStatement对象,通过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文件。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号