SpringBoot+Mybatis配置多數據源詳細筆記

在項目實際開發中會使用到不通的數據來源,項目實踐總結如下:

第一步:在resources目錄下構建application.yml配置文件,配置兩個數據源分別爲druidshow(具體連接根據自己項目而定)。

server:
  port: 8080
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/data?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&autoReconnect=true&failOverReadOnly=false
      username: root
      password: root
      max-idle: 10
      max-wait: 10000
      min-idle: 5
      initial-size: 5
    show:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&autoReconnect=true&failOverReadOnly=false
      username: root
      password: root
      max-idle: 10
      max-wait: 10000
      min-idle: 5
      initial-size: 5
mapper:
  mappers:
    - tk.mybatis.mapper.common.Mapper
  not-empty: true
  identity: MYSQL
#mybatis:
#  mapper-locations: classpath:mapper/*.xml
#  type-aliases-package: com.xzl.model.entity
pagehelper:
  helperDialect: mysql
  reasonable: true
  supportMethodsArguments: true
  params: count=countSql
logging:
  level:
    com.xzl.mapper: debug

第二步:構建配置文件DruidDataSourceConfigShowDataSourceConfig,加載兩個配置數據源。
1.DruidDataSourceConfig文件內容


import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
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
// 掃描 Mapper 接口並容器管理
@MapperScan(basePackages = DruidDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "druidSqlSessionFactory")
public class DruidDataSourceConfig {
    // 精確到 druid 目錄,以便跟其他數據源隔離
    static final String PACKAGE = "com.xzl.mapper.druid";
    static final String MAPPER_LOCATION = "classpath:mapper/druid/*.xml";

    @Value("${spring.datasource.druid.url}")
    private String url;

    @Value("${spring.datasource.druid.username}")
    private String user;

    @Value("${spring.datasource.druid.password}")
    private String password;

    @Value("${spring.datasource.druid.driver-class-name}")
    private String driverClass;

    @Bean(name = "druidDataSource")
    @Primary
    public DataSource druidDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean(name = "druidTransactionManager")
    @Primary
    public DataSourceTransactionManager druidTransactionManager() {
        return new DataSourceTransactionManager(druidDataSource());
    }

    @Bean(name = "druidSqlSessionFactory")
    @Primary
    public SqlSessionFactory druidSqlSessionFactory(@Qualifier("druidDataSource") DataSource druidDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(druidDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(DruidDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
 }

2.ShowDataSourceConfig文件內容


import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
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
// 掃描 Mapper 接口並容器管理
@MapperScan(basePackages = ShowDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "showSqlSessionFactory")
public class ShowDataSourceConfig {
    // 精確到 show 目錄,以便跟其他數據源隔離
    static final String PACKAGE = "com.xzl.mapper.show";
    static final String MAPPER_LOCATION = "classpath:mapper/show/*.xml";

    @Value("${spring.datasource.show.url}")
    private String url;

    @Value("${spring.datasource.show.username}")
    private String user;

    @Value("${spring.datasource.show.password}")
    private String password;

    @Value("${spring.datasource.show.driver-class-name}")
    private String driverClass;

    @Bean(name = "showDataSource")
    @Primary
    public DataSource showDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean(name = "showTransactionManager")
    @Primary
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(showDataSource());
    }

    @Bean(name = "showSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("showDataSource") DataSource showDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(showDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(ShowDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

第三步:創建上面步驟中配置的數據隔離包和文件夾(MAPPER_LOCATIONPACKAGE指定地址文件),項目整體結構如下圖:
在這裏插入圖片描述
最後一步:需要注意SpringBoot默認會去開啓數據源配置,我們需要在啓動類上面加上關閉自動開啓的配置。

@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        MybatisAutoConfiguration.class})
@EnableAsync
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application .class, args);
    }

}

到此結束。

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