Spring MyBatis多数据源(同包)

  分包的同学点这里:Spring MyBatis多数据源(包)


创建基本的包 entity service dao     为了区分多数据源   一个用的是Mysql  一个是Oracle  方便测试,


   创建MyBatis dao 映射 xml 文件


创建db.properties

我这里设置了2个数据源 

创建Mybatis.xml 文件

建议创建2个,也可以创建一个.但是2个 耦合性降低


还需要用到工具类:

package com.cp.util.datasources;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * 动态切换数据库
 * 
 * @author Joey
 * @project:SSM_MultiDataSource_CP
 * @date:2017年4月27日
 * 
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

	@Override
	protected Object determineCurrentLookupKey() {
		return DataSourceContextHolder.getDbType();
	}

}

package com.cp.util.datasources;

/**
 * 数据库切换的工具类
 * 
 * @author Joey
 * @project:SSM_MultiDataSource_CP
 * @date:2017年4月27日
 * 
 */
public class DataSourceContextHolder {

	public static final String DATA_SOURCE_A = "dataSource1";
	public static final String DATA_SOURCE_B = "dataSource2";

	/** 数据源类型 */
	private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

	/**
	 * 设置数据源类型
	 * 
	 * @param dbType
	 *            数据源类型
	 */
	public static void setDbType(String dbType) {
		contextHolder.set(dbType);
	}

	/**
	 * 获取数据源类型
	 * 
	 * @return String
	 */
	public static String getDbType() {
		return ((String) contextHolder.get());
	}

	/**
	 * 清除数据源类型
	 */
	public static void clearDbType() {
		contextHolder.remove();
	}

}


package com.cp.util.datasources;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;

/**
 * 数据源前置增强
 * 
 * @author Joey
 * @project:SSM_MultiDataSource_CP
 * @date:2017年4月28日
 * 
 */
public class DataSourceAspect implements MethodBeforeAdvice,
		AfterReturningAdvice {

	@Override
	public void afterReturning(Object returnValue, Method method,
			Object[] args, Object target) throws Throwable {
		DataSourceContextHolder.clearDbType();
	}

	@Override
	public void before(Method method, Object[] args, Object target)
			throws Throwable {
		if (method.isAnnotationPresent(DataSource.class)) {
			DataSource datasource = method.getAnnotation(DataSource.class);
			DataSourceContextHolder.setDbType(datasource.value());
		} else {
			DataSourceContextHolder
					.setDbType(DataSourceContextHolder.DATA_SOURCE_A);
		}

	}
}

package com.cp.util.datasources;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 动态数据源(default:DataSourceContextHolder.DATA_SOURCE_A)
 * 
 * @author Joey
 * @project:SSM_MultiDataSource_CP
 * @date:2017年4月28日
 * 
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface DataSource {

	String value() default DataSourceContextHolder.DATA_SOURCE_A;

}


Spring配置文件 :

配置扫描包.

导入数据源连接信息


设置2个数据源


使用的是Druid 个人觉得不错。推荐一下


Druid的日志记录Filter



DynamicDataSource类是你刚刚自定义的工具类,上面有

导入2个数据源,默认数据源是DataSource1

事物管理  和  开启事物自动扫描注解   

加上前置增强 DataSourceAspect类也是你刚刚自定义的工具类,上面有


最重要的一步: 开启AOP注解支持

方法注解使用多数据源


在service里的方法要使用不同的数据源

方法直接注解:
@DataSource(DataSourceContextHolder.DATA_SOURCE_B)


默认的使用是A 可以自己配置

注意: DataSourceContextHolder类里的DATA_SOURCE_A 和 DATA_SOURCE_B 的值要和spring配置文件对应

可以自己去试试


附上楼主的源码

亲,点我去下载

posted @ 2017-05-09 15:20  試毅-思伟  阅读(71)  评论(0编辑  收藏  举报