SpringBoot在整合mybatis的mapper文件时容易出现的一个问题。今天由于想把原先放在resource目录下的mapper目录放到java目录中,修改了下mapper路径,结果报出了这个该死的问题搞的我怀疑人生了。下面贴解决思路以及我的最终bug所在...
解决思路
1、检查配置文件中mapper文件配置的包路径是否正确
当然一般包路径配置都不会错,而我就死在这一步,前几天同产品组下有个同事改了我的配置,即
他给我的配置往后移了一位,导致mybatis的上级为spring,可想而知这些配置肯定不会生效,因此永远报找不到绑定的mapper文件...这种坑一时半会还不容易发现...真的想打人...
2、检查mapper文件中的namespace是否与对应接口的全路径一致
3、所调用dao层的方法是否有在对应mapper文件中存在
4、如果方法也存在,且该方法的返回是个List<自定义实体类>,检查返回的resultMap配置是否正确,或者仅配置了resultType
5、如果上述都没问题,检查编译后的目录中是否存在mapper文件,如果没有则在对应模块的pom中加如下依赖,告诉SpringBoot不要去忽略xml文件
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
到此一般就解决成功了,当然今天在解决bug的过程中也信了玄学,比如mapper文件中删除一行空格再保存之类的...
我们打字员要坚信这世界是没有玄学的!!!越是玄学越是简单的bug!互勉!
2023/02/22更新:
修改一个外协项目时又遇到了这个熟悉的问题,这里补充两种解决方式:
1. 也是我这次遇到问题的罪魁祸首,不要使用 SqlSessionFactory,改用 MybatisSqlSessionFactory(一个引入了 Mybatis-plus 的工程竟然没有对应的配置项,框架真的害人,我真的是醉了)
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
{
String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
String mapperLocations = env.getProperty("mybatis.mapperLocations");
String configLocation = env.getProperty("mybatis.configLocation");
typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
VFS.addImplClass(SpringBootVFS.class);
final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
// 设置分页插件
sessionFactory.setPlugins(mybatisPlusInterceptor());
// 设置自动注入配置
GlobalConfig globalConfig = GlobalConfigUtils.defaults();
globalConfig.setMetaObjectHandler(myMetaObjectHandler);
sessionFactory.setGlobalConfig(globalConfig);
return sessionFactory.getObject();
}
2. 检查新加的 mapper 接口是否有被扫描到,即关注下有无 @MapperScan 注解,若有则注意新加的是否在规定的包范围内;若无则需要手动加上 @Mapper 接口