springboot+mybatis +yml文件配置多数据源
记录一下java开发中多数据源的配置过程,
参考博客:https://blog.csdn.net/weinichendian/article/details/72903757,我在这里进行了整理,使用yml;排除了里边在springboot2.0报错的内容,以及里边没有说太清楚的内容,进行了详细的说明
1.配置文件application.yml
personnel:#数据源1
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3307/person?useSSL=false&useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&allowMultiQueries=true&allowPublicKeyRetrieval=true
username: root
password: *******
userauth:#数据源2
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3307/user?useSSL=false&useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&allowMultiQueries=true&allowPublicKeyRetrieval=true
username: root
password: ******
2.不同数据源枚举:
public enum DataSourceEnum {master,slaver;}
3.枚举类工具 set
public class DataSourceContextHolder {
private static final ThreadLocal<DataSourceEnum> CONTEXT_HOLDER = new ThreadLocal<DataSourceEnum>() {
@Override
protected DataSourceEnum initialValue() {
return DataSourceEnum.master;
}
};
public static void setDataSourceType(DataSourceEnum type) {
CONTEXT_HOLDER.set(type);
}
public static DataSourceEnum getDataSourceType() {
return CONTEXT_HOLDER.get();
}
public static void resetDataSourceType() {
CONTEXT_HOLDER.set(DataSourceEnum.master);
}
}
4.自定义注解
@Retention(RetentionPolicy.RUNTIME) // 在运行时可见
@Target(ElementType.METHOD) // 注解可以用在方法上
public @interface DataSourceTypeAnno { //使用方式在service层方法上添加@DataSourceTypeAnno(DataSourceEnum.数据源枚举类型)用于指定所使用的数据源
DataSourceEnum value() default DataSourceEnum.master; }
5.aop拦截:这里使用asp的
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component; import java.lang.reflect.Method; @Component
@Aspect
@Order(-100)//为了保证可以拦截到
public class DataSourceAspect {
@Pointcut("execution(* com.yzy.*.*..*(..)) " + //这里扫描的切点包是主要是service层,根据service层方法的上边所说的的自定义注解,去判断所使用的数据源类型,并动态切换数据源
"&& @annotation(com.yzy.config.DataSourceTypeAnno)")
public void dataSourcePointcut() {
} @Around("dataSourcePointcut()")
public Object doAround(ProceedingJoinPoint pjp) {
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
Method method = methodSignature.getMethod();
DataSourceTypeAnno typeAnno = method.getAnnotation(DataSourceTypeAnno.class);
DataSourceEnum sourceEnum = typeAnno.value(); if (sourceEnum == DataSourceEnum.master) {
DataSourceContextHolder.setDataSourceType(DataSourceEnum.master);
} else if (sourceEnum == DataSourceEnum.slaver) {
DataSourceContextHolder.setDataSourceType(DataSourceEnum.slaver);
} Object result = null;
try {
result = pjp.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
} finally {
DataSourceContextHolder.resetDataSourceType();
} return result;
}
}
6.继承 AbstractRoutingDataSource 类,实现对应数据源key的切换
package com.yzy.config; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceType();
}
}
7.配置mybatisConfig=》数据源信息
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jdbc.DataSourceBuilder;//org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;该包在springboot2.0被取代,目前网上的都是这个springboot1.5的包,所以会一直报错
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map; @Configuration
@MapperScan(basePackages = "com.yzy.*.mapper")//扫描dao层mapper接口
public class MyBatisConfig { /**
* @return
* @throws Exception
* @Primary 必需指定一个且只能有一个主数据源,否则报错
*/
@Primary
@Bean("masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource.userauth")//根据数据源前缀到application.yml读取数据源信息//此处改变前缀可以改变默认数据源//
public DataSource masterDataSource() throws Exception {
return DataSourceBuilder.create().build();
} @Bean("slaverDataSource")
@ConfigurationProperties(prefix = "spring.datasource.personnel")//根据数据源前缀到application.yml读取数据源信息//可以配置更多数据源,到前提是application.yml中存在,而且也需要在枚举类中添加枚举类型
public DataSource slaverDataSource() throws Exception {
return DataSourceBuilder.create().build();
} /**
* @Qualifier 根据名称进行注入,通常是在具有相同的多个类型的实例的一个注入(例如有多个DataSource类型的实例)
* @DataSourceTypeAnno(DataSourceEnum.master)事务方法需要指定数据源
*/
@Bean("dynamicDataSource")
public DynamicDataSource dynamicDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("slaverDataSource") DataSource slaverDataSource) {
Map<Object, Object> targetDataSources = new HashMap<Object, Object>();
targetDataSources.put(DataSourceEnum.master, masterDataSource);
targetDataSources.put(DataSourceEnum.slaver, slaverDataSource); DynamicDataSource dataSource = new DynamicDataSource();
dataSource.setTargetDataSources(targetDataSources);// 该方法是AbstractRoutingDataSource的方法
dataSource.setDefaultTargetDataSource(masterDataSource);// 默认的datasource设置为myTestDbDataSource return dataSource;
} /**
* 根据数据源创建SqlSessionFactory
*/
@Bean
public SqlSessionFactory sqlSessionFactory(@Qualifier("dynamicDataSource") DynamicDataSource dynamicDataSource,
@Value("mybatis.type-aliases-package") String typeAliasesPackage) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dynamicDataSource);// 指定数据源(这个必须有,否则报错)
// 下边两句仅仅用于*.xml文件,如果整个持久层操作不需要使用到xml文件的话(只用注解就可以搞定),则不加
factoryBean.setTypeAliasesPackage(typeAliasesPackage);// 指定实体类所在的包 factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapping/**/*Mapper.xml"));//扫描mapper.xml文件包
return factoryBean.getObject();
} /**
* 配置事务管理器
*/
@Bean
public DataSourceTransactionManager transactionManager(DynamicDataSource dataSource) throws Exception {
return new DataSourceTransactionManager(dataSource);
}
}
springboot+mybatis +yml文件配置多数据源的更多相关文章
- 使用SpringBoot的yml文件配置时踩的一个坑
问题描述:使用SpringBoot整合redis进行yml配置的时候,启动工程报错,提示加载application.yml配置文件失败: ::27.430 [main] ERROR org.sprin ...
- 转载 Spring、Spring MVC、MyBatis整合文件配置详解
Spring.Spring MVC.MyBatis整合文件配置详解 使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. ...
- SpringBoot多重属性文件配置方案笔记
SpringBoot多重属性文件配置方案笔记 需要重写PropertyPlaceholderConfigurer 同时要忽略DataSourceAutoConfiguration @SpringBoo ...
- Springboot多属性文件配置
Springboot 多属性文件配置 配置文件后缀有两种: .properties和.yml 要完成多属性配置需要自定义PropertySourcesPlaceholderConfigurer 这个B ...
- Spring MVC、MyBatis整合文件配置详解
Spring:http://spring.io/docs MyBatis:http://mybatis.github.io/mybatis-3/ Building a RESTful Web Serv ...
- springboot yml 文件配置oracle,提示账号密码错误
最近使用Spring boot,本来一直连接的是mysql数据库,一直没问题.昨天在更换了oracle数据库后,一直提示账号密码不正确,登录被拒绝.检查多次,检查账号密码一切正常,但就是连接不上ora ...
- 【2.0】SpringBoot多环境yml文件配置
一.使用Spring Boot Profiles 1. 使用yml文件 首先,我们先创建一个名为 application.yml的属性文件,如下: server: port: 8080 my: nam ...
- SpringBoot Mybatis项目中的多数据源支持
1.概述 有时项目里里需要抽取不同系统中的数据源,需要访问不同的数据库,本文介绍在Springboot+Mybatis项目中如何支持多数据源操作. 有需要的同学可以下载 示例代码 项目结构如下: 2. ...
- Spring、Spring MVC、MyBatis整合文件配置详解
原文 http://www.cnblogs.com/wxisme/p/4924561.html 主题 MVC模式MyBatisSpring MVC 使用SSM框架做了几个小项目了,感觉还不错是时候总 ...
随机推荐
- Celery-系统守护进程
1. 使用systemd控制Celery 用法: systemctl {start|stop|restart|status} celery.service 配置文件: /etc/celery/cele ...
- Java进程故障排查思路及步骤
故障场景 Java进程出现问题,通常表现出如下现象: Web应用响应时间长/超时,甚至不响应 CPU使用率极高/低,频繁出现Full GC,甚至OutOfMemoryError 响应时间长.超时,甚至 ...
- 隐马尔科夫模型的Python3实现代码
下面给出计算隐马尔科夫模型的编程代码: from hmmlearn.hmm import GaussianHMM import datetime import numpy as np from mat ...
- 从支付宝SDK的支付流程理解什么是公钥和私钥,什么是加密和数字签名
------------------- 这是自己总结: 支付宝SDK支付用到的公钥与私钥整理如下: 1.商户应用公钥 2.商户应用私钥 3.支付宝公钥 4.支付宝私钥 商户应用的公钥与私钥生 ...
- 1-2docker-基本的使用
1.Docker 官⽅提供了⼀个公共的镜像仓库 https://hub.docker.com 2.获取镜像 docker pull [选项] [Docker Registry 地址[:端⼝]/]仓库名 ...
- IIS部署FLASK网站
在 Windows 平台部署基于 Python 的网站是一件非常折腾的事情,Linux/Unix 平台下有很多选择,本文记录了 Flask 部署到 IIS 的主要步骤,希望对你有所帮助. 涉及工具和平 ...
- Linux 就该这么学 CH04 VIM编辑器和Shell命令脚本
0 概述 1 Vim编辑器 在linux 中一切都是文件,而配置一个服务就是修改其配置文件的参数. vim 编辑器有三种模式:命令模式,末行模式和编辑模式. 命令模式:控制光标移动,对文件进行操作. ...
- shell 编写脚本批量Ping IP
服务器总是一下子买了很多的段的ip.通过绑定后,也不知道这些ip是否绑定成功,所以就写了一个shell脚本,把ip输好,批量ping一下,看是不是都能ping通. 脚本如下: 此外.还有一个ip文件, ...
- 一文读懂 IPv4 到 IPv6 的过渡技术
在介绍 IPv4 到 IPv6 过渡技术之前,我们先来简单了解一下 IPv4 和 IPv6.什么是 IPv4?IPv4 全称为 Internet Protocol version 4,它为互联网上的每 ...
- 阿里云负载均衡SLB上用免费的Let's Encrypt的SSL证书
Let's Encrypt是很火的一个免费SSL证书发行项目,自动化发行证书,证书有90天的有效期.Let's Encrypt已经发布了工具certbot,用此工具生成证书.证书续期非常简单. 以下是 ...