在上一篇文章中写到,多数据源的切换是使用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多数据源"的示例提供了可运行的代码,帮助开发者理解和实践这一功能。 ...
在 `thc-datasources` 压缩包中,可能包含了更详细的配置示例、数据源切换注解的实现以及相关的辅助工具类,如 `DynamicDataSourceContextHolder`。读者可以结合这些资源,进一步理解和实践多数据源动态切换的实现。
通过以上步骤,我们就实现了MyBatis与Spring配合下的动态数据源切换。这种机制有助于在多租户系统、读写分离或者高可用架构中灵活地管理数据库访问,提高了系统的可扩展性和灵活性。在实际应用中,还需要考虑数据源...
8. **测试**:在名为`test`的文件中,可能包含了单元测试或集成测试代码,用于验证多数据源切换和读写分离的正确性。测试用例应该覆盖各种读写操作,确保在不同数据源间的切换无误。 理解并掌握这些知识点,开发者...
在现代企业级应用开发中,...通过灵活的配置和智能的路由策略,开发者可以轻松地处理复杂的数据源切换需求,提升系统的健壮性和可扩展性。实践这个示例,将进一步加深对Spring Boot和MyBatis在实际开发中的理解和运用。
在多数据源配置中,Spring能够帮助管理不同的数据源,通过配置bean来切换和控制数据源的使用。 **SpringMVC** 是Spring框架的一部分,专为Web开发设计。它简化了模型-视图-控制器(Model-View-Controller,MVC)的...
在企业级应用开发中,Spring、...具体实现时,可以根据项目需求选择合适的方式进行数据源切换,以达到优化性能、提高可扩展性的目的。通过合理配置和设计,可以有效地管理和利用多数据源,提升系统的灵活性和可靠性。
当我们的项目涉及到多数据源时,即需要连接并操作多个数据库,Spring Boot和MyBatis的整合就显得尤为重要。本文将深入探讨如何实现Spring Boot结合MyBatis的多数据源最简解决方案。 首先,我们来理解多数据源的需求...
总之,Spring+MyBatis多数据源配置是大型项目中常见的需求,它通过`AbstractRoutingDataSource`实现了动态数据源选择,结合MyBatis的Mapper接口和注解,可以方便地在多个数据库之间切换,从而满足复杂的数据库访问...
标题 "mybatis spring 多数据源" 涉及到的是在Java开发中,如何使用MyBatis和Spring框架来管理多个数据库连接。这通常在需要处理来自不同数据源的数据或者实现数据库读写分离的场景下应用。MyBatis是一个优秀的持久...
"Mybatis+Spring+SpringMVC+quartz多数据源切换"的架构设计就是为了满足这样的场景。这个项目结合了四个关键的技术组件,它们分别是Mybatis、Spring、SpringMVC和Quartz,下面将详细介绍这些技术以及它们在多数据源...
本项目“Spring+SpringMVC+Mybatis动态链接多数据源”旨在实现一个灵活、可扩展的数据源切换机制,以适应复杂的业务场景。 Spring框架作为Java领域中最广泛使用的轻量级框架,它提供了强大的依赖注入和AOP(面向切...
Spring3 整合 MyBatis3 配置多数据源动态选择 SqlSessionFactory 详细教程 本教程主要介绍了 Spring3 整合 MyBatis3 配置多数据源动态选择 SqlSessionFactory 的详细教程。下面将详细介绍如何实现 Spring 整合 ...
4. **动态数据源切换**:对于MyBatis,可以在SqlSessionTemplate中设置数据源,或者使用`@MapperScan`注解配合自定义数据源路由类来实现。 **六、实战项目分析** 在`springboot-multi-datasource-master`项目中,...
在SpringBoot项目中,整合Mybatis-Plus并实现多数据源的动态切换,同时支持分页查询是一项常见的需求。以下将详细阐述这个过程中的关键步骤和技术要点。 首先,我们需要引入必要的Maven依赖。这里提到了四个关键...
本教程将详细介绍如何在Spring Boot项目中整合Druid数据源池与Mybatis,实现多数据源切换的功能,并提供一个亲测可用的解决方案。 首先,让我们了解Spring Boot、Druid和Mybatis这三大组件的基础知识: **Spring ...
- AOP切面的Java类,实现了方法执行前后的拦截和数据源切换。 - 数据源相关的Java配置类,用于配置Spring的DataSource和MybatisPlus。 - Mapper接口和对应的XML文件,定义数据库操作。 - 业务逻辑层的Java类,其中的...
在实际的数据源切换逻辑中,可以使用Spring AOP或者自定义拦截器来实现。通过拦截SQL执行前后的操作,我们可以根据业务规则动态决定当前操作应该使用哪个数据源。例如,对于读操作,我们可以切换到读数据源;对于写...
Spring Boot 和 MyBatis 的组合提供了这样的灵活性,可以方便地进行多数据源配置。本项目实例将详细讲解如何在 Spring Boot 中集成 MyBatis 并配置多数据源。 首先,我们需要了解 Spring Boot 中的数据源配置。...