spring mybatis多数据源切换(2)
程序员文章站
2022-03-11 21:29:53
...
在上一篇文章中写到,多数据源的切换是使用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、调用结果展示
推荐阅读
-
通过AOP实现MyBatis多数据源的动态切换实例教程
-
Spring整合多数据源实现动态切换的实例讲解
-
Spring Boot2(二):使用Spring Boot2集成Mybatis缓存机制
-
spring boot多数据源动态切换代码实例
-
Spring+Mybatis动态切换数据源
-
springmvc+mybatis+pagehelper分页插件整合AbstractRoutingDataSource动态切换数据源(含例子代码)
-
springmvc+mybatis+pagehelper分页插件整合AbstractRoutingDataSource动态切换数据源(含例子代码)
-
MyBatis 2章 MyBatis与Spring整合
-
MyBatis 3章 MyBatis Spring Struts2 整合应用
-
MyBatis-21MyBatis高级结果映射【一对多映射(2种方式)】