Spring Boot + MyBatis-Plus实现数据库读写分离

文章目录

    • 1. 引言
    • 2. MyBatis-Plus简介
    • 3. 准备工作
    • 4. 配置数据源
    • 5. 配置MyBatis-Plus
    • 6. 创建实体类和Mapper接口
    • 7. 编写Service
    • 8. 控制器层
    • 9. 测试
    • 10. 数据库读写分离的原理
    • 11. 拓展
      • 11.1. 动态数据源
      • 11.2. 多数据源事务管理
      • 11.3. 多租户支持
    • 12. 总结

在这里插入图片描述

🎉Spring Boot + MyBatis-Plus实现数据库读写分离


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

1. 引言

在当今互联网应用中,数据库读写分离是提高系统性能和稳定性的重要手段之一。通过将读操作和写操作分别路由到不同的数据库节点,可以有效减轻数据库服务器的负担,提升系统的整体性能。本文将介绍如何利用Spring Boot和MyBatis-Plus框架实现数据库读写分离,并通过简单易懂的代码示例来详细说明每个步骤。
在这里插入图片描述

2. MyBatis-Plus简介

MyBatis-Plus是MyBatis的增强工具,提供了许多实用的功能,包括但不限于代码生成器、通用Mapper、分页插件等。在本文中,我们将专注于使用MyBatis-Plus实现数据库读写分离。

3. 准备工作

在开始之前,确保你的开发环境中已经安装了以下软件:

  • JDK(推荐使用JDK 8及以上版本)
  • Maven
  • IntelliJ IDEA或Eclipse(可选)

在项目的pom.xml文件中添加MyBatis-Plus和数据库驱动的依赖:

<!-- MyBatis-Plus -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3.2</version>
</dependency><!-- MySQL驱动 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version>
</dependency>

4. 配置数据源

application.properties(或application.yml)中配置主库和从库的数据源:

# 主库数据源配置
spring.datasource.master.url=jdbc:mysql://localhost:3306/masterdb?useSSL=false&serverTimezone=UTC
spring.datasource.master.username=root
spring.datasource.master.password=root
spring.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver# 从库数据源配置
spring.datasource.slave.url=jdbc:mysql://localhost:3307/slavedb?useSSL=false&serverTimezone=UTC
spring.datasource.slave.username=root
spring.datasource.slave.password=root
spring.datasource.slave.driver-class-name=com.mysql.cj.jdbc.Driver

5. 配置MyBatis-Plus

创建一个配置类,用于配置MyBatis-Plus的分页插件和动态数据源:

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;import javax.sql.DataSource;@Configuration
@MapperScan(basePackages = "com.example.demo.mapper", sqlSessionFactoryRef = "sqlSessionFactory")
public class MybatisPlusConfig {@Bean(name = "sqlSessionFactory")public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);return sqlSessionFactoryBean.getObject();}@Bean(name = "transactionManager")public PlatformTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}
}

6. 创建实体类和Mapper接口

创建一个简单的实体类和对应的Mapper接口:

// User.java
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName("user")
public class User {@TableIdprivate Long id;private String username;private String password;
}
// UserMapper.java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper extends BaseMapper<User> {
}

7. 编写Service

创建Service层,调用Mapper接口完成数据操作:

// UserService.java
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;@Service
public class UserService extends ServiceImpl<UserMapper, User> {
}

8. 控制器层

编写Controller层,暴露接口供前端调用:

// UserController.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/users")
public class UserController {private final UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}@GetMapping("/{id}")public User getUser(@PathVariable Long id) {return userService.getById(id);}@PostMappingpublic boolean createUser(@RequestBody User user) {return userService.save(user);}@PutMappingpublic boolean updateUser(@RequestBody User user) {return userService.updateById(user);}@DeleteMapping("/{id}")public boolean deleteUser(@PathVariable Long id) {return userService.removeById(id);}
}

9. 测试

启动Spring Boot应用程序,访问相应的接口进行测试。通过日志可以看到,MyBatis-Plus会在执行查询时根据一定的规则选择主库或从库。

10. 数据库读写分离的原理

数据库读写分离的实现原理主要通过在MyBatis-Plus中使用@DataSource注解,根据不同的操作选择不同的数据源。这里简要说明一下原理:

  1. 创建多个数据源: 配置文件中定义了主库和从库两个数据源。

  2. 配置动态数据源:MybatisPlusConfig配置类中,使用DynamicDataSource类包装主库和从库的数据源,通过@Primary注解标识主库。

  3. 自定义注解: 创建@DataSource注解,用于标识Mapper方法应该使用哪个数据源。

  4. AOP切面: 利用AOP,在Mapper方法执行前根据@DataSource注解的值动态切换数据源。

11. 拓展

11.1. 动态数据源

切换策略

在实际应用中,动态数据源切换的策略可以根据业务需求来定制。可以基于用户的读写操作比例、数据库实例的性能等因素,灵活调整数据源切换的策略。

11.2. 多数据源事务管理

当涉及到跨数据源的事务时,需要谨慎处理。可以通过使用分布式事务框架(如Seata、TCC事务等)来保障事务的一致性。

11.3. 多租户支持

在一些场景中,需要为不同的租户提供独立的数据库,此时可以考虑使用多租户架构,并根据租户信息动态切换数据源。

12. 总结

通过本文的学习,我们了解了如何利用Spring Boot和MyBatis-Plus实现数据库读写分离。这一策略在提升系统性能和稳定性方面有着显著的效果。通过合理配置数据源、使用MyBatis-Plus框架以及编写自定义注解和AOP切面,我们成功地搭建了一个简单而完整的读写分离系统。

希望这篇文章对你理解Spring Boot和MyBatis-Plus的读写分离实现提供了帮助。在实际项目中,可以根据具体的业务需求和性能要求调整和拓展这一方案。


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

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

在这里插入图片描述

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

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

相关文章

15.Docker-Compose的概念理解及安装

1.Docker-Compose是什么&#xff1f; Docker-Compose是实现对Docker容器集群的快速编排的工具软件。它是Docker官方开源的一个工具软件&#xff0c;可以管理多个Docker容器组成一个应用。你需要定义一个YAML格式的配置文件docker-compose.yml.写好多个容器间的调用关系&#x…

rabbitMQ对优先级队列的使用

注意事项&#xff1a; 1.队列设置优先级 权制范围&#xff08;0-255&#xff09;推荐0-10 否则浪费CPU与内存 2.发消息时给消息设置优先级 3.消息需要完全事先在队列中&#xff0c;在被消费者消费 会被排序&#xff0c;否则边生产边消费不会达到预期的队列优先效果。 优先级队列…

【EI会议征稿】第三届航空航天工程与系统国际研讨会(ISAES 2024)

第三届航空航天工程与系统国际研讨会(ISAES 2024) 2024 3rd International Symposium on Aerospace Engineering and Systems 第三届航空航天工程与系统国际研讨会将于2024年3月22-24日在南京召开&#xff01;会议紧密聚焦“航空航天工程”领域的热点和难点问题&#xff0c;…

MVVM 模式与 MVC 模式:构建高效应用的选择

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

sping boot的配置文件application.properties乱码

1.问题描述 查看spingboot项目中的配置信息&#xff0c;即查看application.properties文件&#xff0c;它出现乱码 2.解决问题 File->Settings->Editor->File Encodings 3.验证是否解决乱码

基于U2-Net如何训练一个一键抠图模型

1. 前言 抠图是图像编辑的基础功能之一&#xff0c;在抠图的基础上可以发展出很多有意思的玩法和特效。比如一键更换背景、一键任务卡通化、一键人物素描化等。正是因为这些有意思的玩法。 最近也是对此模型背后的网络很感兴趣&#xff0c;收集数据训练了人脸素描化模型&…

MySQL基础进阶篇

进阶篇 存储引擎 MySQL体系结构&#xff1a; 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表而不是基于库的&#xff0c;所以存储引擎也可以被称为表引擎。 默认存储引擎是InnoDB。 相关操作&#xff1a; -- 查询建表语句 show create …

鸿蒙4.0开发笔记之ArkTS语法基础的UI描述、基础组件的使用与如何查看组件是否有参数(八)

文章目录 一、声明式UI描述1、无/有参数组件2、如何查看组件是否有参数 二、Image组件的使用三、组件的属性设置四、补充1、使用组件的成员函数配置组件的事件方法2、配置子组件3、多组件嵌套 一、声明式UI描述 在HarmonyOS的ArkTS语法中&#xff0c;万物皆组件。ArkTS以声明方…

多个nginx共享值、缓存问题

背景 目前我在集成登录认证功能&#xff08;cas&#xff09;&#xff0c;使用的架构是nginxlua&#xff0c;由于我们有多个系统&#xff08;全是前端项目&#xff09;&#xff0c;每套系统都采用nginxlua的方式进行部署&#xff08;即每个系统都是一个nginx&#xff09;&#…

【2023.11.28】关于Servlet路径的学习

创建Servlet 这是Tomcat配置的初始路径&#xff0c;在web项目内&#xff0c;该路径代表了webapp下index.html所在的页面。 WebServlet(name "login", value "/login",loadOnStartup 1) public class LoginServlet extends HttpServlet { 使用注解的方…

Spring Cloud 版本升级记:OpenFeignClient与Gateway的爱恨交织

Spring Cloud 版本升级记&#xff1a;OpenFeignClient与Gateway的爱恨交织 近日&#xff0c;在负责的项目中&#xff0c;我对 Spring Boot、Spring Cloud 以及 Spring Cloud Alibaba 进行了版本升级。原以为会一切顺利&#xff0c;没想到却遭遇了 Spring Cloud Gateway 无法正…

Apache Airflow (十四) :Airflow分布式集群搭建及测试

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…