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层加上相应的数据源注解
以上就是全部过程。