继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Spring MyBatis多数据源(同包)

試毅_思伟
关注TA
已关注
手记 17
粉丝 18
获赞 121

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


webp

创建MyBatis dao 映射 xml 文件


webp

创建db.properties


webp

我这里设置了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)@Documentedpublic @interface DataSource {    String value() default DataSourceContextHolder.DATA_SOURCE_A;

}

Spring配置文件 :


webp

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

设置2个数据源


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


webp

Druid的日志记录Filter


webp

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


webp

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

webp


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

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


webp

方法注解使用多数据源

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

方法直接注解:

@DataSource(DataSourceContextHolder.DATA_SOURCE_B)

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


webp


作者:試毅_思伟


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP