【SpringBoot整合系列】SpringBoot配置多数据源

目录

  • 背景
    • 技术选型
    • 配置多数据源思路(以两个为例)
    • 代码实现
      • 1.导入依赖
      • 2.各自的配置
    • 3.各自的dataSource
      • news数据库的
      • smbms数据库的
      • 注意:@Primary注解
    • 4.各自的SqlSessionFactory等
      • news数据库的
      • smbms数据库的
    • 5.去掉启动类头上的@MapperScan
    • 6.各自的mapper接口
    • 7.各自的mapper.xml
    • 8.测试

背景

  • 在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.properties文件中配置连接参数即可。
  • 但是往往随着业务量发展,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源

技术选型

  • SpringBoot2.3.12
  • jdk1.8
  • mysql5.7
  • 持久层框架mybatis

配置多数据源思路(以两个为例)

  1. 要执行两个数据库的操作,就需要有两个数据库配置
  2. 有两个数据库配置那就要两个SqlSessionBuilder来创建SqlSessionFactory
  3. 有两个SqlSessionFactory就能创建两个数据库自己的sqlSession
  4. 然后就能执行不同数据库的操作了
  5. 现在用的都是数据库连接池,需要创建dataSource,因此,按照上面的思路,也需要有各自数据库的dataSource
  6. 用各自的dataSource创建各自的SqlSessionFactory
  7. 继而创建各自的SqlSessionTemplate
  8. 当然,事务管理器也应该是用各自的dataSource来创建
  9. 那么,各自的SqlSessionFactory就要扫描各自的mapper层,因此就需要有各自的mapper包
  10. 至于各自的mapper.xml可以放在一起,也可以不放在一起,因为mapper.xml中的namespace是根据包名来映射的

代码实现

1.导入依赖

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency><!-- 阿里数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.9</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency>

2.各自的配置

server:port: 8888logging:level:org.springframework.web: debugcom.kgc.mapper: debug
spring:datasource:smbms:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/smbms?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456news:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/chinanewsdb?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456mybatis:mapper-locations: classpath:mybatis/mapper/*.xmltype-aliases-package: com.kgc.pojonews:mapper-locations: classpath:mybatis/newsmapper/*.xml
#  configuration:
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

3.各自的dataSource

news数据库的

package com.kgc.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
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 javax.sql.DataSource;/*** @author: zjl* @datetime: 2024/4/20* @desc:*/
@Configuration
//@ConfigurationProperties(prefix = "spring.datasource.news")
public class NewsDataSourceConfig {@Value("${spring.datasource.news.driverClassName}")private String driverClassName;@Value("${spring.datasource.news.url}")private String url;@Value("${spring.datasource.news.username}")private String username;@Value("${spring.datasource.news.password}")private String password;@Bean("newsDataSource")public DataSource createDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driverClassName);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}
}

smbms数据库的

package com.kgc.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
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 javax.sql.DataSource;/*** @author: zjl* @datetime: 2024/4/20* @desc:*/
@Configuration
//@ConfigurationProperties(prefix = "spring.datasource.smbms")
public class SmbmsDataSourceConfig {@Value("${spring.datasource.smbms.driverClassName}")private String driverClassName;@Value("${spring.datasource.smbms.url}")private String url;@Value("${spring.datasource.smbms.username}")private String username;@Value("${spring.datasource.smbms.password}")private String password;@Bean("smbmsDataSource")@Primarypublic DataSource createDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driverClassName);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}
}

注意:@Primary注解

  • 其作用与功能,当有多个相同类型的bean时,使用@Primary来赋予bean更高的优先级。
  • 在这里,需要注册多个相同DataSource类型的bean,要有一个有更高的优先级,否则会报错

4.各自的SqlSessionFactory等

news数据库的

package com.kgc.config;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.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;import javax.annotation.Resource;
import javax.sql.DataSource;/*** @author: zjl* @datetime: 2024/4/20* @desc:*/
@Configuration
@EnableTransactionManagement
@MapperScan(value = "com.kgc.news.mapper",sqlSessionFactoryRef = "newsSqlSessionFactory")
public class NewsSqlSessionFactoryConfiguratiion {@Resource(name = "newsDataSource")private DataSource newsDataSource;@Value("${mybatis.news.mapper-locations}")private String mapperLocations;@Bean("newsSqlSessionFactory")public SqlSessionFactory create() throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(newsDataSource);PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();bean.setMapperLocations(resourcePatternResolver.getResources(mapperLocations));return bean.getObject();}@Bean("newsSqlSessionTemplate")public SqlSessionTemplate createSqlSession(@Qualifier("newsSqlSessionFactory") SqlSessionFactory sqlSessionFactory){return new SqlSessionTemplate(sqlSessionFactory);}@Bean("newsTransactionManager")public PlatformTransactionManager createTransactionManager(){return new DataSourceTransactionManager(newsDataSource);}
}

smbms数据库的

package com.kgc.config;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.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;import javax.annotation.Resource;
import javax.sql.DataSource;
import java.io.IOException;/*** @author: zjl* @datetime: 2024/4/20* @desc:*/
@Configuration
@EnableTransactionManagement
@MapperScan(value = "com.kgc.mapper",sqlSessionFactoryRef = "smbmsSqlSessionFactory")
public class SmbmsSqlSessionFactoryConfiguratiion {@Resource(name = "smbmsDataSource")private DataSource smbmsDataSource;@Value("${mybatis.mapper-locations}")private String mapperLocations;@Bean("smbmsSqlSessionFactory")public SqlSessionFactory create() throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(smbmsDataSource);PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();bean.setMapperLocations(resourcePatternResolver.getResources(mapperLocations));return bean.getObject();}@Bean("smbmsSqlSessionTemplate")public SqlSessionTemplate createSqlSession(@Qualifier("smbmsSqlSessionFactory") SqlSessionFactory sqlSessionFactory){return new SqlSessionTemplate(sqlSessionFactory);}@Bean("smbmsTransactionManager")public PlatformTransactionManager createTransactionManager(){return new DataSourceTransactionManager(smbmsDataSource);}
}

5.去掉启动类头上的@MapperScan

@SpringBootApplication
//@MapperScan(basePackages = {"com.kgc.mapper"})
public class BootdemoApplication {public static void main(String[] args) {SpringApplication.run(BootdemoApplication.class, args);}
}

6.各自的mapper接口

在这里插入图片描述

public interface UserMapper {int selectCount();
}
public interface NewsMapper {int selectCount();
}

7.各自的mapper.xml

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kgc.mapper.UserMapper"><select id="selectCount" resultType="int">SELECT COUNT(1) FROM SMBMS_USER</select>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kgc.news.mapper.NewsMapper"><select id="selectCount" resultType="int">SELECT COUNT(1) FROM news_detail</select>
</mapper>

8.测试

service

@Service
public class UserService {@Resourceprivate UserMapper userMapper;@Resourceprivate NewsMapper newsMapper;public Integer allCount(){return userMapper.selectCount() + newsMapper.selectCount();}
}

controller

@RestController
public class UserController {@Resourceprivate UserService userService;@RequestMapping("/all")public Object all(){return userService.allCount();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/827872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布移位下用于泛化的泛化的自监督测试时训练

Test-Time Training with Self-Supervision for Generalization under Distribution Shifts 论文链接 https://arxiv.org/abs/1909.13231 代码链接 Test-Time Training Project Website 发表于ICML2020 机构&#xff1a; UC Berkeley&#xff0c; UC San Diego 这张文章里的…

SpaceX的核心Fact Sheet

首先给大家分享一组SpaceX的关键数据&#xff0c;让大家对这个神秘公司有个定量认知&#xff1a; 2024年SpaceX预计收入可达130亿美金&#xff0c;同比增长54%&#xff0c;预计2035年可达1000亿美金 SpaceX目前已经处于盈利状态&#xff0c;具体利润规模未知 SpaceX的发射成本…

深入解析 Odoo 在线客服模块 (im_livechat)

深入解析 Odoo 在线客服模块 (im_livechat) Odoo Livechat 是一款集成于 Odoo 平台的实时在线客服系统&#xff0c;它赋予用户在网页界面上直接与客服人员进行即时沟通的能力。本文将逐步剖析 Livechat 的实现细节&#xff0c;从入口模板文件的加载机制&#xff0c;到后端初始…

Sectigo证书申请流程及价格介绍

Sectigo 是一家全球知名的数字证书颁发机构&#xff08;Certificate Authority, CA&#xff09;&#xff0c;自1998年起就开始提供 SSL 证书服务&#xff0c;是全球最早的 CA 机构之一。 一 Sectigo证书申请流程 1 确定证书类型 根据自身的需求确定证书的类型&#xff0c;一…

安全计算环境中,入侵防范的测评指标对应的测评对象包含哪些?

安全计算环境中&#xff0c;入侵防范的测评指标包括恶意代码防范、可信验证、数据完整性、数据保密性、数据备份恢复、剩余信息保护、个人信息保护等。 在安全计算环境中&#xff0c;入侵防范是确保系统不受未授权访问和破坏的关键措施。这涉及到多个方面的测评指标&#xff0…

IBM MQ 问题记录与解决

问题1&#xff1a; 报错&#xff1a; JMSWMQ2013:为队列管理器“QMXXX”提供的安全性认证无效&#xff0c;连接方式为“client”&#xff0c;主机名为“127.0.0.1(1417)”。 解决&#xff1a; (1)登录服务器 进入 IBM mq 所在目录 &#xff08;linux一般在/opt/mqm下 windo…

【001_音频开发-基础篇-专业术语】

001_音频开发-基础篇-专业术语 文章目录 001_音频开发-基础篇-专业术语创作背景术语表常见音源HDMI相关声音系统立体声2.1 声音系统5.1 环绕声系统5.1.2 环绕声系统7.1 环绕声系统7.1.4 环绕声系统9.1.4 环绕声系统 音质等级定义QQ音乐网易云音乐 创作背景 学历代表过去、能力…

如何启用启用WordPress调试模式

最近我们的WordPress网站在访问时&#xff0c;经常出现打不开的现象&#xff0c;我们向主机提供商Hostease咨询后&#xff0c;他们提到这是由于WordPress的某个插件导致的问题&#xff0c;我们在将插件版本升级至最新后&#xff0c;这个问题就消失了。为了方便后续的检查&#…

OceanBase 开发者大会 - 见闻与洞察

文章目录 前言主论坛见闻技术专场见闻产品技术专场技术生态专场 同行论道启发互动展区写在最后 前言 4 月 20 日&#xff0c;我有幸受邀参加了第二届 OceanBase 开发者大会。 50 余位业界知名数据库大咖和数据库爱好者&#xff0c;与来自全国近 600 名开发者相聚。共同探讨一体…

3DE DELMIA Role: EWD - Ergonomic Workplace Designer

Discipline: Ergonomics Role: EWD - Ergonomic Workplace Designer 设计安全高效的工作场所 Ergonomic Workplace Designer采用 Smart Posturing EngineTM技术&#xff08;用于自动和可重复的逼真人体模型定位&#xff09;和 Ergo4alITM技术&#xff08;用于应用程序内人体工…

2024年阿里云服务器最新活动价格表(含可选实例、配置、带宽)

2024年阿里云对云服务器活动中的价格和可选实例、配置、带宽和折扣等优惠政策又做升级调整&#xff0c;调整之后的云服务器最低价格只要99元起了&#xff0c;企业级2核4G5M带宽云服务器也只要199元/1年了&#xff0c;而且阿里云还额外推出了新购和续费同价的优惠政策。下面是小…

五一出游必备神器!华为nova 12 Ultra助你秒变旅行达人

五一假期终于要到了&#xff01;小伙伴们是不是都跃跃欲试&#xff0c;想要出去浪一浪呢&#xff1f;别急&#xff0c;别急&#xff0c;先让我给你安利一款出游神器——华为nova 12 Ultra&#xff0c;它可是集多种技艺于一身&#xff0c;让你在旅途中秒变旅行达人哦&#xff01…

CV每日论文--2024.4.23

1、InstantMesh: Efficient 3D Mesh Generation from a Single Image with Sparse-view Large Reconstruction Models 中文标题&#xff1a;InstantMesh&#xff1a;使用稀疏视图大型重建模型从单个图像高效生成 3D 网格 简介&#xff1a;本文介绍了InstantMesh&#xff0c;这…

Mysql用语句创建表/插入列【示例】

一、 创建表 COMMENT表示字段或列的注释 -- 新建student表 CREATE TABLE student (id BIGINT NOT NULL COMMENT 学生id, enroll_date DATE NOT NULL COMMENT 注册时间, NAME VARCHAR(18) DEFAULT NOT NULL COMMENT 学生姓名, deal_flag TINYINT(1) DEFAULT 0 NOT NULL COMM…

2024第十三届深圳国际营养与健康产业博览会

医疗展、健康展、养生展、医药展、中医展、艾灸展、营养展、保健展、康复展、医美展、养老展、婴童展、医美展、护理展、理疗展、智能中医、医疗器械、氢氧、营养保健、大健康、医药制药、养老康复、食药同源 2024第十三届深圳国际营养与健康产业博览会 THE 13TH SHENZHEN IN…

全新Storm Core API管理系统源码 免授权版

全新Storm Core API管理系统源码 免授权版 本系统为API系统,实现了api集成等基础功能,以后可能会更新key调用api,或者实现付费功能,敬请期待,前端模板均无加密,用户可自行二开,具体请看图 测试环境:PHP7.2+MySQL5.6 访问:http://你的域名/install 进行安装 伪静态…

树 —— 树和森林的遍历

一、树的遍历 &#xff08;1&#xff09;先根遍历 若树非空&#xff0c;则遍历方法为 &#xff08;1&#xff09;访问根结点。 &#xff08;2&#xff09;从左到右&#xff0c;依次先根遍历根结点的每一棵子树。 先根遍历序列为&#xff1a;ABECFHGD。 &#xff08;2&#…

齐护K210系列教程(二)_点亮板载灯

文章目录 1&#xff0c;程序的上传2&#xff0c;点亮板载R-G-B三色灯2-1 齐护编程块方式 2&#xff0c;红色呼吸灯&#xff08;渐亮渐灭&#xff09;4&#xff0c;RGB幻彩呼吸灯联系我们 1&#xff0c;程序的上传 接上节课&#xff0c;我们选择板卡【MicroPython[QDPK210_AIst…

Spring Boot入门(21):使用Spring Boot和Log4j2进行高效日志管理:配置详解

Spring Boot 整合 Log4j2 前言 Log4j2是Apache软件基金会下的一个日志框架&#xff0c;它是Log4j的升级版。与Log4j相比&#xff0c;它在性能和功能上有着极大的提升。Spring Boot本身已经默认集成了Logback作为日志框架&#xff0c;但如果需要使用Log4j2来替代Logback&#…

智慧校园:大数据助力校情分析

随着信息技术的快速发展&#xff0c;数据信息资源以井喷的姿态涌现。数据信息的大量涌现给人们带来丰富的数据信息资源&#xff0c;但面对海量的信息资源时&#xff0c;加大了人们对有效信息资源获取的难度&#xff0c;数据挖掘技术正是这一背景下的产物&#xff0c;基于数据挖…