背景:我在学习springboot之后,练手接触的都是单模块项目,工作中遇到的小项目也是如此。接下来分享一下采用springboot多模块项目基于.yml整合mybatis的经验。按单模块项目的写法,我们一般都是将*Mapper.xml文件放在src/main/resources下的某个目录下,例如将SysUserMapper.xml放在src/main/resources/xml下;*Mapper.java文件放在src/main/java的某个目录下,例如将SysUserMapper.java放在src/main/java/zondy/repository/mapper下。按单模块项目设计思维,在多模块项目中,每个子模块都将其相应的*Mapper.xml文件放在其src/main/resources/xml下,都将其相应的*Mapper.java文件放在其src/main/java/zondy/repository/mapper下就会发现有问题,除了入口模块(即包含启动类的模块)的*Mapper.java文件和*Mapper.xml文件能映射上,其它子模块却不能映射上。
可能上面问题描述的不是清楚,说白了就是springboot多模块项目基于.yml整合mybatis时,*Mapper.java文件和*Mapper.xml文件不能映射,执行不了sql。原因是因为.yml对mybatis配置不当,接下来我经过网上搜索,得知两种问题解决可行方式,如有不当,请大家指导。
第一种,将所有的*Mapper.xml文件放在包含启动类的入口模块下的src/main/resources/xml中
首先,在启动类上加上扫描各个子模块的*Mapper.java文件存放的包的注解
@MapperScan(basePackages = {"zondy.repository.mapper"})
@SpringBootApplication
@MapperScan(basePackages = {"zondy.repository.mapper"})
@ServletComponentScan
public class ZondyWebApplication {
public static void main(String[] args) {
SpringApplication.run(ZondyWebApplication.class, args);
}
}
然后,将各个子模块的*Mapper.xml文件放在包含启动类的入口模块下的src/main/resources/xml下,各个子模块的*Mapper.java文件还是保留在其src/main/java/zondy/repository/mapper下。
最后,配置.yml整合mybatis,主要是配置存放xml文件的路径:mapperLocations: classpath:xml/*.xml。
## mybatis
mybatis:
typeAliasesPackage: zondy.entity
mapperLocations: classpath:xml/*.xml
## 开启属性驼峰功能
configuration:
map-underscore-to-camel-case: true
见解:在仅有上面的配置情况下,无其他特别配置,将各个子模块的*Mapper.xml文件放在包含启动类的入口模块下的src/main/resources/xml下,*Mapper.java才能映射到相应的*Mapper.xml文件,因为作为入口模块,其仅仅会加载其src/main/resources下的xml文件,并不会去加载其他子模块的。
第二种,将*Mapper.xml文件放在src/main/java/的某个包下,配置.yml和pom.xml文件
首先,在启动类上加上扫描各个子模块的*Mapper.java文件存放的包的注解
@MapperScan(basePackages = {"zondy.repository.mapper"})
@SpringBootApplication
@MapperScan(basePackages = {"zondy.repository.mapper"})
@ServletComponentScan
public class ZondyWebApplication {
public static void main(String[] args) {
SpringApplication.run(ZondyWebApplication.class, args);
}
}
然后,将各个子模块的的*Mapper.xml文件放在其src/main/java/zondy/repository/mapper/xml下,*Mapper.java文件还是保留在其src/main/java/zondy/repository/mapper下。

再次,配置.yml整合mybatis,主要是配置存放xml文件的路径:
mapperLocations: classpath*:zondy/repository/mapper/xml/*.xml
## mybatis
mybatis:
typeAliasesPackage: zondy.entity
mapperLocations: classpath*:zondy/repository/mapper/xml/*.xml
## 开启属性驼峰功能
configuration:
map-underscore-to-camel-case: true
最后,在每个子模块的pom.xml下加上下面一段配置。
<build>
<resources>
<resource>
<!-- 不加此目录,此目录下的mapper.xml文件会被忽略 -->
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<!-- 是否替换资源中的属性-->
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
见解:这种方式是主要为了每个子模块的mapper文件更独立,结构更清晰。在idea开发(其他开发工具不详)下,默认忽略掉存放java代码的java包下的其他类型的文件(包括.properties、.xml等),所以需要在每个子模块下的pom.xml配置读取.xml文件的代码。
两种方式的比较
在springboot多模块项目下,个人觉得第二种方式比较适用一点。第一种方式没那么多配置,将所有*Mapper.xml文件放在同一个地方,适用于模块和*Mapper.xml文件没那么多的项目中。第二种方式主要是多了每个子模块pom.xml的配置,这样层次分明,各个子模块的代码耦合度低,内聚高,以后维护起来也很方便。
此文如果有问题,请大家指导分享。
本文介绍了在springboot多模块项目中,遇到mapper与xml映射失败的问题,提供了两种解决方案:一是将所有*Mapper.xml文件放在入口模块的src/main/resources/xml下,二是将*Mapper.xml文件放在src/main/java的对应包下,并调整yml和pom.xml配置。文中对两种方法进行了比较,推荐第二种方法因其低耦合、高内聚的特性。
9961

被折叠的 条评论
为什么被折叠?



