查看原文
其他

Springboot + Mybatis,数据库多数据源配置项目Demo【源码下载】

Java面试 2020-10-17

由于要做复杂的数据迁移,直接  Mysql  数据库中用  sql  做迁移,难度太大,  SQL  操作起来很复杂,而且也不现实。

为了可以让同学们可以直接使用,在  Springboot  结合  Mybatis  同时加入了我以往的  Freemarker  ,作为View层渲染。

一、Springboot + Mybatis 多数据源配置



1.Springboot.yml配置文件

server:
 port9281


#spring:
#  profiles:
#    active: dev

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

#数据库2
datasource2:
 urljdbc: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 对 Springboot.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目录。

三、多数据源测试

@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;

   }

}

代码已经开源提交到gitee上,地址为:https://gitee.com/jsonla/sojson.datasource.git


扩展阅读

MyBatis拦截器原理探究

Spring+MyBatis多数据源配置实现(实操型)

Spring Boot 自动配置的 “魔法” 是如何实现的?


来源:https://www.sojson.com/blog/301.html

文章来源网络,版权归作者本人所有,如侵犯到原作者权益,请与我们联系删除

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存