zoukankan      html  css  js  c++  java
  • Spring MyBatis多数据源(同包)

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


    2743275-404607e3725e15d5.png

    创建MyBatis dao 映射 xml 文件


    2743275-1857ab0807c6345e.png

    创建db.properties


    2743275-f99b58b6ff9b426b.png

    我这里设置了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配置文件 :


    2743275-99a6d2a18acebb76.png
    image.png

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

    设置2个数据源


    2743275-4801afccf4407d9a.png
    image.png

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


    2743275-517c238325de87fc.png
    image.png

    Druid的日志记录Filter


    2743275-597b379eeed52c83.png
    image.png

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


    2743275-c2b32bdd12093788.png
    image.png

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

    2743275-879ebbbcc96a1012.png
    image.png

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

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


    2743275-0b48ce804ed545d7.png

    方法注解使用多数据源

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

    方法直接注解:

    @DataSource(DataSourceContextHolder.DATA_SOURCE_B)
    

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


    2743275-ef16f37443730974.png
    image.png
  • 相关阅读:
    Asp.Net WebApi核心对象解析(一)
    关于.NET参数传递方式的思考
    关于.NET异常处理的思考
    吃瓜群众的三言两语,想听的就进来看看吧!
    C#文件安全管理解析
    开源免费且稳定实用的.NET PDF打印组件itextSharp(.NET组件介绍之八)
    免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
    免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)
    免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)
    免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
  • 原文地址:https://www.cnblogs.com/zhousiwei/p/10625748.html
Copyright © 2011-2022 走看看