2020.03.06 springboot+mybatis+mysql+sqlserver多數據源

1.前言
項目中本來用的是單一的mysql數據庫,最近增加了一個sqlserver數據庫,在整合的過程中遇到了很多坑,反覆進行調整參考了很多資料不太行,一通騷操作突然好了,疑惑.jpg

2.application-test.yml

spring:
  datasource:
    druid:
      master:
        username: root
        password: root
        jdbc-url: jdbc:mysql://127.0.0.1:3306/aaa?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&autoReconnect=true
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
      cluster:
        driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
        jdbc-url: jdbc:sqlserver://127.0.0.1;databaseName=bbb;
        username: root
        password: root
        type: com.alibaba.druid.pool.DruidDataSource
          thymeleaf:
    prefix: classpath:/templates/
    cache: false
    mode: html
    encoding: utf-8
  devtools:
    restart:
      enabled: true
      additional-paths: src/main/java
mybatis:
#項目中xml文件放在了resources文件下
  mapper-locations: classpath:master/*Mapper.xml,classpath*:/cluster/*Mapper.xml
  type-aliases-package: com.test.

3.MasterDbConfiguration

package com.test.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@Slf4j
@MapperScan(basePackages ={"com.test.mapper.master"} , sqlSessionTemplateRef  = "masterSqlSessionFactory")
public class MasterDbConfiguration {

    /**
     *  主數據源配置信息
     * @return
     */
    @Bean(name = "masterDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.druid.master")
    @Primary
    public DataSource masterDataSource(){
        log.info("主數據源啓動...");
        return DataSourceBuilder.create().build();
    }

    /**
     * 主數據源會話工廠
     * @param dataSource
     * @return
     * @throws Exception
     */
    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource" ) DataSource dataSource) throws Exception {
        try {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            // 如果不寫這裏,會導致 mybatis 出現 invalid bound statement (not found) 的問題
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:master/*Mapper.xml"));
            bean.setTypeAliasesPackage("com.test.pojo");
            bean.setDataSource(dataSource);
            return bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 主數據源事務管理
     * @param dataSource
     * @return
     */
    @Bean(name = "masterTransactionManager")
    @Primary
    public DataSourceTransactionManager masterDataSourceTransactionManager(@Qualifier("masterDataSource") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     *
     * @param sqlSessionFactory
     * @return
     */
    @Bean(name = "masterSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

4.ClusterDbConfiguration

package com.test.interceptor;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;
@Configuration
@Slf4j
@MapperScan(basePackages = {"com.test.service.cluster.clusterMapper"}, sqlSessionFactoryRef = "clusterSqlSessionFactory")
public class ClusterDbConfiguration {

 
    /**
     * 副數據源配置信息
     * @return
     */
    @Bean(name = "clusterDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.druid.cluster")
    public DataSource clusterDataSource(){
        log.info("副數據源啓動...");
        return DataSourceBuilder.create().build();
    }

    /**
     * 副數據源會話工廠
     * @param dataSource
     * @return
     * @throws Exception
     */
    @Bean(name = "clusterSqlSessionFactory")
    public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("clusterDataSource" ) DataSource dataSource) throws Exception {
        try {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            // 如果不寫這裏,會導致 mybatis 出現 invalid bound statement (not found) 的問題
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:cluster/*Mapper.xml"));
            bean.setTypeAliasesPackage("com.test.pojo");
            bean.setDataSource(dataSource);

            return bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 副數據源事務管理
     * @param dataSource
     * @return
     */
    @Bean(name = "clusterTransactionManager")
    public DataSourceTransactionManager clusterDataSourceTransactionManager(@Qualifier("clusterDataSource") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     *
    *  @param sqlSessionFactory
     * @return
     */
    @Bean(name = "clusterSqlSessionTemplate")
    public SqlSessionTemplate clusterSqlSessionTemplate(@Qualifier("clusterSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

5.service層
在這裏插入圖片描述

6.啓動項

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,MybatisAutoConfiguration.class})
@MapperScan(basePackages ={"com.test.service.master.masterMapper","com.test.service.cluster.clusterMapper"})
public class TestApplication {
	public static void main(String[] args) {
		SpringApplication.run(TestApplication .class, args);
	}
}

7.調用方式
和但數據源的方式一樣,該怎麼樣就是怎麼樣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章