在上一篇文章中写到,多数据源的切换是使用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、调用结果展示
- 大小: 10.7 KB
分享到:
相关推荐
spring mybatis 多数据源动态切换
spring整合mybatis多数据源切换 可以运行的demo实例
mybatis+spring实现动态切换数据源,修改数据源配置信息之后,直接运行test可进行测试
Mybatis+Spring+SpringMVC+quartz多数据源切换 定时任务 多数据库之间同步
springboot+druid+mybatis多数据源动态切换,基于sql类型完成读写分离操作
SpringBoot整合mybatis-plus实现多数据源的动态切换且支持分页查询,案例以postgresql和oracle数据库为数据源,分别使用mybatis-plus分页插件和pagehelper分页插件实现分页查询。
Spring-boot+mybatis多数据源整合(动态切换数据源),亲测可用
使用springboot + JPA / MyBatis 实现多数据源动态切换
springboot实现数据源动态切换 注意事项: 1. 该demo采用yml配置数据库信息,注意url标签为jdbc-url 2.项目中加了日志输出,可看到完整执行过程 3.在Service中应用事务时,自定义的注解将失效,解决办法:可将注解...
mybatis+spring实现动态切换数据源,修改数据源配置信息之后,直接运行test可进行测试 maven项目 导入即可 jar包都不用 适合学习参考 出自Java自学网 (Java自学网专供 就是免积分下载)
spring-boot集成mybatis+druid实现 hive/mysql多数据源切换,用mysql数据库作为用户验证库以及用户信息库,hive作为数据可视化源库。
Spring+SpringMvc+MybatisPlus实现多数据源切换、利用自定义Aop注解,只需要在需要切换数据库的方法上加上注解即可实现、极大避免了代码冗余。
SpringMVC+Mybatis(多数据源)+Mongo(多数据源),框架适合同时访问多种DB,且支持每种DB配置多个数据源。正如我代码中的demo,配置了两个mysql数据源+2个mongo数据源,可以在service实现中随意访问。除此之外还通过...
springboot+mybatis结合,多数据源配置,并实现注解aop动态切换,可实现读写分离,maven结构。
使用aop进行多数据源切换 springMVC+spring+mybatis增删改查的使用。dk8+tomcat8+mysql+Eclipse+maven。spring+spring mvc+mybatis+bootstrap+jquery
spring boot mybatis plus 多数据源切换的demo解压运行
SpringBoot+Druid+MyBatis实现多数据源切换
主要介绍了Spring + Mybatis 项目实现动态切换数据源的相关资料,需要的朋友参考下吧
Spring Boot整合Mybatis使用druid实现多数据源自动切换
下面小编就为大家带来一篇spring boot+mybatis 多数据源切换(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧