spring boot 配置mybatis 多数据源以及遇到的问题

application.yml 里面多数据源的配置

	spring:
	  datasource:
	    db1:
	      username: XXX
	      password: XXXX
	      driver-class-name: com.mysql.jdbc.Driver
	      url: "jdbc:mysql://XXXX:3306/db1?characterEncoding=utf8"
	    db2:
	      username: XXXX
	      password: XXX
	      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
	      url: "jdbc:sqlserver://XXXX:1433;DatabaseName=db2"
	    db3:
	      username: XX
	      password: XXX
	      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
	      url: "jdbc:sqlserver://XXXXX:1433;DatabaseName=db3"

首先读取数据源配置 然后生成 各自的datasource对象

@Configuration
@Slf4j //lombok 
public class MyDataSourceConfigration {

@Primary
@Bean("db1Properties")
@ConfigurationProperties(prefix="spring.datasource.db1")
public DataSourceProperties getDb1DataSourceProperties(){
    log.info("------------读取db1的properties----------");
    return new DataSourceProperties();
}

@Bean("db1DataSource")
@Primary
public DataSource getDb1DataSource(@Qualifier("db1Properties") DataSourceProperties properties){
    log.info("------------生成db1的DataSource----------");
    return properties.initializeDataSourceBuilder().build();
}


@Bean("db2Properties")
@ConfigurationProperties(prefix="spring.datasource.db2")
public DataSourceProperties getDb2DataSourceProperties(){
    log.info("------------读取db2的properties----------");
    return new DataSourceProperties();
}

@Bean("db2DataSource")
public DataSource getDb2DataSource(@Qualifier("db2Properties") DataSourceProperties properties){
    log.info("------------生成db2的DataSource----------");
    return properties.initializeDataSourceBuilder().build();
}
}

;

标记扫描的mapper位置 并且制定解析的sqlsessiontemplate
注意 :以下写法中是getResources not getResource
new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db1/*.xml"));*

@Configuration
@Slf4j
@MapperScan(basePackages = "com.iebt.myspringboottest.mapper.db1",sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class MybatisDataSourceConfigration {

/**
 *
 * 生成  sqlsessionfactory
 *
 */
@Primary
@Bean("db1SqlSessionFactory")
public SqlSessionFactory getDb1SqlSessionFactory(@Qualifier("db1DataSource") DataSource source) throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean =  new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(source);
    sqlSessionFactoryBean.setMapperLocations(
            new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db1/*.xml"));
    return sqlSessionFactoryBean.getObject();
}

/**
 * 生成 sqlsessiontemplate
 */
@Primary
@Bean("db1SqlSessionTemplate")
public SqlSessionTemplate getDb1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory")SqlSessionFactory factory){
    return new SqlSessionTemplate(factory);
}

/**
 *
 * db1 生成事务管理器
 *
 */
@Primary
@Bean("db1TransactionMannager")
public DataSourceTransactionManager getDataSourceTransactionMannager(@Qualifier("db1DataSource")DataSource source){
    return new DataSourceTransactionManager(source);
}

}


@Configuration
@Slf4j
@MapperScan(basePackages = "com.iebt.myspringboottest.mapper.db2",sqlSessionTemplateRef = "db2SqlSessionTemplate")
public class MybatisDataSourceConfigration2 {

/**
 *
 * 生成  sqlsessionfactory
 *
 */

@Bean("db2SqlSessionFactory")
public SqlSessionFactory getdb2SqlSessionFactory(@Qualifier("db2DataSource") DataSource source) throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean =  new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(source);
    sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db2/*.xml"));
    return sqlSessionFactoryBean.getObject();
}

/**
 * 生成 sqlsessiontemplate
 */

@Bean("db2SqlSessionTemplate")
public SqlSessionTemplate getdb2SqlSessionTemplate(@Qualifier("db2SqlSessionFactory")SqlSessionFactory factory){
    return new SqlSessionTemplate(factory);
}

/**
 *
 * db2 生成事务管理器
 *
 */

@Bean("db2TransactionMannager")
public DataSourceTransactionManager getDataSourceTransactionMannager(@Qualifier("db2DataSource")DataSource source){
    return new DataSourceTransactionManager(source);
}
}

后续数据源也是如上的配置即可
需要注意的是 只有一个数据源是primary

配置好后,启动项目

若出现以下问题可以看下解决方案:
1、
class path resource [classpath*:mapper/db1/.xml] cannot be opened because it does not exist
这个的原因是因为我前边写错了 应该是 new PathMatchingResourcePatternResolver().getResources("classpath
:mapper/db1/.xml"));
not
new PathMatchingResourcePatternResolver().getResource("classpath
:mapper/db1/*.xml"));
2、javax.xml.bind.DatatypeConverter
maven导入如下的包即可

<dependency>
	<groupId>javax.xml.bind</groupId>
	<artifactId>jaxb-api</artifactId>
	<version>2.3.0</version>
</dependency>

3、spring boot 启动的时候 有大量的 CONDITIONS EVALUATION REPORT
在你的 application.yml 中或者application.properties 配置

logging:
  level:
    org:
      springframework:
        boot:
          autoconfigure: ERROR

如果以上都配置好了,那就可以了,启动项目试一下吧。
如果你的springboot 没有配置lombok 可以使用 普通的log属性
或者添加lombok依赖注入

若添加lombok 依赖注入后 启动失败
或者找不到lombok 那可能是idea的bug
需要在如下位置改成以下设置
设置—编译器—共享vm:-Djps.track.ap.dependencies=false

在这里插入图片描述

以上配置存在多次重复代码,存在大量冗余,后期有时间再升级一下,今天先记录到这里。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值