Spring MyBatis多数据源(同包)

时间:2023-03-08 17:21:57

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

  

Spring MyBatis多数据源(同包)

  创建MyBatis dao 映射 xml 文件

  

Spring MyBatis多数据源(同包)

  创建db.properties

  

Spring MyBatis多数据源(同包)

  我这里设置了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 ThreadLocalcontextHolder = new ThreadLocal(); /**

  * 设置数据源类型

  *

  * @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)@Documentedpublic @interface DataSource { String value() default DataSourceContextHolder.DATA_SOURCE_A;

  }

  Spring配置文件 :

  

Spring MyBatis多数据源(同包)

  配置扫描包.

  导入数据源连接信息

  设置2个数据源

  

Spring MyBatis多数据源(同包)

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

  

Spring MyBatis多数据源(同包)

  Druid的日志记录Filter

  

Spring MyBatis多数据源(同包)

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

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

  

Spring MyBatis多数据源(同包)

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

  

Spring MyBatis多数据源(同包)

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

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

  

Spring MyBatis多数据源(同包)

  方法注解使用多数据源

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

  方法直接注解:

  @DataSource(DataSourceContextHolder.DATA_SOURCE_B)

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

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

Spring MyBatis多数据源(同包)