Springboot+Mybatis配置多数据源

配置多数据源有很多种方式,此方式是其中比较好理解的一种方式。(不需要设置主从数据库)

1.首先在yml配置文件中配置多数据源

server:
  port: 8003
foo:
  datasource:
    url: jdbc:mysql://localhost:3306/grandtech?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password:
bar:
  datasource:
    url: jdbc:mysql://localhost:3306/miscloud_admin?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password:

2.排除Springboot自动配置bean(默认的:DataSourceAutoConfiguration、DataSourceTransactionManagerAutoConfiguration、JdbcTemplateAutoConfiguration)

package com.example.fjk.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, JdbcTemplateAutoConfiguration.class})
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

3.配置两个数据源实体配置类

BarDataSourceConfig
package com.example.fjk.demo.config;

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.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
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.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.annotation.Resource;
import javax.sql.DataSource;

/**
 * @Auther: FanJiaKai
 * @Date: 2019/3/5 13:36
 * @Description:
 */
@Configuration
@MapperScan(basePackages = {"com.example.fjk.demo.dao.bar"}, sqlSessionTemplateRef = "barTestSqlSessionTemplate")
public class BarDataSourceConfig {

    /**
     * 数据源配置对象
     * Primary 表示默认的对象,Autowire可注入,不是默认的得明确名称注入
     * @return
     */
    @Bean
//    @Primary
    @ConfigurationProperties("bar.datasource")
    public DataSourceProperties barDataSourceProperties() {
        return new DataSourceProperties();
    }

    /**
     * 数据源对象
     * @return
     */
    @Bean
    public DataSource barDataSource() {
        DataSourceProperties dataSourceProperties = barDataSourceProperties();
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }

    /**
     * 配置事物
     * @param barDataSource
     * @return
     */
    @Bean
    @Resource
    public PlatformTransactionManager barManager(DataSource barDataSource){
        System.out.println(barDataSource);
        return new DataSourceTransactionManager(barDataSource);
    }

    /**
     * 配置Mapper路径
     * @param dataSource
     * @return
     * @throws Exception
     */
    @Bean
    public  SqlSessionFactory barSqlSessionFactory(@Qualifier("barDataSource") DataSource dataSource) throws Exception  {
        SqlSessionFactoryBean bean  =  new  SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //添加XML目录
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try{
            bean.setMapperLocations(resolver.getResources("classpath*:mapper/**Mapper.xml"));
            return  bean.getObject();
        }catch(Exception  e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    @Bean
    public SqlSessionTemplate barTestSqlSessionTemplate(@Qualifier("barSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory); // 使用上面配置的Factory
        return template;
    }
}

FooDataSourceConfig
package com.example.fjk.demo.config;

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.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
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.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.annotation.Resource;
import javax.sql.DataSource;

/**
 * @Auther: FanJiaKai
 * @Date: 2019/3/5 13:36
 * @Description:
 */
@Configuration
@MapperScan(basePackages = {"com.example.fjk.demo.dao.foo"}, sqlSessionTemplateRef = "fooSqlSessionTemplate")
public class FooDataSourceConfig {

    /**
     * 数据源配置对象
     * Primary 表示默认的对象,Autowire可注入,不是默认的得明确名称注入
     * @return
     */
    @Bean
    @ConfigurationProperties("foo.datasource")
    public DataSourceProperties fooDataSourceProperties() {
        return new DataSourceProperties();
    }

    /**
     * 数据源对象
     * @return
     */
    @Bean
    public DataSource fooDataSource() {
        DataSourceProperties dataSourceProperties = fooDataSourceProperties();
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }

    /**
     * 配置事物
     * @param fooDataSource
     * @return
     */
    @Bean
    @Resource
    public PlatformTransactionManager fooManager(DataSource fooDataSource){
        return new DataSourceTransactionManager(fooDataSource);
    }

    /**
     * 配置Mapper路径
     * @param dataSource
     * @return
     * @throws Exception
     */
    @Bean
    public  SqlSessionFactory fooSqlSessionFactory(@Qualifier("fooDataSource") DataSource dataSource) throws Exception  {
        SqlSessionFactoryBean  bean  =  new  SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //添加XML目录
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try{
            bean.setMapperLocations(resolver.getResources("classpath*:mapper/**Mapper.xml"));
            return  bean.getObject();
        }catch(Exception  e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    
    @Bean
    public SqlSessionTemplate fooSqlSessionTemplate(@Qualifier("fooSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory); // 使用上面配置的Factory
        return template;
    }
}

@Primary //该注解表示在同一个接口有多个实现类可以注入的时候,默认选择哪一个,而不是让autowire注解报错,官网要求当多个数据源时,必须指定一个datasource,另一个datasource则不用添加。(这里不需要,因为这里没有主从数据库,所有的数据源都是一样的)
@Qualifier 根据名称进行注入,通常是在具有相同的多个类型的实例的一个注入(例如有多个DataSource类型的实例)。
@MapperScan(basePackages = {"com.example.fjk.demo.dao.foo"}, sqlSessionTemplateRef = "fooSqlSessionTemplate") basePackages为Dao所在的包,sqlSessionTemplateRef要引用的实例。

4.Mapper书写正常mybatis SQL语句即可

5.项目整体结构

Springboot+Mybatis配置多数据源_第1张图片
1.jpg

你可能感兴趣的:(Springboot+Mybatis配置多数据源)