Spring Boot + MyBatis + Mysql 实现多数据源

2 篇文章 0 订阅
1 篇文章 0 订阅

Spring Boot + MyBatis + Mysql 实现多数据源

说明

  • 通过不同的数据源扫描不同的mapper实现

依赖及配置

  • 添加依赖 pom.xml

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    
  • application.yml

    spring:
      application:
        name: test
    server:
      address: 127.0.0.1
      port: 9090
      
    # mybatis
    mybatis:
      mapper-locations: classpath:com/test/mapping/**/*Mapper.xml
      type-aliases-package: com.test.model.*
    
    # 数据源1  
    datasourceone:
      jdbc-url: jdbc:mysql://ip:3306/dataone?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false
      username: xxxx
      password: xxxx
      driver-class-name: com.mysql.jdbc.Driver
    
    # 数据源2
    datasourcetwo:
      jdbc-url: jdbc:mysql://ip:3306/datatwo?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false
      username: xxxx
      password: xxxx
      driver-class-name: com.mysql.jdbc.Driver
    

多数据源配置

  • java

    package com.test.config;
    
    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 javax.sql.DataSource;
    
    /**
     * @author xxx
     * @create 2018/08/06 11:16
     * @description 多数据源配置
     */
    @Configuration
    public class DataSourceConfig {
    
        @Bean(name = "dbOneDataSource")
        @Primary
        @ConfigurationProperties(prefix = "datasourceone")
        public DataSource dbOneDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "dbTwoDataSource")
        @ConfigurationProperties(prefix = "datasourcetwo")
        public DataSource dbTwoDataSource() {
            return DataSourceBuilder.create().build();
        }
    
    }
    

mybatis多数据源

  • java

    package com.test.config;
    
    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.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    
    import javax.annotation.Resource;
    import javax.sql.DataSource;
    
    /**
     * @author xxx
     * @create 2018/08/06 11:19
     * @description mybatis多数据源
     */
    @Slf4j
    public class MyBatisConfig {
    
        /**
         * 第一个数据库 SqlSessionFactory && SqlSessionTemplate 创建
         */
        @Configuration
        @MapperScan(basePackages = {"com.test.mapper.one"},
                    sqlSessionFactoryRef = "sqlSessionFactoryOne",
                    sqlSessionTemplateRef = "sqlSessionTemplateOne")
        public static class DBOne {
            @Resource
            DataSource dbOneDataSource;
    
            @Bean
            public SqlSessionFactory sqlSessionFactoryOne() throws Exception {
                log.info("sqlSessionFactoryOne 创建成功。");
                SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
                factoryBean.setDataSource(dbOneDataSource);
                factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/test/mapping/one/*Mapper.xml"));
                return factoryBean.getObject();
            }
    
            @Bean
            public SqlSessionTemplate sqlSessionTemplateOne() throws Exception {
                SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryOne()); // 使用上面配置的Factory
                return template;
            }
        }
    
    
        /**
         * 第二个数据库 SqlSessionFactory && SqlSessionTemplate 创建
         */
        @Configuration
        @MapperScan(basePackages = {"com.test.mapper.two"},
                    sqlSessionFactoryRef = "sqlSessionFactoryTwo",
                    sqlSessionTemplateRef = "sqlSessionTemplateTwo")
        public static class DBTwo {
            @Resource
            DataSource dbTwoDataSource;
    
            @Bean
            public SqlSessionFactory sqlSessionFactoryTwo() throws Exception {
                log.info("sqlSessionFactoryTwo 创建成功。");
                SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
                factoryBean.setDataSource(dbTwoDataSource);
                factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/test/mapping/two/*Mapper.xml"));
                return factoryBean.getObject();
            }
    
            @Bean
            public SqlSessionTemplate sqlSessionTemplateTwo() throws Exception {
                SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryTwo()); // 使用上面配置的Factory
                return template;
            }
        }
    
    }
    

使用

  • java

    @Autowired
    private OneUserMapper oneUserMapper;
    @Autowired
    private TwoUserMapper twoUserMapper;
    
    @GetMapping("user")
    public void user() {
        log.info("user数据迁移开始...");
        Long begin = System.currentTimeMillis();
        List<OneUser> oneUserList = oneUserMapper.selectAll();
        if (oneUserList.size() > 0) {
            log.info("user源数据数量为:{}", oneUserList.size());
            oneUserList.parallelStream()
                .forEach(oneUser -> {
                    TwoUser twoUser = new TwoUser();
                    BeanUtils.copyProperties(oneUser, twoUser);
                    int insertOk = twoUserMapper.insert(twoUser);
                    if (insertOk > 0) {
                        log.info("user新数据插入成功,ID:{}", twoUser.getId());
                    }
                });
        }
        Long end = System.currentTimeMillis();
        log.info("user数据迁移花费时间:{} ms", end - begin);
        log.info("user数据迁移结束...");
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值