Spring Boot集成MyBatis实现多数据源访问的“秘密”

文章目录

    • 为什么需要多数据源?
    • Spring Boot集成MyBatis的基础配置
    • 使用多数据源
    • 小结

在这里插入图片描述

🎉Spring Boot集成MyBatis实现多数据源访问的“秘密”


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:架构设计
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

在企业级应用程序中,往往需要处理多个数据库的数据。Spring Boot提供了强大的功能,使得集成多数据源变得相对容易。本文将揭示Spring Boot集成MyBatis实现对多数据源的访问的“秘密”,并通过实例代码来演示整个过程。
在这里插入图片描述

为什么需要多数据源?

在实际的应用中,有一些常见的场景需要使用多个数据源:

  1. 业务数据和日志数据分离: 将业务数据和日志数据存储在不同的数据库中,方便业务数据的备份和维护。

  2. 读写分离: 将读操作和写操作分别指向不同的数据库,提高系统的读取性能。

  3. 多租户系统: 在一个系统中为不同的租户使用不同的数据库,确保数据隔离和安全性。

  4. 数据分片: 将数据按照某种规则分散到不同的数据库中,提高查询效率。

Spring Boot集成MyBatis的基础配置

在开始之前,确保你已经创建了一个Spring Boot项目。接下来,我们将通过Maven添加MyBatis和连接池的依赖项。

<!-- MyBatis依赖 -->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version>
</dependency><!-- 数据库连接池(以Druid为例) -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.6</version>
</dependency>

接着,配置application.propertiesapplication.yml文件,指定数据库连接信息:

# 主数据源
spring.datasource.primary.url=jdbc:mysql://localhost:3306/primarydb
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# 第二个数据源
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondarydb
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver

这里配置了两个数据源,分别是primarysecondary。接下来,我们需要创建对应的数据源、SqlSessionFactorySqlSessionTemplate

@Configuration
@MapperScan(basePackages = "com.example.mapper.primary", sqlSessionTemplateRef = "primarySqlSessionTemplate")
public class PrimaryDataSourceConfig {@Primary@Bean(name = "primaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource dataSource() {return DataSourceBuilder.create().build();}@Primary@Bean(name = "primarySqlSessionFactory")public SqlSessionFactory sqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);return factoryBean.getObject();}@Primary@Bean(name = "primarySqlSessionTemplate")public SqlSessionTemplate sqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
}

上述代码中,@Primary注解表示这是主数据源的配置。同样,我们也需要为第二个数据源进行配置:

@Configuration
@MapperScan(basePackages = "com.example.mapper.secondary", sqlSessionTemplateRef = "secondarySqlSessionTemplate")
public class SecondaryDataSourceConfig {@Bean(name = "secondaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.secondary")public DataSource dataSource() {return DataSourceBuilder.create().build();}@Bean(name = "secondarySqlSessionFactory")public SqlSessionFactory sqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);return factoryBean.getObject();}@Bean(name = "secondarySqlSessionTemplate")public SqlSessionTemplate sqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
}

这样,我们已经完成了多数据源的基础配置。

在这里插入图片描述

使用多数据源

接下来,我们将演示如何在Service层中使用多数据源。首先,创建对应的Mapper接口和Mapper XML文件。

// PrimaryDataSource中的Mapper接口
@Mapper
public interface PrimaryUserMapper {User getUserById(@Param("userId") int userId);
}
<!-- PrimaryUserMapper.xml -->
<mapper namespace="com.example.mapper.primary.PrimaryUserMapper"><resultMap id="BaseResultMap" type="com.example.entity.User"><id column="id" property="id" jdbcType="INTEGER"/><result column="username" property="username" jdbcType="VARCHAR"/><result column="password" property="password" jdbcType="VARCHAR"/></resultMap><select id="getUserById" resultMap="BaseResultMap">SELECT * FROM user WHERE id = #{userId}</select>
</mapper>
// SecondaryDataSource中的Mapper接口
@Mapper
public interface SecondaryUserMapper {User getUserById(@Param("userId") int userId);
}
<!-- SecondaryUserMapper.xml -->
<mapper namespace="com.example.mapper.secondary.SecondaryUserMapper"><resultMap id="BaseResultMap" type="com.example.entity.User"><id column="id" property="id" jdbcType="INTEGER"/><result column="username" property="username" jdbcType="VARCHAR"/><result column="password" property="password" jdbcType="VARCHAR"/></resultMap><select id="getUserById" resultMap="BaseResultMap">SELECT * FROM user WHERE id = #{userId}</select>
</mapper>

然后,在Service层中分别注入两个Mapper接口,并在方法中使用对应的数据源。

@Service
public class UserService {@Autowiredprivate PrimaryUserMapper primaryUserMapper;@Autowiredprivate SecondaryUserMapper secondaryUserMapper;@Transactional(transactionManager = "primaryTransactionManager")public User getPrimaryUserById(int userId) {return primaryUserMapper.getUserById(userId);}@Transactional(transactionManager = "secondaryTransactionManager")public User getSecondaryUserById(int userId) {return secondaryUserMapper.getUserById(userId);}
}

在上述代码中,通过@Transactional(transactionManager = "primaryTransactionManager")注解指定了使用主数据源。同样,@Transactional(transactionManager = "secondaryTransactionManager")注解指定了使用第二个数据源。

最后,我们需要在application.propertiesapplication.yml中配置事务管理器的Bean。

# 主数据源事务管理器
spring.primary.datasource.transactionManager=primaryTransactionManager# 第二个数据源事务管理器
spring.secondary.datasource.transactionManager=secondaryTransactionManager

小结

通过以上步骤,我们成功地实现了Spring Boot集成MyBatis,并实现了对多数据源的访问。使用多数据源可以满足一些特定的业务需求,如读写分离、多租户系统等。在实际应用中,根据项目的具体情况,可以进一步进行配置和优化。

在这里插入图片描述

希望本文能够帮助读者更好地理解Spring Boot如何集成MyBatis,以及如何配置和使用多数据源。同时,了解多数据源的使用场景和优势,对于构建高性能、可扩展的应用系统有着重要的意义。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

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

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

相关文章

51单片机应用从零开始(七)·循环语句(if语句,swtich语句)

51单片机应用从零开始&#xff08;一&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;二&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;三&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;四&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;…

案例014:Java+SSM+uniapp+mysql基于微信小程序的健身管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

人工智能对网络安全的影响越来越大

如果问当前IT行业最热门的话题是什么&#xff0c;很少有人会回答除了人工智能&#xff08;AI&#xff09;之外的任何话题。 在不到 12 个月的时间里&#xff0c;人工智能已经从一项只有 IT 专业人员才能理解的技术发展成为从小学生到作家、程序员和艺术家的每个人都使用的工具…

C++设计模式之工厂模式(中)——工厂模式

工厂模式 工厂模式介绍示例示例使用运行结果工厂模式与简单工厂模式区别 工厂模式 工厂模式在简单工厂模式的基础之上进行了改进。当需要生产的产品种类增加&#xff0c;可以通过新增子类工厂来生产&#xff0c;没有破坏程序设计原则中的开放封闭原则。 介绍 工厂模式先抽象…

Word/PPT/PDF怎么免费转为JPG图片?

1、打开金鸣表格文字识别网站。 2、点击导航条上的“软件下载” 3、安装并打开金鸣表格文字识别软件。 4、点击顶部导航栏的“文件转图片”。 5、选择需要转换成图片的文件&#xff08;支持Word/PPT/PDF&#xff09;. 6、点“打开”程序将自动分页转换为图片。

【LeetCode刷题笔记】DFSBFS(二)

994. 腐烂的橘子(树/图的BFS问题) 解题思路: 多源BFS ,首选找到 所有的腐烂的橘子 ,放入队列中,然后进行 BFS 广搜,广搜的 层数 - 1 就是所需要花费的分钟数。 在最开始先扫描一遍二维数组,将所有的 腐烂的橘子 加入 队列 ,同时统计新鲜橘子的数量 <

【赠书第7期】从零基础到精通Flutter开发

文章目录 前言 1 安装Flutter和Dart 2 了解Flutter的基础概念 2.1 Widget 2.2 MaterialApp和Scaffold 2.3 Hot Reload 3 编写你的第一个Flutter应用 3.1 创建一个Flutter项目 3.2 修改默认页面 3.3 添加交互 4 深入学习Flutter高级特性 4.1 路由和导航 4.2 状态管…

Pyqt5实现多线程程序

主从架构 Pyqt常常使用**主从架构&#xff08;Master-Workers 架构&#xff09;**来避免界面卡死的情况。 Master-Workers 架构就像它的名字&#xff0c;一个master统领着几个workers一起干活。其中某个worker倒下了不会导致整体任务失败。matser不用干活&#xff0c;因此可以…

Adiponectin 脂联素 ; T-cadherin +exosome

T-cadherin Adiponectin exosome T-cadherin Adiponectin exosome 代谢综合征中 外泌体、脂肪组织 和 脂联素 的器官间通讯-2019.pdf

STM32 MAP文件

文章目录 1 生成Map2 map中概念3 文件分析流程3.1 Section Cross References3.2 Removing Unused input sections from the image&#xff08;移除未使用的段&#xff09;3.3 Memory Map of the image&#xff08;映像的内存分布&#xff09;3.3.1 加载域3.3.2 运行域 4 代码运…

关于接口测试自动化的总结与思考!

序 近期看到阿里云性能测试 PTS 接口测试开启免费公测&#xff0c;本着以和大家交流如何实现高效的接口测试为出发点&#xff0c;本文包含了我在接口测试领域的一些方法和心得&#xff0c;希望大家一起讨论和分享&#xff0c;内容包括但不仅限于&#xff1a; 服务端接口测试介…

振南技术干货集:制冷设备大型IoT监测项目研发纪实(5)

注解目录 1.制冷设备的监测迫在眉睫 1.1 冷食的利润贡献 1.2 冷设监测系统的困难 &#xff08;制冷设备对于便利店为何如何重要&#xff1f;了解一下你所不知道的便利店和新零售行业。关 于电力线载波通信的论战。&#xff09; 2、电路设计 2.1 防护电路 2.1.1 强电防护…