简单纪要:mybatis spring 多数据源切换及整合

一 在spring-config-dao中填写多个数据源信息

<?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" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xsi:schemaLocation="  
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
         http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd  
         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
    default-lazy-init="false">
    <!-- 数据源1 start-->
    <!--配置数据源 -->
    
    <bean id="master" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="maxPoolSize" value="100" />
        <property name="minPoolSize" value="1" />
        <property name="initialPoolSize" value="1" />
        <property name="maxIdleTime" value="30" />
    </bean>
    
    <bean id="slave" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="${slave.jdbc.url}" />
        <property name="user" value="${slave.jdbc.username}" />
        <property name="password" value="${slave.jdbc.password}" />
        <property name="maxPoolSize" value="100" />
        <property name="minPoolSize" value="1" />
        <property name="initialPoolSize" value="1" />
        <property name="maxIdleTime" value="30" />
    </bean>
    
    <!-- 动态数据源 -->  
   <bean id="dynamicDataSource" class="com.ceshi.util.DynamicDataSource">  
       <!-- 通过key-value关联数据源 -->  
       <property name="targetDataSources">  
           <map>  
               <entry value-ref="master" key="master"></entry>  
               <entry value-ref="slave" key="slave"></entry>  
           </map>  
       </property>  
       <property name="defaultTargetDataSource" ref="master" />      
   </bean>
  
    <!--mybatis与Spring整合 开始 -->  
    <bean id="sqlSessionFactory" name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>
        <property name="dataSource" ref="dynamicDataSource" />  
        <property name="mapperLocations" value="classpath:mybatis/*-mapper.xml" />
        <property name="typeAliasesPackage" value="com.ceshi.dto" />
    </bean> 
    
    <bean name="mapperScannerConfigurer1" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
         <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <property name="basePackage" value="com.ceshi.dao" />
    </bean>
    <!-- 数据源1 end-->
    
    <!-- 数据源2 start-->
    <bean id="master_ceshi" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="${ceshi.jdbc.url}" />
        <property name="user" value="${ceshi.jdbc.username}" />
        <property name="password" value="${ceshi.jdbc.password}" />
        <property name="maxPoolSize" value="100" />
        <property name="minPoolSize" value="1" />
        <property name="initialPoolSize" value="1" />
        <property name="maxIdleTime" value="30" />
    </bean>
    
    <bean id="slave_ceshi" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="${ceshi.slave.jdbc.url}" />
        <property name="user" value="${ceshi.slave.jdbc.username}" />
        <property name="password" value="${ceshi.slave.jdbc.password}" />
        <property name="maxPoolSize" value="100" />
        <property name="minPoolSize" value="1" />
        <property name="initialPoolSize" value="1" />
        <property name="maxIdleTime" value="30" /> 
    </bean>
    
   <!-- 动态数据源 -->  
   <bean id="dynamicDataSource_videoplat" class="com.ceshi.ceshi.DynamicDataSource">
       <!-- 通过key-value关联数据源 -->  
       <property name="targetDataSources">  
           <map>  
               <entry value-ref="master_ceshi" key="master_ceshi"></entry>  
               <entry value-ref="slave_ceshi" key="slave_ceshi"></entry>  
           </map>  
       </property>  
       <property name="defaultTargetDataSource" ref="master_ceshi" />      
   </bean> 
   
   <!--mybatis与Spring整合 开始 -->  
    <bean id="sqlSessionFactory_ceshi" name="sqlSessionFactory_ceshi" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:mybatis/ceshi/mybatis-config.xml"></property>
        <property name="dataSource" ref="dynamicDataSource_ceshi" />
        <property name="mapperLocations" value="classpath:mybatis/ceshi/*-mapper.xml" />
        <property name="typeAliasesPackage" value="com.ceshi.dto.ceshi" />
    </bean> 
    
    <bean name="mapperScannerConfigurer2" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_ceshi"/>
        <property name="basePackage" value="com.ceshi.dao_videoplat" />
    </bean>
    <!-- 数据源2 end-->

    <!-- 数据源3 start-->
    <bean id="master_jed" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="${jed.jdbc.url}" />
        <property name="user" value="${jed.jdbc.username}" />
        <property name="password" value="${jed.jdbc.password}" />
        <property name="maxPoolSize" value="100" />
        <property name="minPoolSize" value="1" />
        <property name="initialPoolSize" value="1" />
        <property name="maxIdleTime" value="30" />
    </bean>

    <bean id="slave_jed" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="${jed.slave.jdbc.url}" />
        <property name="user" value="${jed.slave.jdbc.username}" />
        <property name="password" value="${jed.slave.jdbc.password}" />
        <property name="maxPoolSize" value="100" />
        <property name="minPoolSize" value="1" />
        <property name="initialPoolSize" value="1" />
        <property name="maxIdleTime" value="30" />
    </bean>

    <!-- 动态数据源 -->
    <bean id="dynamicDataSource_jed" class="com.util.jed.DynamicDataSource">
        <!-- 通过key-value关联数据源 -->
        <property name="targetDataSources">
            <map>
                <entry value-ref="master_jed" key="master_jed"></entry>
                <entry value-ref="slave_jed" key="slave_jed"></entry>
            </map>
        </property>
        <property name="defaultTargetDataSource" ref="master_jed" />
    </bean>

    <!--mybatis与Spring整合 开始 -->
    <bean id="sqlSessionFactory_jed" name="sqlSessionFactory_jed" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:mybatis/jed/mybatis-config.xml"></property>
        <property name="dataSource" ref="dynamicDataSource_jed" />
        <property name="mapperLocations" value="classpath:mybatis/jed/Band(或者此处填 *)-mapper.xml" />
        <property name="typeAliasesPackage" value="com.ceshi.dto.ceshi" />
    </bean>

    <bean name="mapperScannerConfigurer3" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_jed"/>
        <property name="basePackage" value="com.jd.vd.manage.dao_jed" />
    </bean>
    <!-- 数据源3 end-->
    
</beans>

mybatis-config.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>
    <settings>
        <!-- 全局映射器启用缓存 -->
        <setting name="cacheEnabled" value="true" />
        <!-- 查询时,关闭关联对象即时加载以提高性能 -->
        <setting name="lazyLoadingEnabled" value="true" />
        <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->
        <setting name="aggressiveLazyLoading" value="false" />
        <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->
        <setting name="multipleResultSetsEnabled" value="true" />
        <!-- 允许使用列标签代替列名 -->
        <setting name="useColumnLabel" value="true" />
        <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->
        <!--  <setting name="useGeneratedKeys" value="true" /> -->
        <!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->
        <setting name="autoMappingBehavior" value="FULL" />
        <!-- 对于批量更新操作缓存SQL以提高性能 -->
        <!-- <setting name="defaultExecutorType" value="BATCH" /> -->
        <!-- 数据库超过25000秒仍未响应则超时 -->
        <setting name="defaultStatementTimeout" value="0" />
        <!--强制指定MyBatis使用log4j作为日志日志框架,若不指定那么当部署到如Tomcat等应用容器时,会被容器设置为使用common-logging来记录日志-->
        <setting name="logImpl" value="LOG4J"/>
    </settings>

</configuration>

二  创建动态数据源的工具类

DynamicDataSource.java
package com.util.jed;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {  
    
    private static final Logger logger = LoggerFactory.getLogger(DynamicDataSource.class);

    /** 
     * Description: 自动查找datasource 
     * @return 
     */  
    @Override  
    protected Object determineCurrentLookupKey() {  return JEDDBContextHolder.getDbType();
    }  
  
}  

JEDContextHolder.java

package com.util.jed;
public class JEDContextHolder { /** * 线程threadlocal */ private static ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static String DB_TYPE_RW_JED = "master_jed"; public static String DB_TYPE_R_JED = "slave_jed"; public static String getDbType() { String db = contextHolder.get(); if (db == null) { db = DB_TYPE_RW_JED;// 默认是读写库 } return db; } /** * * 设置本线程的dbtype */ public static void setDbType(String str) { contextHolder.set(str); } /** * clearDBType * * @Title: clearDBType * @Description: 清理连接类型 */ public static void
clearDBType() { contextHolder.remove(); } }

三  创建其他必要文件

JedDao.java
package com.jed.dao_jed;

import com.jed.Jed;
import org.springframework.stereotype.Repository;

@Repository("jedDao")
public interface JedDao {
    Jed selectJed(Jed jed);
}

Jed-mapper.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.jed.dao_jed.JedDao">
  <sql id="Base_Column" >
      id,
      title
   </sql>
    <sql id="COMMON">
        <trim prefix="WHERE" prefixOverrides="AND | OR">
            <if test="minId!=null and minId!=''">
                <![CDATA[
                          and id >= #{minId}
                    ]]>
            </if>
            <if test="uploadTimeBegin!=null and uploadTimeBegin!=''">
                <![CDATA[
                        and create_time >= #{uploadTimeBegin}
                ]]>
            </if>
            <if test="uploadTimeEnd!=null and uploadTimeEnd!=''">
                <![CDATA[
                        and create_time <= #{uploadTimeEnd}
                ]]>
            </if>
         
        </trim>
    </sql>

   <select id="selectJed" parameterType="Jed" resultType="Jed">
      select <include refid="Base_Column" /> from jed  <include refid="COMMON" />  limit 1
  </select>

</mapper>

impl.java

 Jed jed = new Jed();
 Jed.setId(id);
 JEDContextHolder.setDbType(JEDContextHolder.DB_TYPE_R_JED);
 jed = jedDao.selectJed(jed);
原文地址:https://www.cnblogs.com/Rnan/p/10684297.html