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配置文件 :


image.png

配置扫描包.
导入数据源连接信息

设置2个数据源


image.png

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


image.png

Druid的日志记录Filter


image.png

DynamicDataSource类是你刚刚自定义的工具类,上面有
导入2个数据源,默认数据源是DataSource1


image.png

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

image.png

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

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


方法注解使用多数据源

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

方法直接注解:

@DataSource(DataSourceContextHolder.DATA_SOURCE_B)

默认的使用是A 可以自己配置
注意: DataSourceContextHolder类里的DATA_SOURCE_A 和 DATA_SOURCE_B 的值要和spring配置文件对应


image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,188评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,171评论 6 342
  • 周二的时候,在YY上给校友进行了一场分享。今天把其整理成文。一、产品经理日常做的是什么?从我目前的工作来说,日常的...
    脚下日月阅读 5,089评论 1 8
  • 我和媛从小就认识,初中又分到了一个班,于是形影不离,初中嘛,没有小学那样单纯,也没有高中那样真心,天天尔虞我诈。...
    微叹人心阅读 3,169评论 0 0
  • 夜色是一种很奇妙的境界。身在其中,人会自然地变得安静。 今天,临时起意,和朋友一起跑到河边钓鱼。不料,鱼线被扯,只...
    孤独观棋阅读 1,247评论 0 0

友情链接更多精彩内容