1、背景的介紹
有時候我們需要做分庫分表,那麼肯定存在多資料源,Spring Boot和Mybatis的多資料源是如何整合的呢?比如說我們現在做了一個浪迹天涯管理的背景系統,商品資訊是存在itemCenter資料源中的,而與使用者相關的資訊是存在account資料源中,項目結構如下:
2、Spring Boot和Mybatis的整合
2.1 添加相關的pom檔案
這個我不在這裡詳細的貼代碼,稍後請檢視具體的源代碼。
2.2 在環境配置檔案中添加資料庫的配置
因為我們這裡有四個環境,分别是dev、sit、ust、prod。是以我們需要在每個環境下配置jdbc.properties。并且我們在jdbc.properties配置檔案中配置了2個資料源,分别是itemcenter和account。
2.3 資料源的讀取和事物的配置以及Mybatis的配置
因為這些都是通用的,是以我們放在了common這個檔案下統一配置了,如下圖所示:
(1). 現在我們具體的看下dataSource.xml的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<aop:aspectj-autoproxy proxy-target-class="false"/>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />
<bean id="itemcenterDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="url" value="${itemcenter.jdbc.url}" />
<property name="username" value="${itemcenter.jdbc.username}" />
<property name="password" value="${itemcenter.jdbc.password}" />
<property name="driverClassName" value="${itemcenter.jdbc.driver}" />
</bean>
<bean id="accountDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="url" value="${account.jdbc.url}" />
<property name="username" value="${account.jdbc.username}" />
<property name="password" value="${account.jdbc.password}" />
<property name="driverClassName" value="${account.jdbc.driver}" />
</bean>
<bean id ="dataSource" class= "com.niepengfei.langjitianya.config.DynamicDataSource" >
<property name ="targetDataSources">
<map key-type ="java.lang.String">
<entry value-ref ="itemcenterDataSource" key= "itemcenter_dataSource"/>
<entry value-ref ="accountDataSource" key= "account_dataSource"/>
</map>
</property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:config/common/mybatisConfig.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
(2). 現在我們具體的看下mybatisConfig.xml的配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置分頁插件 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 設定資料庫類型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六種資料庫-->
<property name="dialect" value="mysql"/>
</plugin>
</plugins>
</configuration>
dataSource.xml是讀取資料源,且mybatisConfig.xml是在dataSource.xml被加載。
2.4 開發dao
我們把dao和相應的xml檔案放在一起,約定俗成。這樣省去了配置dao和xml的對應關系。
2.5 啟動類的配置
2.6 我們的資料源的切換是在service層,這裡我使用Spring AOP的思想,利用切面在Service層切換資料源。
(1).首先定義資料源的枚舉
(2)、然後分别為每個資料源定義個注解,例如AccountDatasource和ItemCenterDataSource,代碼如下:
(3).定義DynamicDataSource,該類繼承AbstractRoutingDataSource,重寫determineCurrentLookupKey:
(4)、定義資料源切面:
(5)、在Service層加上相應的資料源注解
以上就是全部過程。