文本已收錄至個人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;
}
}
複製代碼
這個是重點,配置不一樣包下面的數據源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());
}
}
複製代碼
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());
}
}
}
複製代碼
其實蠻簡單的呢? 就是分包就能實現了,本身寫這篇文章,算是作個筆記吧,若是對讀者有所幫助也是極好的。
好了各位,以上就是這篇文章的所有內容了,能看到這裏的人呀,都是真粉。
創做不易,各位的支持和承認,就是我創做的最大動力,咱們下篇文章見
六脈神劍 | 文 【原創】若是本篇博客有任何錯誤,請批評指教,不勝感激 !