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);
    }

}

到此结束。

发布了22 篇原创文章 · 获赞 9 · 访问量 7645

猜你喜欢

转载自blog.csdn.net/qq_35719898/article/details/104027457