zoukankan      html  css  js  c++  java
  • springboot2.x集成mybatis连接多数据源

    有时候项目处理的数据的时候数据都存在不同的数据库里面,这个时候就需要我们自己配置其他的数据源了,这里我使用的是Spring boot2.3.7的版本

    1、引入依赖

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.2</version>
    </dependency>
     
    <!-- 阿里巴巴连接驱动 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.13</version>
    </dependency>

    2、配置文件配置数据源

    #数据源配置
    #连接池的类型
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    #连接驱动
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    #主数据库
    spring.datasource.url=jdbc:mysql://ip:端口/数据库名?serverTimezone=Asia/Shanghai
    spring.datasource.username=xxx
    spring.datasource.password=xxx
    #从数据库(可以有多个从数据源)
    spring.datasource.druid.slave.url=jdbc:mysql://ip:端口/数据库名?serverTimezone=Asia/Shanghai
    spring.datasource.druid.slave.username=xxx
    spring.datasource.druid.slave.password=xxx
    #初始大小
    spring.datasource.druid.initial-size=1
    #最大连接数
    spring.datasource.druid.max-active=100
    #最小空闲连接数
    spring.datasource.druid.min-idle=10
    #配置获取连接等待超时的时间
    spring.datasource.druid.max-wait=60000
    spring.datasource.druid.default-auto-commit=true
    #每个连接大小的MAX池准备
    spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20

    3、查看项目结构

    4、配置主数据源

    import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
    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.boot.context.properties.ConfigurationProperties;
    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;
    
    /**
     * @Author qt
     * @Date 2021/3/10
     * @Description 配置主数据源
     */
    
    @Configuration
    @MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")
    public class MasterDataSourceConfig {
        static final String PACKAGE = "com.xxx.xxx.dao.master";
        static final String MAPPER_LOCATION = "classpath:mapper/master/*.xml";
    
        @ConfigurationProperties("spring.datasource.druid.master")
        @Bean(name = "masterDataSource")
        public DataSource masterDataSource() {
            return DruidDataSourceBuilder.create().build();
        }
    
        @Bean(name = "masterTransactionManager")
        @Primary //设置主数据库
        public DataSourceTransactionManager masterTransactionManager() {
            return new DataSourceTransactionManager(masterDataSource());
        }
    
        @Bean(name = "masterSqlSessionFactory")
        @Primary //设置主数据库
        public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
                throws Exception {
            final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
            sessionFactory.setDataSource(masterDataSource);
            sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                    .getResources(MasterDataSourceConfig.MAPPER_LOCATION));
            return sessionFactory.getObject();
        }
    
    }

    5、配置从数据源(可有多个从数据源)

    import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
    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.boot.context.properties.ConfigurationProperties;
    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;
    
    /**
     * @Author qt
     * @Date 2021/3/10
     * @Description 从数据源配置
     */
    
    @Configuration
    @MapperScan(basePackages = SlaveDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "slaveSqlSessionFactory")
    public class SlaveDataSourceConfig {
        static final String PACKAGE = "com.xxx.xxx.dao.slave";
        static final String MAPPER_LOCATION = "classpath:mapper/slave/*.xml";
    
        @ConfigurationProperties("spring.datasource.druid.slave")
        @Bean(name = "slaveDataSource")
        public DataSource slaveDataSource() {
            return DruidDataSourceBuilder.create().build();
        }
    
        @Bean(name = "slaveTransactionManager")
        public DataSourceTransactionManager slaveTransactionManager() {
            return new DataSourceTransactionManager(slaveDataSource());
        }
    
        @Bean(name = "slaveSqlSessionFactory")
        public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource slaveDataSource)
                throws Exception {
            final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
            sessionFactory.setDataSource(slaveDataSource);
            sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                    .getResources(SlaveDataSourceConfig.MAPPER_LOCATION));
            return sessionFactory.getObject();
        }
    }

    6、 测试从不同数据源获取不同数据库里面的数据

    @Resource
    private UserMasterDao userMasterDao;
    @Resource
    private UserSlaveDao userSlaveDao;
    
    @Test
    public void mainTest() {
      User userMaster = userMasterDao.getMasterUserById("456");
      System.out.println("主数据库===>:" + JSON.toJSONString(userMaster));
      User userSlave = userSlaveDao.getSlaveUserById("123");
      System.out.println("从数据库===>:" + JSON.toJSONString(userSlave));
    }

    总结:实践是检验真理的唯一标准,亲测可用。

    参考:https://www.pianshen.com/article/7085261564/

  • 相关阅读:
    codeforce 1478B B. Nezzar and Lucky Number 找规律 打表 C
    codeforce 1478C C. Nezzar and Symmetric Array 模拟 认真写 C
    Ansible自动化入门
    多线程执行传值
    js 文本框根据开始结束符号控制输入内容(IE)
    update where in 子查询的梗
    Qt中的QThread:使用QSemaphore进行多线程数据同步
    linux服务器下CPU爆满
    linux下磁盘爆满问题排查
    每日一题(算法)
  • 原文地址:https://www.cnblogs.com/qiantao/p/14518460.html
Copyright © 2011-2022 走看看