解决springboot多模块项目基于.yml整合mybatis出现映射失败问题的两种方式

本文介绍了在springboot多模块项目中,遇到mapper与xml映射失败的问题,提供了两种解决方案:一是将所有*Mapper.xml文件放在入口模块的src/main/resources/xml下,二是将*Mapper.xml文件放在src/main/java的对应包下,并调整yml和pom.xml配置。文中对两种方法进行了比较,推荐第二种方法因其低耦合、高内聚的特性。

        背景:我在学习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的配置,这样层次分明,各个子模块的代码耦合度低,内聚高,以后维护起来也很方便。

 

此文如果有问题,请大家指导分享。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值