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

作者:soゝso

原文地址:https://www.sojson.com/blog/301.html

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

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

一、Springboot + Mybatis 多数据源配置



1.Springboot.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 对 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

优惠活动

推荐得极客专栏感恩节活动只剩最后一天了,点击直达活动现场,这里我推荐了三个Java应该关注得课程,通过我得特殊通道可以减免不少费用。

推荐阅读

springboot整合RabbitMQ

SpringBoot全局异常与数据校验

从 Spring Cloud 看一个微服务框架的「五脏六腑」


640?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值