单数据源,就是创建一个连接池,然后在创建mybatis的SqlSessionFactoryBean时,指定这个数据源。
多数据源:创建多个连接池,将这多个连接池统一起来管理,通过key-value方式,我们在使用时指定哪个key,则使用哪个数据源,我们只需要继承spring帮我们写好的这个类。
package cn.fzq.ds;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
* Created by Blossom on 2018/11/13.
*/
public class DbcontextHolder extends AbstractRoutingDataSource {
public static final String DATASOURCE = "dataSource";
public static final String DATASOURCE_DEMO = "dataSourceDemo";
public static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
/**
* 设置当前数据源
* @param dbType
*/
public static void setDbType(String dbType){
contextHolder.set(dbType);
}
/**
* 获得当前数据源
* @return
*/
public static String getDbType(){
String dbType = (String)contextHolder.get();
return dbType;
}
/**
* 清除上下文,remove掉我们此次设置的数据源,恢复到默认数据源
*/
public static void clearContext(){
contextHolder.remove();
}
@Override
protected Object determineCurrentLookupKey() {
return DbcontextHolder.getDbType();
}
}
<!-- 读取config.properties文件,配置连接池 -->
<util:properties id="config" location="classpath:config.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="#{config.classname}"/>
<property name="url" value="#{config.url}"/>
<property name="username" value="#{config.username}"/>
<property name="password" value="#{config.password}"/>
</bean>
<bean id="dataSourceDemo" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="#{config.classname}"/>
<property name="url" value="#{config.url}"/>
<property name="username" value="#{config.username_demo}"/>
<property name="password" value="#{config.password_demo}"/>
</bean>
<bean id="dynamicDataSource" class="cn.fzq.ds.DbcontextHolder" >
<property name="targetDataSources">
<map key-type="java.lang.String">
<!--通过不同的key决定用哪个dataSource-->
<entry value-ref="dataSource" key="dataSource"></entry>
<entry value-ref="dataSourceDemo" key="dataSourceDemo"></entry>
</map>
</property>
<!--设置默认的dataSource-->
<property name="defaultTargetDataSource" ref="dataSource">
</property>
</bean>
<!-- 配置SqlSessionFactoryBean -->
<bean id="ssfb" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定连接池的位置 -->
<property name="dataSource" ref="dynamicDataSource"/>
<!-- 指定映射文件的位置 -->
<property name="mapperLocations" value="classpath:cn/fzq/entity/*.xml"/>
</bean>
<!-- 配置MapperScannerConfigurer扫描 -->
<!-- 指定映射器的位置 -->
<bean id = "mapperScanner" class = "org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name = "basePackage" value = "cn.fzq.dao"></property>
</bean>