欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring mybatis多数据源切换(2)

程序员文章站 2022-03-11 21:29:41
...
在上一篇文章中写到,多数据源的切换是使用Java代码调用的,现在使用注解去做数据源的切换。
1、首先新建注解的类。
package com.winning.common.mybatis;

import java.lang.annotation.*;

/**
 * Created by TonyJ on 2019/6/12.
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface DS {
    String value() default "dataSource";
}



2、创建切面的类
package com.winning.common.mybatis;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;

import java.lang.reflect.Method;

/**
 * Created by TonyJ on 2019/6/12.
 */
@Order(1)
@Aspect
public class DynamicDataSourceAspect {

   //使用DS注解动作之后清除
   @After("@annotation(DS)")
   public void afterSwitchDS(JoinPoint point){
       System.out.println("清除当前数据源"+DataSourceContextHolder.getDbType());
       DataSourceContextHolder.clearDbType();
   }

    //使用DS注解动态切换
    @Before("@annotation(DS)")
    public void beforeSwitchDS(JoinPoint point){
        //获得当前访问的class
        Class<?> className = point.getTarget().getClass();
        //获得访问的方法名
        String methodName = point.getSignature().getName();
        //得到方法的参数的类型
        Class[] argClass = ((MethodSignature)point.getSignature()).getParameterTypes();
        String dataSource = "dataSource";
        try {
            // 得到访问的方法对象
            Method method = className.getMethod(methodName, argClass);
            // 判断是否存在@DS注解
            if (method.isAnnotationPresent(DS.class)) {
                DS annotation = method.getAnnotation(DS.class);
                // 取出注解中的数据源名
                dataSource = annotation.value();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("当前数据源"+dataSource);
        // 切换数据源
        DataSourceContextHolder.setDbType(dataSource);
    }


}


3、在xml文件增加切面类的配置
 <!-- 配置数据库注解aop -->
    <bean id="dataSourceAspect" class="com.winning.common.mybatis.DynamicDataSourceAspect" />

    <aop:config>
    <!--
        切割点:pointcut
            第一个*:任意返回值
            第二个*:类名(任意类)
            第三个*:方法名(任意方法)
            (..):0-n参数,类型任意
     -->
    <aop:pointcut id="pointCut" expression="execution(* com.winning.*.service.*.*(..))" />
    <!--切割注入事物 ,植入事务:advisor-->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut"/>
    </aop:config>

4、在具体的方法上面调用
@Override
	@DS("dataSource2")
	public List<Map<String, Object>> querySyhjAllDatasByParams(
			Map<String, Object> params) throws Exception {
		return sysLogDao.querySyhjAllDatasByParams(params);
	}

5、调用类的正常使用:
package com.winning.dataservice;

import com.winning.common.mybatis.DataSourceContextHolder;
import com.winning.common.service.SysLogService;
import com.winning.common.web.annotator.RequestMap;
import com.winning.common.web.controller.AbstractController;
import com.winning.common.web.entity.MapAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by TonyJ on 2019/6/5.
 */
@Controller
@RequestMapping("/test")
public class TestController extends AbstractController {

    @Autowired
    private SysLogService sysLogService;


    @RequestMapping(value = "list")
    public @ResponseBody
    Map list(@RequestMap MapAdapter mapAdapter, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Map param= new HashMap();
        //注意这里在调用service前切换到dataSource22的数据源
        //DataSourceContextHolder.setDbType("dataSource2");
        List<Map> dataList = sysLogService.querySyhjAllDatasByParams(param);
        return dataList.get(0);
    }
}


6、调用结果展示

spring mybatis多数据源切换(2)
            
    
    博客分类: SSH+i/mbatis  


  • spring mybatis多数据源切换(2)
            
    
    博客分类: SSH+i/mbatis  
  • 大小: 10.7 KB