SpringBoot 整合 MyBatis 配置多數據源

一、配置單數據源

在學習配置多數據源之前,先來複習一下單數據源的配置。

創建好 SpringBoot 項目,在pom.xml添加需要的依賴:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.22</version>
</dependency>

由於我們將 mapper.xml 和 mapper.java 放在相同的 java 目錄,所以還要添加如下配置,避免打包時java目錄下的xml文件被忽略掉:

<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include> **/*.xml</include>
        </includes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
    </resource>
</resources>

在項目啓動類上使用MapperScan註解配置要掃描的 mapper 包路徑,需要將 mapper 文件放在這個目錄下:

@SpringBootApplication
@MapperScan("com.sh.mybatis.mapper")
public class MybatisApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisApplication.class, args);
    }
}

然後在application.properties進行數據庫連接的相關配置:

spring.datasource.url=jdbc:mysql://localhost:3306/mytest?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B0
spring.datasource.username=root
spring.datasource.password=shehuan
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 如果mapper.xml是放置在resources下邊的mapper目錄可以配置這個
# mybatis.mapper-locations=classpath:mapper/*.xml
# 打印sql
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

二、配置多數據源

在單數據源的基礎上我們完成多數據源的配置,我們以兩個數據源爲例。

首先pom.xml不用做修改。

取消掉啓動類上的MapperScan註解。

然後就是修改application.properties,添加兩個數據源:

# 數據源1
spring.datasource.one.url=jdbc:mysql://localhost:3306/mytest?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B0
spring.datasource.one.username=root
spring.datasource.one.password=shehuan
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.driver-class-name=com.mysql.cj.jdbc.Driver

# 數據源2
spring.datasource.two.url=jdbc:mysql://localhost:3306/mytest2?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B0
spring.datasource.two.username=root
spring.datasource.two.password=shehuan
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.driver-class-name=com.mysql.cj.jdbc.Driver

接下來通過Configuration配置類的像是來初始化兩個數據源:

@Configuration
public class DataSourceConfig {
    @Bean(name = "dsOne")
    @ConfigurationProperties(prefix = "spring.datasource.one")
    DataSource dsOne() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = "dsTwo")
    @ConfigurationProperties(prefix = "spring.datasource.two")
    DataSource dsTwo() {
        return DruidDataSourceBuilder.create().build();
    }
}

由於是多數據源,我們無法在啓動類配置MapperScan,所以需要爲每個數據源單獨配置要掃描的 mapper 文件目錄,以及創建SqlSessionFactorySqlSessionTemplate

@Configuration
@MapperScan(basePackages = "com.sh.mybatis.mapper", sqlSessionFactoryRef = "sqlSessionFactory1", sqlSessionTemplateRef = "sqlSessionTemplate1")
public class MyBatisConfigOne {

    @Autowired
    @Qualifier("dsOne")
    DataSource dsOne;

    @Bean
    SqlSessionFactory sqlSessionFactory1() {
        SqlSessionFactory sqlSessionFactory = null;
        try {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dsOne);
            sqlSessionFactory = bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sqlSessionFactory;
    }

    @Bean
    SqlSessionTemplate sqlSessionTemplate1() {
        return new SqlSessionTemplate(sqlSessionFactory1());
    }
}
@Configuration
@MapperScan(basePackages = "com.sh.mybatis.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2", sqlSessionTemplateRef = "sqlSessionTemplate2")
public class MyBatisConfigTwo {

    @Autowired
    @Qualifier("dsTwo")
    DataSource dsTwo;

    @Bean
    SqlSessionFactory sqlSessionFactory2() {
        SqlSessionFactory sessionFactory = null;
        try {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dsTwo);
            sessionFactory = bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sessionFactory;
    }

    @Bean
    SqlSessionTemplate sqlSessionTemplate2() {
        return new SqlSessionTemplate(sqlSessionFactory2());
    }
}

最後只需要在com.sh.mybatis.mappercom.sh.mybatis.mapper2兩個包下分別放置兩個數據源對應的 mapper.java、mapper.xml 文件即可,後邊的用法就沒有什麼特別之處了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章