zoukankan      html  css  js  c++  java
  • 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配置文件对应

    可以自己去试试


    附上楼主的源码

    亲,点我去下载

    chuagn 创建

  • 相关阅读:
    【题解】【BT】【Leetcode】Populating Next Right Pointers in Each Node
    【题解】【BT】【Leetcode】Binary Tree Level Order Traversal
    【题解】【BST】【Leetcode】Unique Binary Search Trees
    【题解】【矩阵】【回溯】【Leetcode】Rotate Image
    【题解】【排列组合】【素数】【Leetcode】Unique Paths
    【题解】【矩阵】【回溯】【Leetcode】Unique Paths II
    【题解】【BST】【Leetcode】Validate Binary Search Tree
    【题解】【BST】【Leetcode】Convert Sorted Array to Binary Search Tree
    第 10 章 判断用户是否登录
    第 8 章 动态管理资源结合自定义登录页面
  • 原文地址:https://www.cnblogs.com/zhousiwei/p/10625796.html
Copyright © 2011-2022 走看看