网站报301错误,池州网站建设制作报价方案,网站建设评审验收会议主持词,如何做班级网站系列文章目录
MyBatis缓存原理 Mybatis plugin 的使用及原理 MyBatisSpringboot 启动到SQL执行全流程 数据库操作不再困难#xff0c;MyBatis动态Sql标签解析 从零开始#xff0c;手把手教你搭建Spring Boot后台工程并说明 Spring框架与SpringBoot的关联与区别 Spring监听器…系列文章目录
MyBatis缓存原理 Mybatis plugin 的使用及原理 MyBatisSpringboot 启动到SQL执行全流程 数据库操作不再困难MyBatis动态Sql标签解析 从零开始手把手教你搭建Spring Boot后台工程并说明 Spring框架与SpringBoot的关联与区别 Spring监听器用法与原理详解 Spring事务畅谈 —— 由浅入深彻底弄懂 Transactional注解 实战指南SpringBoot Mybatis 如何对接多数据源 系列文章目录一、数据源的定义二、单数据源配置三、如何配置多数据源1. 工程层级调整2. Spring项目配置3. 会话配置4. 事务管理器 四、验证总结 在我们开发一些具有综合功能的项目时往往会碰到一种情况需要同时连接多个数据库这个时候就需要用到多数据源的设计。而Spring 与 Myabtis 其实做了多数据源的适配只需少许改动即可对接多数据源。本期我们就贴近实战以一个单数据源的Demo为例讲述将其改为多数据源项目的过程希望大家能有所体会 作者简介战斧从事金融IT行业有着多年一线开发、架构经验爱好广泛乐于分享致力于创作更多高质量内容 本文收录于 Spring全家桶 专栏有需要者可直接订阅专栏实时获取更新 高质量专栏 云原生、RabbitMQ、Spring全家桶 等仍在更新欢迎指导 Zookeeper Redis kafka docker netty等诸多框架以及架构与分布式专题即将上线敬请期待 一、数据源的定义
数据源Data Source是指数据存储的地方大多数情况是指数据库不过文件服务器、传感器、API等也能算数据源主要是提供了对数据的访问和操作。数据源中存储了所有建立数据库连接的信息。就像通过指定文件名称可以在文件系统中找到文件一样通过提供正确的数据源名称你可以找到相应的数据库连接
二、单数据源配置
因为SpringBoot对数据源有着高度的默认配置只配置一个数据源时该数据源会被作为默认所以对接单数据源其实是非常简单的。如果你的工程采用的yaml格式配置文件我们仅需做如下配置
spring:#数据库连接配置datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/springtestusername: rootpassword: root如果是采用properties配置文件的也是一样的
spring.datasource.driver-class-namecom.mysql.jdbc.Driver
spring.datasource.urljdbc:mysql://127.0.0.1:3306/springtest
spring.datasource.usernameroot
spring.datasource.passwordroot三、如何配置多数据源
1. 工程层级调整
我们以曾经搭建的工程为原始模板进行对接多数据源的操作。没看过的可以点此查看 从零开始手把手教你搭建Spring Boot后台工程并说明 因为仅变动数据源所以我们不改动其他层级仅仅将 mapper 拆为 mapper1 与 mapper2 两部分
2. Spring项目配置
然后我们需要在 application.properties 或者 application.yml 中定义多个数据源
spring:#数据库连接配置datasource1:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://127.0.0.1:3306/springtest2username: rootpassword: rootdatasource2:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://127.0.0.1:3306/springtestusername: rootpassword: root这里有两个细节需要注意
因为我们决定使用双数据源所以把数据源的连接配置改成了datasource1 和 datasource2。而不再保留datasource这样SpringBoot就不再会为我们设定默认数据库因为我们目前采用的 springBoot2.5.2默认的连接池为Hikari该连接池数据源的地址字段为jdbc-url 而非 url。在只有单个数据源时SpringBoot走默认数据源逻辑为我们把 url 与 jdbc-url 进行映射保证我们获得数据源。此时我们自己设置的数据源没有进行映射处理就需要保证字段符合Hikari的要求。否则会出现 java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName 异常
3. 会话配置
仅有配置文件可不行接下来我们需要在代码中读取到配置并建立两个数据源。如下每个数据源都有隔离的mapper接口、xml文件、会话工厂及会话模板
第一个数据源 如下示例
Configuration
MapperScan(basePackages com.zhanfu.springboot.demo.mapper1, sqlSessionFactoryRef sqlSessionFactory1)
public class DataSource1Config {BeanConfigurationProperties(prefix spring.datasource1)public DataSource dataSource1() {return DataSourceBuilder.create().build();}Beanpublic SqlSessionFactory sqlSessionFactory1() throws Exception {SqlSessionFactoryBean sessionFactoryBean new SqlSessionFactoryBean();sessionFactoryBean.setDataSource(dataSource1());String locationPattern classpath*:/mapper1/*.xml;PathMatchingResourcePatternResolver resolver new PathMatchingResourcePatternResolver();sessionFactoryBean.setMapperLocations(resolver.getResources(locationPattern));return sessionFactoryBean.getObject();}Bean(name sqlSessionTemplate1)public SqlSessionTemplate sqlSessionTemplate1(Qualifier(sqlSessionFactory1) SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
}
配置第二个数据源 DataSource2Config
Configuration
MapperScan(basePackages com.zhanfu.springboot.demo.mapper2, sqlSessionFactoryRef sqlSessionFactory2)
public class DataSource2Config {BeanConfigurationProperties(prefix spring.datasource2)public DataSource dataSource2() {return DataSourceBuilder.create().build();}Beanpublic SqlSessionFactory sqlSessionFactory2() throws Exception {SqlSessionFactoryBean sessionFactoryBean new SqlSessionFactoryBean();sessionFactoryBean.setDataSource(dataSource2());String locationPattern classpath*:/mapper2/*.xml;PathMatchingResourcePatternResolver resolver new PathMatchingResourcePatternResolver();sessionFactoryBean.setMapperLocations(resolver.getResources(locationPattern));return sessionFactoryBean.getObject();}Bean(name sqlSessionTemplate2)public SqlSessionTemplate sqlSessionTemplate2(Qualifier(sqlSessionFactory2) SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}Bean(name productMapper)public ProductMapper mapper2(Qualifier(sqlSessionTemplate2) SqlSessionTemplate sqlSessionTemplate) throws Exception {return sqlSessionTemplate.getMapper(ProductMapper.class);}
}4. 事务管理器
为两个数据源分别配置自己的事务管理器如果你的项目里通篇没有方法级别的事务一个SQL就是一个事务那不设置这个也不影响否则还是建议加上。
Configuration
public class TransactionManagerConfig {Autowiredprivate DataSource dataSource1;Autowiredprivate DataSource dataSource2;Beanpublic PlatformTransactionManager txManager1() {return new DataSourceTransactionManager(dataSource1);}Beanpublic PlatformTransactionManager txManager2() {return new DataSourceTransactionManager(dataSource2);}
}
四、验证
我们把两张表拆进两个库中以两个库模拟两个数据源使得程序可以同时连接两个库 浏览器输入 http://127.0.0.1:8080/user/findall 查询接口成功 再在浏览器输入 http://127.0.0.1:8080/product/findall 查询第二个库的数据亦成功返回 这样我们就完成了一个工程同时连接两个数据源。 总结
经过上述的操作我们已经成功把项目对接了多数据源。当然方案肯定不止这一种后续围绕该问题我们还会讲解其他方式。但不论是什么方式主旨都是加深大家对SpringBoot 和 Mybatis的理解我们曾经梳理过全流程但只是蜻蜓点水带大家看一遍大体轮廓并不足以让你精通后面本专栏将继续深入讲解