
??Spring Boot + MyBatis-Plus實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離
- ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒??
- ?博客主頁:IT·陳寒的博客
- ??該系列文章專欄:架構(gòu)設(shè)計(jì)
- ??其他專欄:Java學(xué)習(xí)路線 Java面試技巧 Java實(shí)戰(zhàn)項(xiàng)目 AIGC人工智能 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)
- ??文章作者技術(shù)和水平有限,如果文中出現(xiàn)錯(cuò)誤,希望大家能指正??
- ?? 歡迎大家關(guān)注! ??
1. 引言
在當(dāng)今互聯(lián)網(wǎng)應(yīng)用中,數(shù)據(jù)庫讀寫分離是提高系統(tǒng)性能和穩(wěn)定性的重要手段之一。通過將讀操作和寫操作分別路由到不同的數(shù)據(jù)庫節(jié)點(diǎn),可以有效減輕數(shù)據(jù)庫服務(wù)器的負(fù)擔(dān),提升系統(tǒng)的整體性能。本文將介紹如何利用Spring Boot和MyBatis-Plus框架實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離,并通過簡(jiǎn)單易懂的代碼示例來詳細(xì)說明每個(gè)步驟。
2. MyBatis-Plus簡(jiǎn)介
MyBatis-Plus是MyBatis的增強(qiáng)工具,提供了許多實(shí)用的功能,包括但不限于代碼生成器、通用Mapper、分頁插件等。在本文中,我們將專注于使用MyBatis-Plus實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離。
3. 準(zhǔn)備工作
在開始之前,確保你的開發(fā)環(huán)境中已經(jīng)安裝了以下軟件:
- JDK(推薦使用JDK 8及以上版本)
- Maven
- IntelliJ IDEA或Eclipse(可選)
在項(xiàng)目的pom.xml
文件中添加MyBatis-Plus和數(shù)據(jù)庫驅(qū)動(dòng)的依賴:
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.2</version>
</dependency>
<!-- MySQL驅(qū)動(dòng) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
4. 配置數(shù)據(jù)源
在application.properties
(或application.yml
)中配置主庫和從庫的數(shù)據(jù)源:
# 主庫數(shù)據(jù)源配置
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
# 從庫數(shù)據(jù)源配置
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
創(chuàng)建一個(gè)配置類,用于配置MyBatis-Plus的分頁插件和動(dòng)態(tài)數(shù)據(jù)源:
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);
}
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
6. 創(chuàng)建實(shí)體類和Mapper接口
創(chuàng)建一個(gè)簡(jiǎn)單的實(shí)體類和對(duì)應(yīng)的Mapper接口:
// User.java
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("user")
public class User {
@TableId
private 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
創(chuàng)建Service層,調(diào)用Mapper接口完成數(shù)據(jù)操作:
// 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層,暴露接口供前端調(diào)用:
// 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;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.getById(id);
}
@PostMapping
public boolean createUser(@RequestBody User user) {
return userService.save(user);
}
@PutMapping
public boolean updateUser(@RequestBody User user) {
return userService.updateById(user);
}
@DeleteMapping("/{id}")
public boolean deleteUser(@PathVariable Long id) {
return userService.removeById(id);
}
}
9. 測(cè)試
啟動(dòng)Spring Boot應(yīng)用程序,訪問相應(yīng)的接口進(jìn)行測(cè)試。通過日志可以看到,MyBatis-Plus會(huì)在執(zhí)行查詢時(shí)根據(jù)一定的規(guī)則選擇主庫或從庫。
10. 數(shù)據(jù)庫讀寫分離的原理
數(shù)據(jù)庫讀寫分離的實(shí)現(xiàn)原理主要通過在MyBatis-Plus中使用@DataSource
注解,根據(jù)不同的操作選擇不同的數(shù)據(jù)源。這里簡(jiǎn)要說明一下原理:
-
創(chuàng)建多個(gè)數(shù)據(jù)源: 配置文件中定義了主庫和從庫兩個(gè)數(shù)據(jù)源。
-
配置動(dòng)態(tài)數(shù)據(jù)源: 在
MybatisPlusConfig
配置類中,使用DynamicDataSource
類包裝主庫和從庫的數(shù)據(jù)源,通過@Primary
注解標(biāo)識(shí)主庫。 -
自定義注解: 創(chuàng)建
@DataSource
注解,用于標(biāo)識(shí)Mapper方法應(yīng)該使用哪個(gè)數(shù)據(jù)源。 -
AOP切面: 利用AOP,在Mapper方法執(zhí)行前根據(jù)
@DataSource
注解的值動(dòng)態(tài)切換數(shù)據(jù)源。
11. 拓展
11.1. 動(dòng)態(tài)數(shù)據(jù)源
切換策略
在實(shí)際應(yīng)用中,動(dòng)態(tài)數(shù)據(jù)源切換的策略可以根據(jù)業(yè)務(wù)需求來定制??梢曰谟脩舻淖x寫操作比例、數(shù)據(jù)庫實(shí)例的性能等因素,靈活調(diào)整數(shù)據(jù)源切換的策略。
11.2. 多數(shù)據(jù)源事務(wù)管理
當(dāng)涉及到跨數(shù)據(jù)源的事務(wù)時(shí),需要謹(jǐn)慎處理??梢酝ㄟ^使用分布式事務(wù)框架(如Seata、TCC事務(wù)等)來保障事務(wù)的一致性。
11.3. 多租戶支持
在一些場(chǎng)景中,需要為不同的租戶提供獨(dú)立的數(shù)據(jù)庫,此時(shí)可以考慮使用多租戶架構(gòu),并根據(jù)租戶信息動(dòng)態(tài)切換數(shù)據(jù)源。
12. 總結(jié)
通過本文的學(xué)習(xí),我們了解了如何利用Spring Boot和MyBatis-Plus實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離。這一策略在提升系統(tǒng)性能和穩(wěn)定性方面有著顯著的效果。通過合理配置數(shù)據(jù)源、使用MyBatis-Plus框架以及編寫自定義注解和AOP切面,我們成功地搭建了一個(gè)簡(jiǎn)單而完整的讀寫分離系統(tǒng)。
希望這篇文章對(duì)你理解Spring Boot和MyBatis-Plus的讀寫分離實(shí)現(xiàn)提供了幫助。在實(shí)際項(xiàng)目中,可以根據(jù)具體的業(yè)務(wù)需求和性能要求調(diào)整和拓展這一方案。
??結(jié)尾 ?? 感謝您的支持和鼓勵(lì)! ????
??您可能感興趣的內(nèi)容:文章來源:http://www.zghlxwxcb.cn/news/detail-755492.html
- 【Java面試技巧】Java面試八股文 - 掌握面試必備知識(shí)(目錄篇)
- 【Java學(xué)習(xí)路線】2023年完整版Java學(xué)習(xí)路線圖
- 【AIGC人工智能】Chat GPT是什么,初學(xué)者怎么使用Chat GPT,需要注意些什么
- 【Java實(shí)戰(zhàn)項(xiàng)目】SpringBoot+SSM實(shí)戰(zhàn):打造高效便捷的企業(yè)級(jí)Java外賣訂購系統(tǒng)
- 【數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)】從零起步:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的完整路徑
文章來源地址http://www.zghlxwxcb.cn/news/detail-755492.html
到了這里,關(guān)于Spring Boot + MyBatis-Plus實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!