为了账号安全,请及时绑定邮箱和手机立即绑定

Spring MyBatis多数据源(同包)

标签:
Java Spring

创建基本的包 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


作者:試毅_思伟


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消