springboot基于mybatis如何实现配置多数据源

  介绍

springboot基于mybatis如何实现配置多数据源?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源。

代码结构:

 springboot基于mybatis如何实现配置多数据源

1) DatabaseType列出所有的数据源的关键——关键

2) DatabaseContextHolder是一个线程安全的DatabaseType容器,并提供了向其中设置和获取DatabaseType的方法

3) DynamicDataSource继承AbstractRoutingDataSource并重写其中的方法determineCurrentLookupKey(),在该方法中使用DatabaseContextHolder获取当前线程的DatabaseType

4) MyBatisConfig中生成2个数据源数据源的bean——价值

5) MyBatisConfig中将1)和4)组成的键-值对写入到DynamicDataSource动态数据源的targetDataSources属性(当然,同时也会设置2个数据源其中的一个为DynamicDataSource的defaultTargetDataSource属性中)

6)将DynamicDataSource作为初级数据源注入到SqlSessionFactory的数据源属性中去,并且该数据源作为transactionManager的入参来构造DataSourceTransactionManager

7)使用的时候,在dao层或服务层先使用DatabaseContextHolder设置将要使用的数据源键,然后再调用映射层进行相应的操作,建议放在dao层去做(当然也可以使用spring aop +自定注解去做)

注意:在映射层进行操作的时候,会先调用determineCurrentLookupKey()方法获取一个数据源(获取数据源:先根据设置去targetDataSources中去找,若没有,则选择defaultTargetDataSource),之后在进行数据库操作。

, 1,假设有两个数据库,配置如下

应用程序。属性

 #第一个数据源
  jdbc。driverClassName=com.mysql.jdbc.Driver
  jdbc。url=jdbc: mysql://xxx: 3306/mytestdb& # 63; zeroDateTimeBehavior=convertToNull&音箱;useUnicode=true&音箱;characterEncoding=utf - 8
  jdbc。用户名=根
  jdbc。密码=123
  
  #第二个数据源
  jdbc2。driverClassName=com.mysql.jdbc.Driver
  jdbc2。url=jdbc: mysql://xxx: 3306/mytestdb2& # 63; zeroDateTimeBehavior=convertToNull&音箱;useUnicode=true&音箱;characterEncoding=utf - 8
  jdbc2。用户名=根
  jdbc2。密码=123 

说明:在之前的配置的基础上,只增加了上述的第二个数据源只

2, DatabaseType

包com.xxx.firstboot.common.datasource;/* *
  *列出所有的数据源关键(常用数据库名称来命名)
  *注意:
  * 1)这里数据源与数据库是一对一的
  * 2)DatabaseType中的变量名称就是数据库的名称
  */公共enum DatabaseType {
  mytestdb, mytestdb2
  }

作用:列举数据源的关键。

3, DatabaseContextHolder

包com.xxx.firstboot.common.datasource;/* *
  *作用:
  * 1,保存一个线程安全的DatabaseType容器
  */公开课DatabaseContextHolder {
  私有静态最终ThreadLocal,contextHolder=new ThreadLocal<的在();
  
  公共静态孔隙setDatabaseType (DatabaseType类型){
  contextHolder.set(类型);
  }
  
  公共静态DatabaseType getDatabaseType () {
  返回contextHolder.get ();
  }
  }

作用:构建一个DatabaseType容器,并提供了向其中设置和获取DatabaseType的方法

4, DynamicDataSource

包com.xxx.firstboot.common.datasource;
  
  进口org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;/* *
  *动态数据源(需要继承AbstractRoutingDataSource)
  */公开课DynamicDataSource延伸AbstractRoutingDataSource {
  保护对象determineCurrentLookupKey () {
  返回DatabaseContextHolder.getDatabaseType ();
  }
  }

作用:使用DatabaseContextHolder获取当前线程的DatabaseType 

5, MyBatisConfig

包com.xxx.firstboot.common;
  
  进口java.util.HashMap;
  进口java.util.Map;
  进口java.util.Properties;
  
  进口javax.sql.DataSource;
  
  进口org.apache.ibatis.session.SqlSessionFactory;
  进口org.mybatis.spring.SqlSessionFactoryBean;
  进口org.mybatis.spring.annotation.MapperScan;
  进口org.springframework.beans.factory.annotation.Autowired;
  进口org.springframework.beans.factory.annotation.Qualifier;
  进口org.springframework.context.annotation.Bean;
  进口org.springframework.context.annotation.Configuration;
  进口org.springframework.context.annotation.Primary;
  进口org.springframework.core.env.Environment;
  进口org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  进口org.springframework.jdbc.datasource.DataSourceTransactionManager;
  
  进口com.alibaba.druid.pool.DruidDataSourceFactory;
  进口com.xxx.firstboot.common.datasource.DatabaseType;
  进口com.xxx.firstboot.common.datasource.DynamicDataSource;/* *
  * springboot集成mybatis的基本入口1)创建数据源(如果采用的是默认的tomcat jdbc数据源,则不需要)
  * 2)创建SqlSessionFactory 3)配置事务管理器,除非需要使用事务,否则不用配置
  */@ configuration//该注解类似于春天配置文件
  @MapperScan (basePackages=癱om.xxx.firstboot.mapper")
  公开课MyBatisConfig {
  
  @ autowired
  私人环境env;/* *
  *创建数据源(数据源的名称:方法名可以取为XXXDataSource (), XXX为数据库名称,该名称也就是数据源的名称)
  */@ bean
  公共数据源myTestDbDataSource()抛出异常{
  属性道具=new属性();
  props.put (“driverClassName" env.getProperty (“jdbc.driverClassName"));
  props.put (“url" env.getProperty (“jdbc.url"));
  props.put (“username" env.getProperty (“jdbc.username"));
  props.put (“password" env.getProperty (“jdbc.password"));
  返回DruidDataSourceFactory.createDataSource(道具);
  }
  
  @ bean
  公共数据源myTestDb2DataSource()抛出异常{
  属性道具=new属性();
  props.put (“driverClassName" env.getProperty (“jdbc2.driverClassName"));
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

springboot基于mybatis如何实现配置多数据源