SpringBoot多數據源的實現

前言

文本已收錄至個人GitHub倉庫,歡迎Star:github.com/bin39232820…
種一棵樹最好的時間是十年前,其次是如今
我知道不少人不玩qq了,可是懷舊一下,歡迎加入六脈神劍Java菜鳥學習羣,羣聊號碼:549684836 鼓勵你們在技術的路上寫博客java

絮叨

小六六爲啥寫這篇文章呢?至關於一個記錄吧,恰好咱們有一個業務,就是由於作報表的,可是呢,若是是實時報表查詢的話,請求時間不過就超時了,那麼咱們的一個解決方案就是,當他們須要統計的時候咱們把須要的數據用定時任務入庫,然很把這個數據庫提供給他們去讀寫,可是呢,爲了教務那邊看不到因此的庫,因此咱們就須要在一個項目中用到2個數據庫了,那麼就得實現多數據源了,因此有了這篇文章的一個記錄。mysql

搞了小六六很久,吐槽一下緣由,如今負責的這個系統是通過不少人迭代的一個系統,而後採用的是分層結構,就Controller,Service,Dao 是一個個模塊,而後相互依賴,組成一個個服務。而後呢?他的每一個服務的數據庫的配置放在了 api 或者admin這樣的工程裏面,那麼若是我要改的話,我就只能在要改的項目裏面加多數據源,就好比我要在admin裏面加 ,就只能在admin裏面,並不能在api,那麼如今就有一個問題,而後咱們的多數據源的解決方案就大概2種,一種是分包,另一種就是咱們去用Spring的動態配置接口,若是咱們採起第二種,那麼咱們就要在dao裏面切面去作(每次到dao的走一下切面),而後呢我dao 怎麼去用admin的東西,由於是controller 依賴的dao,總不能說我在dao依賴controller吧,那不是相互依賴了,因此還有一種方案就是重寫一個模塊去依賴dao,可是這樣也是不行的,由於影響到了api(api有本身的數據庫配置,dao也有的話會重複加載,api也是依賴了dao的),致使api的配置也會有變化,因此想來想去只能採用分包的方式去拓展了,寫這麼多,就是想表達一個架構的設計的拓展性真的很重要,若是一個項目通過5我的的手能作到他的味道不變,那麼這批人就很厲害了。我一直以爲一個產品是有生命的,代碼也是,若是說一個產品的代碼最後寫的變成了,沒法拓展,那麼這個項目就會愈來愈難迭代,好的架構設計仍是很是重要的。哈哈,說了這麼多,好像偏離了主線,接下來咱們來看看Spring的多數據源的配置git

代碼整合

包結構

第一步:添加依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wangbin</groupId>
    <artifactId>springboot-moresource</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <description>SpringBoot配置多數據源</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <druid.version>1.1.2</druid.version>
        <mysql-connector.version>5.1.21</mysql-connector.version>
        <mybatis-plus.version>2.1.8</mybatis-plus.version>
        <mybatisplus-spring-boot-starter.version>1.0.5</mybatisplus-spring-boot-starter.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector.version}</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>com.louislivi.fastdep</groupId>
            <artifactId>fastdep-datasource</artifactId>
            <version>1.0.3</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!-- MyBatis plus加強和springboot的集成-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatisplus-spring-boot-starter</artifactId>
            <version>${mybatisplus-spring-boot-starter.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-all</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.28</version>
            <scope>runtime</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <!--<proc>none</proc>-->
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.20</version>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                </executions>
            </plugin>
        </plugins>

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

</project>
複製代碼

修改屬性文件

spring.datasource.one.url=jdbc:mysql:/pos?serverTimezone=UTC&useSSL=false&autoReconnect=true&tinyInt1isBit=false&useUnicode=true&characterEncoding=utf8
spring.datasource.one.username=root
spring.datasource.one.password=admin@123
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.two.url=jdbc:mysql:/biz?serverTimezone=UTC&useSSL=false&autoReconnect=true&tinyInt1isBit=false&useUnicode=true&characterEncoding=utf8
spring.datasource.two.username=root
spring.datasource.two.password=admin@123
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource

複製代碼

配置文件就配多個數據源就行了github

實體類

package com.wangbin.entity;

import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;

import java.io.Serializable;
import java.util.Date;

/**
 * 後臺管理用戶表
 *
 * @author 熊能
 * @version 1.0
 * @since 2018/01/02
 */
public class User extends Model<User> {

private static final long serialVersionUID = 1L;

    /**
     * 主鍵ID
     */
    @TableId(value="id", type= IdType.AUTO)
    private Integer id;
    /**
     * 帳號
     */
    private String username;
    /**
     * 名字
     */
    private String name;
    /**
     * 密碼
     */
    private String password;
    /**
     * md5密碼鹽
     */
    private String salt;
    /**
     * 聯繫電話
     */
    private String phone;
    /**
     * 備註
     */
    private String tips;
    /**
     * 狀態 1:正常 2:禁用
     */
    private Integer state;
    /**
     * 建立時間
     */
    private Date createdTime;
    /**
     * 更新時間
     */
    private Date updatedTime;

    /**
     * 獲取 主鍵ID.
     *
     * @return 主鍵ID.
     */
    public Integer getId() {
        return id;
    }

    /**
     * 設置 主鍵ID.
     *
     * @param id 主鍵ID.
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * 獲取 帳號.
     *
     * @return 帳號.
     */
    public String getUsername() {
        return username;
    }

    /**
     * 設置 帳號.
     *
     * @param username 帳號.
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * 獲取 名字.
     *
     * @return 名字.
     */
    public String getName() {
        return name;
    }

    /**
     * 設置 名字.
     *
     * @param name 名字.
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 獲取 密碼.
     *
     * @return 密碼.
     */
    public String getPassword() {
        return password;
    }

    /**
     * 設置 密碼.
     *
     * @param password 密碼.
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * 獲取 md5密碼鹽.
     *
     * @return md5密碼鹽.
     */
    public String getSalt() {
        return salt;
    }

    /**
     * 設置 md5密碼鹽.
     *
     * @param salt md5密碼鹽.
     */
    public void setSalt(String salt) {
        this.salt = salt;
    }

    /**
     * 獲取 聯繫電話.
     *
     * @return 聯繫電話.
     */
    public String getPhone() {
        return phone;
    }

    /**
     * 設置 聯繫電話.
     *
     * @param phone 聯繫電話.
     */
    public void setPhone(String phone) {
        this.phone = phone;
    }

    /**
     * 獲取 備註.
     *
     * @return 備註.
     */
    public String getTips() {
        return tips;
    }

    /**
     * 設置 備註.
     *
     * @param tips 備註.
     */
    public void setTips(String tips) {
        this.tips = tips;
    }

    /**
     * 獲取 狀態 1:正常 2:禁用.
     *
     * @return 狀態 1:正常 2:禁用.
     */
    public Integer getState() {
        return state;
    }

    /**
     * 設置 狀態 1:正常 2:禁用.
     *
     * @param state 狀態 1:正常 2:禁用.
     */
    public void setState(Integer state) {
        this.state = state;
    }

    /**
     * 獲取 建立時間.
     *
     * @return 建立時間.
     */
    public Date getCreatedTime() {
        return createdTime;
    }

    /**
     * 設置 建立時間.
     *
     * @param createdTime 建立時間.
     */
    public void setCreatedTime(Date createdTime) {
        this.createdTime = createdTime;
    }

    /**
     * 獲取 更新時間.
     *
     * @return 更新時間.
     */
    public Date getUpdatedTime() {
        return updatedTime;
    }

    /**
     * 設置 更新時間.
     *
     * @param updatedTime 更新時間.
     */
    public void setUpdatedTime(Date updatedTime) {
        this.updatedTime = updatedTime;
    }

    @Override
    protected Serializable pkVal() {
        return this.id;
    }

}

複製代碼

config

這個是重點,配置不一樣包下面的數據源web

DataSourceConfigspring

package com.wangbin.config;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

/**
 * @author 小六六
 * @version 1.0
 * @date 2020/4/24 21:34
 */
@Configuration
public class DataSourceConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.one")
    DataSource dsOne() {
        return DruidDataSourceBuilder.create().build();
    }
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.two")
    DataSource dsTwo() {
        return DruidDataSourceBuilder.create().build();
    }
}


複製代碼

MyBatisConfigOnesql

package com.wangbin.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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

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

/**
 * @author 小六六
 * @version 1.0
 * @date 2020/4/24 21:35
 */
@Configuration
@MapperScan(basePackages = "com.wangbin.mybatis.mapper1",sqlSessionFactoryRef = "sqlSessionFactory1",sqlSessionTemplateRef = "sqlSessionTemplate1")
public class MyBatisConfigOne {
    @Resource(name = "dsOne")
    DataSource dsOne;

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


複製代碼

MyBatisConfigTwo數據庫

package com.wangbin.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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

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

/**
 * @author 小六六
 * @version 1.0
 * @date 2020/4/24 21:36
 */
@Configuration
@MapperScan(basePackages = "com.wangbin.mybatis.mapper2",sqlSessionFactoryRef = "sqlSessionFactory2",sqlSessionTemplateRef = "sqlSessionTemplate2")
public class MyBatisConfigTwo {
    @Resource(name = "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());
    }
}


複製代碼

Mapper

UserMapperOneapache

package com.wangbin.mybatis.mapper1;

import com.wangbin.entity.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * @author 小六六
 * @version 1.0
 * @date 2020/4/24 21:37
 */
@Mapper
public interface UserMapperOne {

    List<User> getAllUser();
}

複製代碼

UserMapperOne.xmlapi

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wangbin.mybatis.mapper1.UserMapperOne">
    <select id="getAllUser" resultType="com.wangbin.entity.User">
        select * from t_user;
    </select>
</mapper>

複製代碼

UserMapper

package com.wangbin.mybatis.mapper2;

import com.wangbin.entity.User;

import java.util.List;

/**
 * @author 小六六
 * @version 1.0
 * @date 2020/4/24 21:41
 */
public interface UserMapper {
    List<User> getAllUser();
}

複製代碼

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wangbin.mybatis.mapper2.UserMapper">
    <select id="getAllUser" resultType="com.wangbin.entity.User">
        select * from t_user;
    </select>
</mapper>

複製代碼

測試類

SpringTest

import com.wangbin.Application;
import com.wangbin.entity.User;
import com.wangbin.mybatis.mapper1.UserMapperOne;
import com.wangbin.mybatis.mapper2.UserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

/**
 * @author 小六六
 * @version 1.0
 * @date 2020/4/24 20:59
 */
@SpringBootTest(classes ={Application.class})
@RunWith(SpringRunner.class)
public class SpringTest {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private UserMapperOne userMapperOne;




    @Test
    public void Test1() {
        List<User> allUser = userMapper.getAllUser();
        for (User user : allUser) {
            System.out.println(user.getName());
        }
        List<User> allUser1 = userMapperOne.getAllUser();
        for (User user : allUser1) {
            System.out.println(user.getName());
        }


    }
}

複製代碼

結果

結尾

其實蠻簡單的呢? 就是分包就能實現了,本身寫這篇文章,算是作個筆記吧,若是對讀者有所幫助也是極好的。

平常求贊

好了各位,以上就是這篇文章的所有內容了,能看到這裏的人呀,都是真粉

創做不易,各位的支持和承認,就是我創做的最大動力,咱們下篇文章見

六脈神劍 | 文 【原創】若是本篇博客有任何錯誤,請批評指教,不勝感激 !

相關文章
相關標籤/搜索