南昌建设工程质量监督网站,涿州注册公司流程和费用,论坛网站免费建设模板下载,合肥电脑网站建站文章目录 1. 引言2. MyBatis-Plus简介3. 准备工作4. 配置数据源5. 配置MyBatis-Plus6. 创建实体类和Mapper接口7. 编写Service8. 控制器层9. 测试10. 数据库读写分离的原理11. 拓展11.1. 动态数据源11.2. 多数据源事务管理11.3. 多租户支持 12. 总结 #x1f389;Spring Boot … 文章目录 1. 引言2. MyBatis-Plus简介3. 准备工作4. 配置数据源5. 配置MyBatis-Plus6. 创建实体类和Mapper接口7. 编写Service8. 控制器层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及以上版本MavenIntelliJ IDEA或Eclipse可选
在项目的pom.xml文件中添加MyBatis-Plus和数据库驱动的依赖
!-- MyBatis-Plus --
dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.4.3.2/version
/dependency!-- MySQL驱动 --
dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.26/version
/dependency4. 配置数据源
在application.properties或application.yml中配置主库和从库的数据源
# 主库数据源配置
spring.datasource.master.urljdbc:mysql://localhost:3306/masterdb?useSSLfalseserverTimezoneUTC
spring.datasource.master.usernameroot
spring.datasource.master.passwordroot
spring.datasource.master.driver-class-namecom.mysql.cj.jdbc.Driver# 从库数据源配置
spring.datasource.slave.urljdbc:mysql://localhost:3307/slavedb?useSSLfalseserverTimezoneUTC
spring.datasource.slave.usernameroot
spring.datasource.slave.passwordroot
spring.datasource.slave.driver-class-namecom.mysql.cj.jdbc.Driver5. 配置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 BaseMapperUser {
}7. 编写Service
创建Service层调用Mapper接口完成数据操作
// UserService.java
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;Service
public class UserService extends ServiceImplUserMapper, 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注解根据不同的操作选择不同的数据源。这里简要说明一下原理 创建多个数据源 配置文件中定义了主库和从库两个数据源。 配置动态数据源 在MybatisPlusConfig配置类中使用DynamicDataSource类包装主库和从库的数据源通过Primary注解标识主库。 自定义注解 创建DataSource注解用于标识Mapper方法应该使用哪个数据源。 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实战项目】SpringBootSSM实战打造高效便捷的企业级Java外卖订购系统【数据结构学习】从零起步学习数据结构的完整路径