springboot(mybatis)多数据源:mysql+mysql

Posted 未名胡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot(mybatis)多数据源:mysql+mysql相关的知识,希望对你有一定的参考价值。

在做数据迁移的时候,通常数据库表的结构和数据的格式都会发生变化,采用sql迁移的难度复杂很多,所以可以使用代码进行多数据库操作。本文简单介绍mysql迁移到mysql。其他项目相关配置,请自行查找

1、application.yml

server:
  port: 9281


#spring:
#  profiles:
#    active: dev

#数据库1
datasource1:
  url: jdbc:mysql://localhost:3306/ios666_history?useSSL=false&useUnicode=true
  username: root
  password:
  driver-class-name: com.mysql.jdbc.Driver

#数据库2
datasource2:
  url: jdbc:mysql://localhost:3306/av8d?useSSL=false&useUnicode=true
  username: root
  password:
  driver-class-name: com.mysql.jdbc.Driver

2.SpringbootApplication 禁止加载自身对DataSource的扫描

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class DatasourceApplication {

  public static void main(String[] args) {

    SpringApplication.run(DatasourceApplication.class, args);

  }

}

3.DataSourceConfig.java 对 application.yml 读取

@Configuration
public class DataSourceConfig {

    @Bean(name = "dbOneDataSource")
    @Primary
    @ConfigurationProperties(prefix = "datasource1") // application.yml 中对应属性的前缀
    public DataSource dbOneDataSource() {
        return DataSourceBuilder.create().build();
    }


    @Bean(name = "dbTwoDataSource")
    @ConfigurationProperties(prefix = "datasource2") // application.yml 中对应属性的前缀
    public DataSource dbTwoDataSource() {
        return DataSourceBuilder.create().build();
    }

}

这里创建了2个Bean,由dbOneDataSource 和 dbTwoDataSource 读取并创建数据源。

二、数据源的创建 

如果有多个就直接创建多个,下面说说 SqlSessionFactory && SqlSessionTemplate 创建 。为了方便管理,我用内部类去解决。

@Slf4j
public class MybatisConfig {

    /**
     * 第一个数据库 SqlSessionFactory && SqlSessionTemplate 创建
     */

    @Configuration
    @MapperScan(basePackages = {"com.sojson.datasource.one.mapper"},
            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:mapper/one/*.xml"));
            return factoryBean.getObject();
        }


        @Bean
        public SqlSessionTemplate sqlSessionTemplateOne() throws Exception {
            SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryOne()); // 使用上面配置的Factory
            return template;

        }

    }


    /**
     * 第二个数据库 SqlSessionFactory && SqlSessionTemplate 创建
     */

    @Configuration
    @MapperScan(basePackages = {"com.sojson.datasource.two.mapper"},
            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:mapper/two/*.xml"));

            return factoryBean.getObject();

        }


        @Bean
        public SqlSessionTemplate sqlSessionTemplateTwo() throws Exception {
            SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryTwo()); // 使用上面配置的Factory
            return template;
        }

    }

}

这里要详细说明的一下,因为创建了2套的SqlSessionFactory && SqlSessionTemplate,那怎么来区分或者说怎么分配数据源呢?

通过注释 :basePackages = {"com.sojson.datasource.one.mapper"}来定义第一个数据源 SqlSessionFactory 的mapper目录。

通过注释 :basePackages = {"com.sojson.datasource.two.mapper"}来定义第二个数据源 SqlSessionFactory mapper目录。

三、多数据源测试q

@RequestMapping("api")
@RestController
public class IndexController {

    @Autowired
    OneStockMapper oneStockMapper;
    @Autowired
    TwoStockMapper twoStockMapper;

    @RequestMapping("")

    public Map<String,Object> index(){

        Map<String,Object> result = new HashMap<>();
        //第一个数据源
        Stock entity = oneStockMapper.selectByPrimaryKey(1);

        //第二个数据查询
        Stock twoEntity = twoStockMapper.selectByPrimaryKey(1);
        result.put("entity",entity);
        result.put("twoEntity",twoEntity);
        return result;

    }

}

项目下载地址:

数据同步spingboot连接多个mysql数据库.zip

以上是关于springboot(mybatis)多数据源:mysql+mysql的主要内容,如果未能解决你的问题,请参考以下文章

springboot + mybatis 链接多数据库

springboot + mybatis 链接多数据库

springboot + mybatis 链接多数据库

springboot+mybatis+Druid配置多数据源(mysql+postgre)

springboot mybatis 多数据源配置

19.springboot+mybatis多数据源