一:第一种
1:在mybatis配置文件当中配置多个数据源
<context:component-scan base-package="com.zjl.ssm"><!-- base-package 如果多个,用“,”分隔 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/><!-- 过滤其中这四个注解中的一个 -->
</context:component-scan>
<!-- 引入数据库配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<property name="location" value="classpath:properties/jdbc.properties"/>
</bean>
<!--
3307数据库==============================================================
-->
<!-- 配置数据库 -->
<bean id="dataSource3307" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver3307}"/>
<property name="url" value="${jdbc.url3307}"/>
<property name="username" value="${jdbc.username3307}"/>
<property name="password" value="${jdbc.password3307}"/>
</bean>
<!-- 配置 MyBatis SqlSessionFactory -->
<bean id="sqlSessionFactory3307" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<!-- 指定 MyBatis 数据源 -->
<property name="dataSource" ref="dataSource3307"/>
<!-- 指定 MyBatis mapper 映射文件位置 -->
<property name="mapperLocations" value="classpath:com/zjl/ssm/dao/db3307/mapper/*.xml"/>
<!-- 指定 MyBatis 全局配置文件的位置 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="plugins">
<array>
<!-- 分页插件配置 -->
<bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
<property name="dialectType" value="mysql"/>
</bean>
</array>
</property>
<property name="globalConfig" ref="globalConfig" />
</bean>
<!-- 扫描 MyBatis 的 dao 接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--扫描所有 dao 接口,加入到 IOC 容器中 -->
<property name="basePackage" value="com.zjl.ssm.dao.db3307"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory3307"/>
</bean>
<!-- 定义事务 -->
<bean id="transactionManager3307"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource3307"/>
</bean>
<!-- 使用注解定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager3307"/>
<!--
3308数据库==============================================================
-->
<!-- 配置数据库 -->
<bean id="dataSource3308" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver3308}"/>
<property name="url" value="${jdbc.url3308}"/>
<property name="username" value="${jdbc.username3308}"/>
<property name="password" value="${jdbc.password3308}"/>
</bean>
<!-- 配置 MyBatis SqlSessionFactory -->
<bean id="sqlSessionFactory3308" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<!-- 指定 MyBatis 数据源 -->
<property name="dataSource" ref="dataSource3308"/>
<!-- 指定 MyBatis mapper 映射文件位置 -->
<property name="mapperLocations" value="classpath:com/zjl/ssm/dao/db3308/mapper/*.xml"/>
<!-- 指定 MyBatis 全局配置文件的位置 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="plugins">
<array>
<!-- 分页插件配置 -->
<bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
<property name="dialectType" value="mysql"/>
</bean>
</array>
</property>
<property name="globalConfig" ref="globalConfig" />
</bean>
<!-- 扫描 MyBatis 的 dao 接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--扫描所有 dao 接口,加入到 IOC 容器中 -->
<property name="basePackage" value="com.zjl.ssm.dao.db3308"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory3308"/>
</bean>
<!-- 定义事务 -->
<bean id="transactionManage3308"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource3308"/>
</bean>
<!-- 使用注解定义事务 -->
<tx:annotation-driven transaction-manager="transactionManage3308"/>
<!--
3309数据库==============================================================
-->
<!-- 配置数据库 -->
<bean id="dataSource3309" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver3309}"/>
<property name="url" value="${jdbc.url3309}"/>
<property name="username" value="${jdbc.username3309}"/>
<property name="password" value="${jdbc.password3309}"/>
</bean>
<!-- 配置 MyBatis SqlSessionFactory -->
<bean id="sqlSessionFactory3309" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<!-- 指定 MyBatis 数据源 -->
<property name="dataSource" ref="dataSource3309"/>
<!-- 指定 MyBatis mapper 映射文件位置 -->
<property name="mapperLocations" value="classpath:com/zjl/ssm/dao/db3309/mapper/*.xml"/>
<!-- 指定 MyBatis 全局配置文件的位置 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="plugins">
<array>
<!-- 分页插件配置 -->
<bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
<property name="dialectType" value="mysql"/>
</bean>
</array>
</property>
<property name="globalConfig" ref="globalConfig" />
</bean>
<!-- 扫描 MyBatis 的 dao 接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--扫描所有 dao 接口,加入到 IOC 容器中 -->
<property name="basePackage" value="com.zjl.ssm.dao.db3309"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory3309"/>
</bean>
<!-- 定义事务 -->
<bean id="transactionManager3309"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource3309"/>
</bean>
<!-- 使用注解定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager3309"/>
<!--
3310数据库==============================================================
-->
<!-- 配置数据库 -->
<bean id="dataSource3310" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver3310}"/>
<property name="url" value="${jdbc.url3310}"/>
<property name="username" value="${jdbc.username3310}"/>
<property name="password" value="${jdbc.password3310}"/>
</bean>
<!-- 配置 MyBatis SqlSessionFactory -->
<bean id="sqlSessionFactory3310" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<!-- 指定 MyBatis 数据源 -->
<property name="dataSource" ref="dataSource3310"/>
<!-- 指定 MyBatis mapper 映射文件位置 -->
<property name="mapperLocations" value="classpath:com/zjl/ssm/dao/db3310/mapper/*.xml"/>
<!-- 指定 MyBatis 全局配置文件的位置 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="plugins">
<array>
<!-- 分页插件配置 -->
<bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
<property name="dialectType" value="mysql"/>
</bean>
</array>
</property>
<property name="globalConfig" ref="globalConfig" />
</bean>
<!-- 扫描 MyBatis 的 dao 接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--扫描所有 dao 接口,加入到 IOC 容器中 -->
<property name="basePackage" value="com.zjl.ssm.dao.db3310"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory3310"/>
</bean>
<!-- 定义事务 -->
<bean id="transactionManager3310"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource3310"/>
</bean>
<!-- 使用注解定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager3310"/>
<!--
======================================================================
-->
<bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!--
AUTO->`0`("数据库ID自增")
INPUT->`1`(用户输入ID")
ID_WORKER->`2`("全局唯一ID")
UUID->`3`("全局唯一ID")
-->
<property name="idType" value="2" />
<!--
MYSQL->`mysql`
ORACLE->`oracle`
DB2->`db2`
H2->`h2`
HSQL->`hsql`
SQLITE->`sqlite`
POSTGRE->`postgresql`
SQLSERVER2005->`sqlserver2005`
SQLSERVER->`sqlserver`
-->
<!-- Oracle需要添加该项 -->
<!-- <property name="dbType" value="oracle" /> -->
<!-- 全局表为下划线命名设置 true -->
<property name="dbColumnUnderline" value="true" />
</bean>
2:建立四个mapper目录,将不同数据库的调用分隔开
记得修改xml文件中的工作空间
3:将*mapper.java的Bean名称修改,以免相同的bean名称发生冲突
4:在service调用时指定bean名称和mapper全路径
5:调用,查询调用从库,增删改调用主库
二:第二种
1:创建线程,用来保存数据库的Key值
public class ThreadLocalHoder {
public static ThreadLocal<String> holder = new ThreadLocal<>();
public static String getDataSource(){
return holder.get();
}
public static void setDataSourceKey(String dataSourceKey){
holder.set(dataSourceKey);
}
}
2:采用一个动态数据源,在程序运行时,决定采用那个数据源,并设置默认数据源
/**
* 采用一个动态数据源,在程序运行时,决定采用那个数据源
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
public static final String DB3307 = "db3307";
public static final String DB3308 = "db3308";
public static final String DB3309 = "db3309";
public static final String DB3310 = "db3310";
/**
* 设置好数据源的key
* @return
*/
@Override
protected Object determineCurrentLookupKey() {
//设置默认数据源
if(ThreadLocalHoder.getDataSource() == null){
ThreadLocalHoder.setDataSourceKey(DB3309);
}
return ThreadLocalHoder.getDataSource();
}
}
3:在mybatis中配置Bean
<context:component-scan base-package="com.zjl.ssm"><!-- base-package 如果多个,用“,”分隔 -->
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/><!-- 过滤其中这四个注解中的一个 -->
</context:component-scan>
<!-- 引入数据库配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<property name="location" value="classpath:properties/jdbc.properties"/>
</bean>
<!-- 3307数据库============================================================== -->
<!-- 配置数据库 -->
<bean id="dataSource3307" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver3307}"/>
<property name="url" value="${jdbc.url3307}"/>
<property name="username" value="${jdbc.username3307}"/>
<property name="password" value="${jdbc.password3307}"/>
</bean>
<!-- 3308数据库============================================================== -->
<!-- 配置数据库 -->
<bean id="dataSource3308" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver3308}"/>
<property name="url" value="${jdbc.url3308}"/>
<property name="username" value="${jdbc.username3308}"/>
<property name="password" value="${jdbc.password3308}"/>
</bean>
<!-- 3309数据库============================================================== -->
<!-- 配置数据库 -->
<bean id="dataSource3309" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver3309}"/>
<property name="url" value="${jdbc.url3309}"/>
<property name="username" value="${jdbc.username3309}"/>
<property name="password" value="${jdbc.password3309}"/>
</bean>
<!-- 3310数据库============================================================== -->
<!-- 配置数据库 -->
<bean id="dataSource3310" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver3310}"/>
<property name="url" value="${jdbc.url3310}"/>
<property name="username" value="${jdbc.username3310}"/>
<property name="password" value="${jdbc.password3310}"/>
</bean>
<!--
======================================================================
-->
<bean id="dynamicDataSource" class="com.zjl.ssm.controller.common.jdbc.DynamicDataSource">
<property name="targetDataSources">
<map>
<entry key="db3307" value-ref="dataSource3307"/>
<entry key="db3308" value-ref="dataSource3308"/>
<entry key="db3309" value-ref="dataSource3309"/>
<entry key="db3310" value-ref="dataSource3310"/>
</map>
</property>
</bean>
<!-- 配置 MyBatis SqlSessionFactory -->
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<!-- 指定 MyBatis 数据源 -->
<property name="dataSource" ref="dynamicDataSource"/>
<!-- 指定 MyBatis mapper 映射文件位置 -->
<property name="mapperLocations" value="classpath:com/zjl/ssm/dao/mapper/*.xml"/>
<!-- 指定 MyBatis 全局配置文件的位置 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="plugins">
<array>
<!-- 分页插件配置 -->
<bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
<property name="dialectType" value="mysql"/>
</bean>
</array>
</property>
<property name="globalConfig" ref="globalConfig"/>
</bean>
<!-- 扫描 MyBatis 的 dao 接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--扫描所有 dao 接口,加入到 IOC 容器中 -->
<property name="basePackage" value="com.zjl.ssm.dao"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
4:在进行CRUD时设置数据源