SpringBoot 多模块、多数据源项目中Mybatis找不到子模块Mapper的解决办法

本文档介绍了在多数据源环境下,主模块无法扫描到common模块中MyBatis XML映射文件的问题及其解决方案。问题源于配置只扫描了当前模块的classpath,而非所有jar。解决方法是在配置中使用classpath*来扫描所有模块,并在MapperScan中指定common模块的扫描路径,同时更新数据源配置,确保所有mapper文件被正确加载。
摘要由CSDN通过智能技术生成

问题

多数据源下,多模块依赖mybatis扫描不到xml文件,调用mapper接口出现org.apache.ibatis.binding.BindingException问题

方案说明

有一个Maven项目, 里面有common模块和主模块, 其中common模块中有若干个mybatis的mapper和xml, 结果主模块调用其mapper时提示出错, 原因是找不到mapper对应的xml映射关系.

查资料得知, 主模块的application.yml里面,配置mybatis的mapper-locations时, 用的是classpath, 只会扫描当前moduler的class, 而改为classpath*则会扫描所有jar

解决方法

handler 项目有三个数据库master、second、third,handler项目中新增引用common模块的model、dao、mapper

handler项目中新增引用common模块

    <dependencies>
        <dependency>
            <groupId>cn.wxt.common</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    <dependencies>

修改数据源配置

在master数据源上配置:
1.MapperScan 增加 common 模块的扫描路径
2.MAPPER_LOCATION 的classpath增加*扫描所有master,即 “classpath*:mapper/master/*.xml”;

在这里插入图片描述

数据源引用配置 classpath:jdbc.properties
在这里插入图片描述

@Configuration
@PropertySource("classpath:jdbc.properties")
@MapperScan(basePackages = {MasterDataSourceConfig.HANDLER, MasterDataSourceConfig.COMMON}, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {
    //精确到 *.master及公共目录,与second、third数据源隔离
    static final String HANDLER = "cn.wxt.gpsproxy.dao.master";
    static final String COMMON = "cn.wxt.common.dao.master";
    //static final String PACKAGE = "cn.wxt.*.dao.master";
    static final String MAPPER_LOCATION = "classpath*:mapper/master/*.xml";

    @Value("${master.datasource.url}")
    private String url;

    @Value("${master.datasource.username}")
    private String user;

    @Value("${master.datasource.password}")
    private String password;

    @Value("${master.datasource.driverClassName}")
    private String driverClass;

    @Bean(name = "masterDataSource")
    @Primary
    public DataSource masterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean(name = "masterTransactionManager")
    @Primary
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(masterDataSource());
    }

    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(MasterDataSourceConfig.MAPPER_LOCATION));
        sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        return sessionFactory.getObject();
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值