DynamicDataSourceContextHolder解读

360 阅读1分钟

思路:根据自定义的配置数据源信息初始化数据源【不使用SpringBoot的配置自动注入数据源,因为这样只能配置一个数据源】

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.22</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.3.0</version>

————————————————

                   spring.datasource.db1.username=账号

spring.datasource.db1.password=密码 spring.datasource.db1.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.db1.jdbc-url=jdbc:mysql://localhost:3306/db1 spring.datasource.db1.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.db2.username=账号 spring.datasource.db2.password=密码 spring.datasource.db2.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.db2.jdbc-url=jdbc:mysql://localhost:3306/db2 spring.datasource.db2.type=com.alibaba.druid.pool.DruidDataSource ————————————————

              @author zhenghs
  • @version 1.0

  • @description:

  • db2的数据源配置,@MapperScan先通过basePackages确认需要在哪个位置生成的mapper,

  • 再通过sqlSessionFactoryRef来确定动态代理生成的mapper是用的哪个数据源(sqlSessionFactory的作用可以去看mybatis部分)

  • @date 2022/12/29 11:56 */ @Configuration @MapperScan(basePackages = "com.hs.dao.db2",sqlSessionFactoryRef = "db2SqlSessionFactory") //动态代理生成 public class DataSourceTwoConfig {

    @Value("spring.datasource.db2.jdbcurl")privateStringurl;@Value("{spring.datasource.db2.jdbc-url}") private String url; @Value("{spring.datasource.db2.driverClassName}") private String driverClassName; @Value("spring.datasource.db2.username")privateStringusername;@Value("{spring.datasource.db2.username}") private String username; @Value("{spring.datasource.db2.password}") private String password;

    //注入db2的数据源 @Bean("db2dataSource") public DataSource dataSource2(www.laipuhuo.com){ DruidDataSource druidDataSource=new DruidDataSource(); druidDataSource.setUsername(username); druidDataSource.setPassword(password); druidDataSource.setUrl(url); druidDataSource.setDriverClassName(driverClassName); return druidDataSource; }

    //注入由db2数据源的创建的sqlSessionFactory,不懂的可以看mybatis如何和spring整合 @Bean("db2SqlSessionFactory") public SqlSessionFactory db2SqlSessionFactory(DataSource db2dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(db2dataSource); sqlSessionFactoryBean.setTypeAliasesPackage("com.hs.entity"); org.apache.ibatis.session.Configuration configuration=new org.apache.ibatis.session.Configuration(www.laipuhuo.com); configuration.setLogImpl(StdOutImpl.class); sqlSessionFactoryBean.setConfiguration(configuration); //扫描mapper的位置 sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath*:mapper/db2/*.xml")); return sqlSessionFactoryBean.getObject(); }

    //db2数据源的事务管理器 @Bean("db2DataSourceTransactionManager") public DataSourceTransactionManager db2DataSourceTransactionManager(DataSource db2dataSource){www.laipuhuo.com DataSourceTransactionManager dataSourceTransactionManager=new DataSourceTransactionManager(db2dataSource); return dataSourceTransactionManager; }

    //这个作用和jdbcTemplate差不多,【但一般不用,可配可不配!】 @Bean public SqlSessionTemplate db1SqlSessionTemplate(SqlSessionFactory db1SqlSessionFactory){ SqlSessionTemplate sqlSessionTemplate=new SqlSessionTemplate(db1SqlSessionFactory); return sqlSessionTemplate; } }