spring mybatis多数据源切换(2)
程序员文章站
2022-03-11 21:29:41
...
在上一篇文章中写到,多数据源的切换是使用Java代码调用的,现在使用注解去做数据源的切换。
1、首先新建注解的类。
2、创建切面的类
3、在xml文件增加切面类的配置
4、在具体的方法上面调用
5、调用类的正常使用:
6、调用结果展示
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 Boot 整合mybatis 与 swagger2
-
Spring Boot+Mybatis+Druid+PageHelper实现多数据源并分页的方法
-
spring 整合 mybatis 中数据源的几种配置方式(总结篇)
-
Spring Boot + Mybatis多数据源和动态数据源配置方法
-
详解Spring Boot + Mybatis 实现动态数据源
-
Spring Boot+Mybatis+Druid+PageHelper实现多数据源并分页的方法
-
Spring整合多数据源实现动态切换的实例讲解
-
Spring+Mybatis动态切换数据源的方法
-
spring 整合 mybatis 中数据源的几种配置方式(总结篇)
-
Spring Boot + Mybatis多数据源和动态数据源配置方法