SpringBoot 配置多數據源(Sql Server、MySql)

創建SpringBoot項目就不說了。(直接使用IDEA創建就好了)

整個目錄結構如圖:(不用管圖中報錯,項目是在另一臺電腦上寫的。報錯是沒有jar包,因爲網絡比較慢。)

1、主要pom.xml

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Spring Boot Test 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Spring Boot Mybatis 依賴 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.2.0</version>
        </dependency> 
        <!-- MySQL 連接驅動依賴 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector}</version>
        </dependency> <!-- Druid 數據連接池依賴 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.18</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <version>7.0.0.jre8</version>
        </dependency>
    </dependencies>

2、在配置文件中配置多數據源application.properties

## 默認的數據源
master.datasource.url=jdbc:mysql://localhost:3306/springbootdb?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
master.datasource.username=root
master.datasource.password=admin
master.datasource.driverClassName=com.mysql.jdbc.Driver
## 另一個的數據源
cluster.datasource.url=jdbc:sqlserver://localhost:1433;DatabaseName=tablename
cluster.datasource.username=sa
cluster.datasource.password=admin
cluster.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver

 我這配置SqlServer、MySql,如果需要連接MySql中的兩個數據庫。請自行更更改配置,並刪除pom依賴。

3、配置mapper接口的數據源

MasterDataSourceConfig.java

package com.wzq.datasource2.config;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

@Configuration
//掃描 Mapper 接口並容器管理
@MapperScan(basePackages = {"com.wzq.datasource2.mapper.master"}, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {

    // 精確到 master 目錄,以便跟其他數據源隔離
    static final String PACKAGE = "com.wzq.datasource2.mapper.master";
    static final String MAPPER_LOCATION = "classpath:mapper/master/*.xml";

    @Value("${master.datasource.url}")
    private String url;

    @Value("${master.datasource.username}")
    private String user;

    @Value("${master.datasource.password}")
    private String password;

    @Value("${master.datasource.driverClassName}")
    private String driverClass;

    @Primary
    @Bean(name = "masterDataSource")
    public DataSource masterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean(name = "masterTransactionManager")
    @Primary
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(masterDataSource());
    }

    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/master/*.xml"));
        return sessionFactory.getObject();
    }
}

 

4、創建entity實體類

public class StuT {

    private static final long serialVersionUID = 1L;
    private Integer id;
    private String name;
    //get/set

}

public class Stu  {

    private static final long serialVersionUID = 1L;

    private Integer id;
    private String name;
    //get/set
}
ClusterDataSourceConfig.java
package com.wzq.datasource2.config;

import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import com.alibaba.druid.pool.DruidDataSource;

@Configuration
//掃描 Mapper 接口並容器管理
@MapperScan(basePackages = {"com.wzq.datasource2.mapper.cluster"}, sqlSessionFactoryRef = "clusterSqlSessionFactory")
public class ClusterDataSourceConfig {

    // 精確到 cluster 目錄,以便跟其他數據源隔離
    static final String PACKAGE = "com.wzq.datasource2.mapper.cluster";
    static final String MAPPER_LOCATION = "classpath:mapper/cluster/*.xml";

    @Value("${cluster.datasource.url}")
    private String url;

    @Value("${cluster.datasource.username}")
    private String user;

    @Value("${cluster.datasource.password}")
    private String password;

    @Value("${cluster.datasource.driverClassName}")
    private String driverClass;

    @Bean(name = "clusterDataSource")
    public DataSource clusterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean(name = "clusterTransactionManager")
    public DataSourceTransactionManager clusterTransactionManager() {
        return new DataSourceTransactionManager(clusterDataSource());
    }

    @Bean(name = "clusterSqlSessionFactory")
    public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("clusterDataSource") DataSource clusterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(clusterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/cluster/*.xml"));
        return sessionFactory.getObject();
    }
}

請根據實體類自行創建表 

5、編寫mapper層

 

 

6、Service省略,目錄結構如下:

 7、controller層

package com.wzq.datasource2.controller;

import com.wzq.datasource2.entity.cluster.StuT;
import com.wzq.datasource2.entity.master.Stu;
import com.wzq.datasource2.service.cluster.StuTService;
import com.wzq.datasource2.service.master.StuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
public class StuController {

    @Autowired
    @Qualifier(value = "stuServiceImpl")
    private StuService stuService;

    @Autowired
    @Qualifier(value = "stuTServiceImpl")
    private StuTService stuTService;

    @RequestMapping("/list")
    @ResponseBody
    public List<Stu> getAllStu(){
        return stuService.getAllStu();
    }
    @RequestMapping("/list2")
    @ResponseBody
    public List<StuT> getAllStuT(){
        return stuTService.getAllStuT();
    }

}

總結:

1、配置多數據的目的是因爲新項目需要用到老項目中的數據,而數據存放在兩個不同的數據庫當中,配置多數據源能很好的解決這一方面。還有一些公司進行了分庫的操作,就比如一個製作增刪改,一個製作查詢。

2、 可能是我在配置數據源的時候使用了master或cluster,亦或者在配置mapper接口的數據源時指定的mastter或cluster,所以需要在mapperwen文件下創建master和cluster文件,以此來區分數據源的使用。

PS:報紅是因爲沒有jar包!報紅是因爲沒有jar包!報紅是因爲沒有jar包!

GitHub網址:https://github.com/qz596766829/WzqRepository.git (datasoutrce2項目)

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