TypechoJoeTheme

香草物语

统计
登录
用户名
密码
/
注册
用户名
邮箱
输入密码
确认密码

Spring Boot 2.0+ MyBatis-Plusg通过注解动态切换数据源

Laughing博主
2021-04-24
/
3 评论
/
1,090 阅读
/
320 个字
/
百度已收录
04/24
本文最后更新于2024年03月20日,已超过56天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

Spring Boot 2.0+ ByBatis-Plus动态切换数据源 - 香草物语 (xiangcaowuyu.net)中我们介绍了如何实现多个数据源的切换。但是我们切换数据源时,是通过DynamicDataSourceContextHolder手动切换的,如果每次都这么设置,明显不恰当。所以我们这里介绍一下通过注解的方式实现数据源的切换。

定义注解

/**
 * 自定义多数据源切换注解
 *
 * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准
 * 如果传递value,则切换到value对应的数据源
 *
 * @author laughing
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DataSource {

    String value() default "";

}
  • 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准
  • 如果传递value,则切换到value对应的数据源

定义切面

/**
 * 动态数据源切面拦截
 * 请注意:这里order一定要小于tx:annotation-driven的order,即先执行DynamicDataSourceAspectAdvice切面,再执行事务切面,才能获取到最终的数据源
 *
 * @author laughing
 * @version 1.0
 */
@Slf4j
@Aspect
@Component
@Order(1)
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class DynamicDataSourceAspect {

    @Pointcut("@annotation(net.xiangcaowuyu.dynamicdatasource.annotation.DataSource) || @within(net.xiangcaowuyu.dynamicdatasource.annotation.DataSource)")
    public void dsPointCut() {

    }

    @Around("dsPointCut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = servletRequestAttributes.getRequest();
        try {
            //1.取注解的参数
            DataSource dataSource = getDataSource(joinPoint);
            if (dataSource != null && !StringUtils.isEmpty(dataSource.value())) {
                DynamicDataSourceContextHolder.setDataSourceKey(dataSource.value());
                return joinPoint.proceed();
            }
            //2.模拟参数
            String dynamicDataSource = request.getParameter("dynamicDataSource");
            if (!StringUtils.isEmpty(dynamicDataSource)) {
                DynamicDataSourceContextHolder.setDataSourceKey(dynamicDataSource);
                return joinPoint.proceed();
            }
            return joinPoint.proceed();
        } finally {
            //每次使用完成,清空数据源
            DynamicDataSourceContextHolder.clearDataSourceKey();
        }
    }

    /**
     * 获取需要切换的数据源
     */
    public DataSource getDataSource(ProceedingJoinPoint point) {
        MethodSignature signature = (MethodSignature) point.getSignature();
        DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class);
        if (Objects.nonNull(dataSource)) {
            return dataSource;
        }
        return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class);
    }


}

测试

获取数据源1的数据

@DataSource(value = "dynamicDataSourceOne")
@GetMapping("listTableOne")
public List<TableOne> listTableOne() {
    return tableOneMapper.selectList(new QueryWrapper<>());
}

获取数据源2的数据

@DataSource(value = "dynamicDataSourceTwo")
@GetMapping("listTableTwo")
public List<TableTwo> listTableTwo(){
    return tableTwoMapper.selectList(new QueryWrapper<>());
}

根据参数,系统动态切换数据源

@DataSource
@GetMapping("tableList")
public String tableList(){
    return "当前数据源为:"+DynamicDataSourceContextHolder.getDataSourceKey();
}
朗读
赞(1)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

香草物语

评论 (3)
  1. 小猫 闲逛
    Windows 10 · Google Chrome

    {!{data:image/webp;base64,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}!}

    2021-04-24 回复
  2. 威哥 闲逛
    Windows 10 · UC Browser

    下载试试,谢谢!

    2019-02-17 回复
  3. 曹震 博主
    Windows 10 · Google Chrome

    解决了我的问题。非常感谢。可能由于版本不同,部分切换数据源代码不同。

    2022-12-08 回复

互动读者

  • Laughing闲逛

    评论 1 次 | 文章 541 篇

  • 芽儿哟闲逛

    评论 1 次 | 文章 0 篇

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月