侧边栏壁纸
博主头像
iffyoO

一时的选择

  • 累计撰写 9 篇文章
  • 累计创建 7 个标签
  • 累计收到 1 条评论

SpringBoot+MybatisPlus 实现多数据源动态切换

iffyoO
2024-01-26 / 0 评论 / 0 点赞 / 292 阅读 / 594 字
温馨提示:
本文最后更新于 2024-01-26,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

一、动态多数据源的场景

  1. 应用不拆,数据库拆
  2. 读写分离

二、动态多数据源的实现

使用dynamic-datasource-spring-boot-starter依赖包

使用@DS(value = “数据源”)注解

三、实现过程

事先准备

这里创建了两个数据库db1和db2

user表在db1数据库

book表在db2数据库

Snipaste_2024-01-26_21-56-44

1、依赖

<!--MySQL数据库-->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
</dependency>

<!--Mybatis-Plus-->
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.4.0</version>
</dependency>

<!--多数据源-->
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
	<version>3.5.2</version>
</dependency>

2、application.yaml

primary表示默认使用哪个数据源

server:
  port: 7080

spring:
  datasource:
    dynamic:
      datasource:
        # 数据源1
        db1:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/db1?useUnicode=true&characterEncoding=utf-8
          username: root
          password: root

        # 数据源2
        db2:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/db2?useUnicode=true&characterEncoding=utf-8
          username: root
          password: root
      primary: db1

mybatis-plus:
  mapper-locations: classpath:/mapper/*.xml ## 配置MyBatis-Plus扫描Mapper文件的位置

3、实现好基本的代码

Snipaste_2024-01-26_22-00-52 测试

四、测试

实现查询db1里user表的用户列表并往db2里的book表插入一条数据

1、TestController

@Slf4j
@RestController
@RequestMapping("/api/test/")
public class TestController {

    @Autowired(required = false)
    private UserService userService;

    @GetMapping("t1")
    public List<UserDO> t1() {
        List<UserDO> list = userService.list();
        return list;
    }
}

2、BookService

写一个插入的方法

public interface BookService {
    int insertDO(BookDO bookDO);
}

3、BookServiceImpl

实现插入的方法

这里要注意,在方法体上加入@DS注解

@DS()里的value就是yaml配置文件里的数据源名称

@Service
public class BookServiceImpl implements BookService {

    @Autowired(required = false)
    private BookMapper bookMapper;

    @Override
    @DS(value = "db2") // 声明使用db2数据源
    public int insertDO(BookDO bookDO) {
        return bookMapper.insert(bookDO);
    }
}

4、UserServiceImpl

@Slf4j
@Service
public class UserServiceImpl implements UserService {

    @Autowired(required = false)
    private UserMapper userMapper;

    @Autowired(required = false)
    private BookService bookService;

    @Override
    public List<UserDO> list() {
        List<UserDO> userDOList = userMapper.selectList(null);
        BookDO bookDO = new BookDO();
        bookDO.setTitle("查令十字街84号");
        bookDO.setPrice(19.9);
        bookService.insertDO(bookDO);
        log.info("book:{}", bookDO);
        return userDOList;
    }
}

5、使用ApiFox进行接口调试

发现成功地查询了user表的用户列表

Snipaste_2024-01-26_22-21-28

并且book表成功地插入了一条数据

Snipaste_2024-01-26_22-22-59

0

评论区