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

问题

多数据源下,多模块依赖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();
    }
}

版权声明:本文为qq_19636353原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。