文章目录

  • 前言
  • 业务逻辑
  • 使用Mybatis实现
  • 使用Mybatis-plus实现

前言

​ 工作的时候,遇到了需要将一个数据库的一些数据插入或更新到另一个数据库。一开始使用insert into TABLE (col1,col2) VALUES (val1,val2) ON DUPLICATE KEY update col1 = "val1"; (这句sql语句的意思是:将val1,val2值插入到TABLE表的col1和col2字段中,如果出现主键或唯一冲突,就进行更新,只将col1值更新为val1)进行数据的插入和更新。但是每次都要对着这一条sql语句进行修改,十分麻烦,就想着能否同时连接两个数据库进行业务处理。

业务逻辑

使用Mybatis实现

首先,如果你的项目用的是Mybatis,那么以下配置可以实现配置多数据源,连接多数据库的作用。但是,如果你使用的是Mybatis-plus,本人建议使用Mybatis-plus实现更加简单易操作。

1、在yml配置文件中配置多数据库,例如:

spring:application:name: CONNECTIONdatasource:db1:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/test?serverTimezone=UTCusername: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSourcedb2:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://11.11.11.11:3306/test?serverTimezone=UTCusername: rootpassword: 654321type: com.alibaba.druid.pool.DruidDataSource

注意,将数据库配置中的url改为jdbc-url,否则无法配置多数据源。

2、创建不同的mapper,用于不同的数据库。

3、编写数据源的配置类,例如:

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
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;@Configuration
@MapperScan(basePackages = "com.czf.connect.mapper.db1", sqlSessionTemplateRef  = "db1SqlSessionTemplate")
//此处的basePackages指向的是你存放数据库db1的mapper的包
public class DataSource1Config {@Bean(name = "db1DataSource")@ConfigurationProperties(prefix = "spring.datasource.db1")//指向yml配置文件中的数据库配置@Primary    //主库加这个注解,修改优先权,表示发现相同类型bean,优先使用该方法。public DataSource dbDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "db1SqlSessionFactory")@Primarypublic SqlSessionFactory dbSqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*xml"));//这个的getResources指向的是你的mapper.xml文件,相当于在yml中配置的mapper-locations,此处配置了yml中就不用配置,或者说不会读取yml中的该配置。return bean.getObject();}@Bean(name = "db1TransactionManager")@Primarypublic DataSourceTransactionManager dbTransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean(name = "db1SqlSessionTemplate")@Primarypublic SqlSessionTemplate dbSqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}
}

数据库db2的配置类:

@Configuration
@MapperScan(basePackages = "com.czf.connect.mapper.db2", sqlSessionTemplateRef  = "db2SqlSessionTemplate")
public class DataSource2Config {@Bean(name = "db2DataSource")@ConfigurationProperties(prefix = "spring.datasource.db2")public DataSource dbDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "db2SqlSessionFactory")public SqlSessionFactory dbSqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*xml"));return bean.getObject();}@Bean(name = "db2TransactionManager")public DataSourceTransactionManager dbTransactionManager(@Qualifier("db2DataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean(name = "db2SqlSessionTemplate")public SqlSessionTemplate dbSqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}
}

整体结构:

至此,需要修改或查询哪个数据库,只需要在对应的com///mapper/db包中创建对应的mapper类或者编写特定的sql语句即可。

使用Mybatis-plus实现

多数据源 | MyBatis-Plus (baomidou.com)

Mybatis-plus官网很清楚的告诉了我们如何配置多数据源。

1、引入dynamic-datasource-spring-boot-starter。

<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>${version}</version>
</dependency>

2、配置数据源。

spring:datasource:dynamic:primary: mysql1 #设置默认的数据源或者数据源组,默认值即为mysql1strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源datasource:mysql1:url: jdbc:mysql://xx.xx.xx.xx:3306/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置mysql2:url: jdbc:mysql://xx.xx.xx.xx:3307/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Drivermysql2:url: ENC(xxxxx) # 内置加密,使用请查看详细文档username: ENC(xxxxx)password: ENC(xxxxx)driver-class-name: com.mysql.jdbc.Driver#......省略

3、使用 @DS 切换数据源。

@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解

注解 结果
没有@DS 默认数据源
@DS(“dsName”) dsName可以为组名也可以为具体某个库的名称
@Service
@DS("mysql1")
public class UserServiceImpl implements UserService {@Autowiredprivate JdbcTemplate jdbcTemplate;public List selectAll() {return  jdbcTemplate.queryForList("select * from user");}@Override@DS("mysql2")public List selectByCondition() {return  jdbcTemplate.queryForList("select * from user where age >10");}
}

在这里会有个小问题,假如我编写了两个方法,方法A使用的是 @DS(“mysql1”) ,功能是查询mysql1中的数据;方法B调用的是@DS(“mysql2”),是将数据插入到mysql2数据库中,那么我想在方法B中调用方法A,实现mysql1中查询的数据插入到mysql2中,能够成功吗?

答案是:不可以。

要想实现这个功能,我们可以使用多数据源的一个类,简单来说是一个队列,将需要使用到的数据源push进行,不用时再poll掉。就不用使用@DS注解了。

比如:

@RequestMapping("/Bmetohd")
public int Bmethod(){DynamicDataSourceContextHolder.push("mysql1");List<User> users = Amethod();DynamicDataSourceContextHolder.poll();DynamicDataSourceContextHolder.push("mysql2");int num = 0;for(User user: users){int i = User2Mapper.insert(user);num += i;}DynamicDataSourceContextHolder.poll();return num;
}

重点:

DynamicDataSourceContextHolder.push("mysql1");
//业务代码
DynamicDataSourceContextHolder.poll();

Mybatis | Mybatis-plus配置多数据源,连接多数据库相关推荐

  1. mybatis开启log_mybatis使用spring-druid数据源连接池配置log4j打印sql语句以及开启监控平台...

    杂七杂的杂 作为程序员,开发工程中,一套利于测试或者监控的工具很重要,mybatis默认没有提供log4j的打印sql语句的配置. 这对于开发rest服务,提供接口的开发者而言,是在很不好做,再加上m ...

  2. jndi weblogic mysql_Tomcat配置JNDI数据源连接池

    [Tomcat数据源连接池加密] Tomcat 5.0.28 Jndi配置: 1)部署你的应用到Tomcat,并且确保能正常访问. 2)进放admin控制台,如果你无法进入控制台,请参考常用的一些Ja ...

  3. Confluence 6 新 Confluence 安装配置一个数据源连接

    如果在你的 Tomcat 中配置了数据源,并且Confluence 设置指南在安装的时候检测到这个配置的时候,配置数据源的选项将会提供给你进行配置.入股你希望使用数据源,请参考下面的配置. 1. 停止 ...

  4. cognos配置oracle数据源连接,Cognos连接Oracle数据库

    安装好cognos服务和Oracle数据库后,接下来要将两者连接起来,并且配置好数据源才可以依次建模及报表rs制作. 1.新建数据源连接: 1)打开Cognos Connection页面,启动 IBM ...

  5. 数据源odbc oracle,ODBC数据源连接Oracle数据库示例

    配置ODBC数据源 1.选择"Microsoft ODBC for Oracle" 2.数据源名:连接字符串中的名字 / 用户名: 数据库名字(SID名)/服务器名:数据库服务器I ...

  6. windows10配置mysql数据源_将数据库添加为数据源

    希望使用哪种数据提供程序? 通过SharePoint Designer 2010, 你可以使用三个不同数据提供程序中的任意一个连接到数据库. 这些数据提供程序不是相互排斥的. 例如, microsof ...

  7. sql数据库配置php,php 连接mssql数据库与配置方法

    php 连接mssql数据库与配置方法 下面要来告诉各位朋友php连接mssql数据库并且与php mssql配置方法哦,这样如果你是初学者这文章可以让你从配置mssql 到让php连接mssql数据 ...

  8. 总结Linux-ubuntu基本配置方法(远程连接,数据库,jdk,tomcat......)

    1.远程连接 最小化安装ubuntu之后,一开始是不能直接使用Xshell等工具进行远程连接的,需要安装ssh服务,首先得两个主机可以互相ping通,接着输入:sudo apt-get install ...

  9. 配置ODBC驱动连接DM8数据库

    一.ODBC介绍 ODBC提供访问不同类型的数据库的途径.结构化查询语言 SQL 是一种用来访问数据库的语言.通过使用 ODBC,应用程序能够使用相同的源代码和各种各样的数据库交互.这使得开发者不需要 ...

  10. 2.Eclipse上mysql插件配置及远程连接云数据库测试

    一.下载jar包 直接从网站下载 https://dev.mysql.com/downloads/connector/j/ 或者直接从我的分享下载jar包 链接:https://pan.baidu.c ...

最新文章

  1. 在web.xml文件中配置Servlet时,主要配置哪些信息?
  2. pytorch遇见RuntimeError: CUDA out of memory的解决
  3. Linux下利用rsync实现多服务器文件同步
  4. python创建字典型数据_Python数据类型之字典dict
  5. 《Zabbix安装部署-1》-Centos7
  6. idea ctrl+shift+f快捷键失效
  7. python绘制k线图的步骤_Python使用PyQtGraph绘制股票行情K线图
  8. 使用nodejs构建Docker image最佳实践
  9. linux 一个超简单的makefile
  10. get_metrology_object_measures获取测量区域和计量模型的计量对象的边缘位置结果
  11. UE3客户端服务器GamePlay框架
  12. 【转】Windows7硬盘安装Linux
  13. pytorch梯度的计算过程
  14. 数据迁移-商品数据迁移实践
  15. CAM(内容可寻址存储器)的认知
  16. spring的IOC——依赖注入的两种实现类型
  17. Ae:Keylight(1.2)(中英对照)
  18. 深度置信网络(DBN)
  19. 数据流图转换为软件结构图
  20. 冬日魔幻之旅-seata+dubbo+nacos+springboot解决分布式事务的全网段唯一实践之作(上)

热门文章

  1. 我的世界版链游Titan Hunters,泰坦猎人研报实测
  2. 买二手房(存量房)注意点
  3. C++ 坑人小程序(全集)
  4. python Matplotlib 控制x轴和y轴都为整数
  5. super()函数的使用
  6. Ueditor编辑器实战 HTML / vue+v-model
  7. canvas实现高斯模糊
  8. 2020年校招[随手更新]
  9. SAP FICO - Chart of Accounts(COA) 会计科目表/ 将公司代码分配给会计科目表
  10. sw运行很卡怎么办_打开SolidWorks软件卡顿怎么办?教你完美解决