SpringBoot连接多数据源MySQL、SqlServer等(MyBatisPlus测试)

SpringBoot连接多数据源MySQL、SqlServer等(MyBatisPlus测试)

在实际的项目开发中,我们往往需要同时连接多个数据源对数据进行处理。本文将详细介绍在SpringBoot下配合MybatisPlus如何连接多数据源,实例将会使用连接MySQL、SqlServer进行测试,可自行根据思路供自行连接Oracle、PostgreSQL等数据库。

1 创建需要的数据库和数据
1.1准备工作:

需要准备至少两台以上安装有mysql或sqlserver其他数据库的服务器,便于后续测试
例如:已经在服务器上安装好以下数据库
MySQL版本: 5.7.44
SqlServer版本: 2012

1.2 创建mysql测试库

例如在192.168.3.220服务器上创建jialiangkj-pet数据库,创建test表并添加测试数据

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for test
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `id` int(11) NOT NULL,
  `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `remark` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES (1, '哈士奇', '这是一个正式库');

SET FOREIGN_KEY_CHECKS = 1;

在这里插入图片描述

在192.168.88.170服务器上创建jialiangkj-pet数据库,添加test表并添加测试数据

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for test
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `id` int(11) NOT NULL,
  `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `remark` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES (1, '边牧', '这是一个测试库');

SET FOREIGN_KEY_CHECKS = 1;

在这里插入图片描述

1.3 创建sqlserver测试库

在本机的sqlserver数据库上创建test数据库,创建test表并添加测试数据

CREATE TABLE test.dbo.test (
	id int NOT NULL,
	name varchar(20) COLLATE Chinese_PRC_CI_AS NULL,
	remark varchar(50) COLLATE Chinese_PRC_CI_AS NULL,
	CONSTRAINT test_pk PRIMARY KEY (id)
);
INSERT INTO test.dbo.test (name,remark,id) VALUES
	 (N'柯基',N'这是sqlserver数据库',1);

在这里插入图片描述

2 SpringBoot依赖引入
2.1 准备工作

首先需要一个已经创建好可用的SpringBoot项目工程,且已经安装MybatisX插件(自动化生成mapper、xml等文件)
单体架构工程创建请参考:Springboot创建Mave聚合工程(可灵活创建任意版本)
微服务工程创建请参考:SpringCloud微服务聚合工程创建指南

环境准备

  1. jdk1.8
  2. SpringBoot2.7.18
  3. MySQL5.7.44
  4. SqlServer2012
  5. JetBrains IDEA2023.3
  6. MyBatis-Plus 3.5.0
2.2 添加相关的pom文件依赖

在根目录的pom文件中引入如下依赖

<properties>
    <dynamic-ds.version>3.5.2</dynamic-ds.version>
    <mybatis-plus.version>3.5.4</mybatis-plus.version>
    <mysql.version>8.0.33</mysql.version>
    <sqlserver.version>12.4.2.jre8</sqlserver.version>
</properties>            
<dependencyManagement>
	<dependencies>
        <!-- dynamic-datasource 多数据源-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>${dynamic-ds.version}</version>
        </dependency>

        <!-- mybatis-plus  -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>

        <!-- mysql 驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>

        <!-- SqlServer -->
         <dependency>
             <groupId>com.microsoft.sqlserver</groupId>
             <artifactId>mssql-jdbc</artifactId>
             <version>${sqlserver.version}</version>
         </dependency>
    </dependencies>
</dependencyManagement>

在common模块中引入对应的依赖项

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

    <!-- mybatis-plus  -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
    </dependency>
 </dependency>

在需要执行数据库连接的服务加入mysql、sqlserver依赖驱动,例如此处使用file文件服务做示例
在这里插入图片描述

    <dependencies>
        <!-- mysql 驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- SqlServer -->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
        </dependency>

    </dependencies>

注意:以上依赖项为微服务架构引入示例,如果使用单体架构的项目根据需要直接一次性引入所有上述依赖效果一致

2.3 application.yml文件配置
mybatis-plus:
  mapper-locations: classpath*:/mapper/*.xml
  global-config:
    db-config:
      id-type: assign_id
    banner: false
    
--- # 数据源配置
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
    dynamic:
      # 设置默认的数据源或者数据源组,默认值即为 master
      primary: master
      # 严格模式 匹配不到数据源则报错
      strict: true
      datasource:
        # 主库数据源
        master:
          type: ${spring.datasource.type}
          driverClassName: com.mysql.cj.jdbc.Driver
          # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
          url: jdbc:mysql://192.168.3.220:3306/jialiangkj-pet?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
          username: root
          password: lvdamaoluguo
        # 从库数据源
        slave:
          lazy: true
          type: ${spring.datasource.type}
          driverClassName: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://192.168.88.170:3306/jialiangkj-pet-test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
          username: root
          password: lvdamaoluguo

        sqlserver:
          type: ${spring.datasource.type}
          driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
          url: jdbc:sqlserver://localhost:1433;DatabaseName=test;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
          username: sa
          password: lvdamaoluguo
      hikari:
        # 最大连接池数量
        maxPoolSize: 20
        # 最小空闲线程数量
        minIdle: 10
        # 配置获取连接等待超时的时间
        connectionTimeout: 30000
        # 校验超时时间
        validationTimeout: 5000
        # 空闲连接存活最大时间,默认10分钟
        idleTimeout: 600000
        # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
        maxLifetime: 1800000
        # 多久检查一次连接的活性
        keepaliveTime: 30000
2.4 添加mapper包扫描

在Application启动类,添加启动扫描mapper包

@MapperScan(basePackages = "cn.com.jialiangkj.file.mapper") // 此处填写需要扫描的包路径

在这里插入图片描述

3 MyBatisPlus持久化文件自动引入

请参考文章快速自动化引入:Springboot快速生成Mapper、Xml、Pojo、Service的神器MyBatisX

4 多数据源使用
4.1 在controller层使用

在controller包下创建一个TestController控制器类,并引入以下代码

@RestController
@RequestMapping("/file")
@RequiredArgsConstructor
public class TestController {

    private final TestService testService;
    @GetMapping("/hello")
    public String hello(){
        return "Hello World!";
    }

    @GetMapping("/mysql_master")
    public R mysqlMaster(){
        TestEntity testEntity = testService.getById(1);
        return R.ok(testEntity);
    }

    @DS("slave")
    @GetMapping("/mysql_slave")
    public R mysqlSlave(){
        TestEntity testEntity = testService.getById(1);
        return R.ok(testEntity);
    }

    @DS("sqlserver")
    @GetMapping("/sql_server")
    public R sqlServer(){
        TestEntity testEntity = testService.getById(1);
        return R.ok(testEntity);
    }
}

注意:如果项目中没有已经封装好的返回数据对象R类,那么可以使用print对返回结果的类进行tostring打印即可,或者打断点进入调试模式查看查询返回结果。

查询mysql主库mysql_master结果
在这里插入图片描述
查询mysql从库mysql_slave结果
在这里插入图片描述

询sqlserver数据库sql_server结果
在这里插入图片描述

4.2 在service层使用

在TestService添加测试接口函数

public interface TestService extends IService<TestEntity> {
    /**
     * 获取主MySQL数据库中的TestEntity实体。
     *
     * @return 从主MySQL数据库中获取的TestEntity实例。
     */
    public TestEntity getTestMysqlMaseter();

    /**
     * 获取从MySQL数据库中的TestEntity实体。
     *
     * @return 从MySQL从库中获取的TestEntity实例。
     */
    public TestEntity getTestMysqlSalve();

    /**
     * 获取SQL Server数据库中的TestEntity实体。
     *
     * @return 从SQL Server数据库中检索到的TestEntity实例。
     */
    public TestEntity getTestSqlServer();

}

在TestServiceImpl添加实现测试函数

@Service
@RequiredArgsConstructor
public class TestServiceImpl extends ServiceImpl<TestMapper, TestEntity>
    implements TestService {

    private final TestMapper testMapper;

    @DS("master")
    public TestEntity getTestMysqlMaseter() {
        return testMapper.selectById(1);
    }
    @DS("slave")
    public TestEntity getTestMysqlSalve() {
        return testMapper.selectById(1);
    }
    @DS("sqlserver")
    public TestEntity getTestSqlServer() {
        return testMapper.selectById(1);
    }
}

修改TestController控制器类代码,调用impl对应方法进行测试

@RestController
@RequestMapping("/file")
@RequiredArgsConstructor
public class TestController {

    private final TestService testService;
    @GetMapping("/hello")
    public String hello(){
        return "Hello World!";
    }

    @GetMapping("/mysql_master")
    public R mysqlMaster(){
        TestEntity testEntity = testService.getTestMysqlMaseter();
        System.out.println(testEntity.toString());
        return R.ok();
    }

    @GetMapping("/mysql_slave")
    public R mysqlSlave(){
        TestEntity testEntity = testService.getTestMysqlSalve();
        System.out.println(testEntity.toString());
        return R.ok();
    }

    @GetMapping("/sql_server")
    public R sqlServer(){
        TestEntity testEntity = testService.getTestSqlServer();
        System.out.println(testEntity.toString());
        return R.ok();
    }
}

打开浏览器或者使用apifox等接口工具,发送对应的get请求,可以在控制台看到已经执行对应数据库的查询
在这里插入图片描述

总结:经过上述演示,我们已经实现了在springboot项目中实现多数据库源的连接和操作,如果需要使用不同数据库,按照上述操作思路即可实现。

### Spring Boot 中集成 MyBatis-Plus 实现 MySQL 和 Oracle 的多数据源配置 #### 1. 添加依赖项 为了在 Spring Boot 项目中使用 MyBatis-Plus 并支持多个数据源(MySQL 和 Oracle),需要引入必要的 Maven 或 Gradle 依赖。以下是基于 Maven 的示例: ```xml <dependencies> <!-- Spring Boot Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- MyBatis Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3</version> </dependency> <!-- MySQL Driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- Oracle Driver --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.8.0.0</version> </dependency> <!-- DataSource Configuration Support --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency> </dependencies> ``` 以上代码片段展示了如何通过 Maven 引入所需的库文件[^1]。 --- #### 2. 数据源配置 在 `application.yml` 文件中定义两个数据源的连接信息,分别对应 MySQL 和 Oracle 数据库。 ```yaml spring: datasource: mysql: url: jdbc:mysql://localhost:3306/mysql_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: root password: root_password driver-class-name: com.mysql.cj.jdbc.Driver oracle: url: jdbc:oracle:thin:@//localhost:1521/orclpdb1 username: system password: oracle_password driver-class-name: oracle.jdbc.driver.OracleDriver mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` 上述 YAML 配置提供了两种不同类型的数据库连接字符串及其驱动程序设置[^2]。 --- #### 3. 创建动态数据源管理器 编写一个自定义的数据源切换逻辑,用于根据业务需求动态选择目标数据源。 ```java import javax.sql.DataSource; import java.util.HashMap; import java.util.Map; @Configuration public class DynamicDataSourceConfig { @Bean public DataSource dataSource(@Qualifier("mysqlDataSource") DataSource mysqlDataSource, @Qualifier("oracleDataSource") DataSource oracleDataSource) { Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put("mysql", mysqlDataSource); targetDataSources.put("oracle", oracleDataSource); DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource(); dynamicRoutingDataSource.setTargetDataSources(targetDataSources); dynamicRoutingDataSource.setDefaultTargetDataSource(mysqlDataSource); // 默认数据源设为 MySQL return dynamicRoutingDataSource; } } ``` 此部分实现了动态路由的功能,允许应用程序灵活地访问不同的数据库实例[^3]。 --- #### 4. 定义具体的数据源 Bean 分别为 MySQL 和 Oracle 注册独立的 `DataSource` Bean。 ```java @Configuration public class DataSourceConfiguration { @Primary @Bean(name = "mysqlDataSource") @ConfigurationProperties(prefix = "spring.datasource.mysql") public DataSource mysqlDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "oracleDataSource") @ConfigurationProperties(prefix = "spring.datasource.oracle") public DataSource oracleDataSource() { return DataSourceBuilder.create().build(); } } ``` 这里利用了 Spring 的 `@ConfigurationProperties` 来简化属性映射过程。 --- #### 5. 使用 MyBatis-Plus 的 BaseMapper 接口 针对每种数据源创建各自的 Mapper 接口并绑定到相应的 Service 层组件上。 对于 **MySQL** 表的操作: ```java @Mapper public interface UserMapper extends BaseMapper<UserEntity> {} ``` 而对于 **Oracle** 表,则需另行声明另一个 Mapper 类型: ```java @Mapper public interface EmployeeMapper extends BaseMapper<EmployeeEntity> {} ``` 这些接口继承自 MyBatis-Plus 提供的基础 CRUD 功能类,从而极大程度减少手动编码工作量。 --- #### 6. 测试验证 最后,在单元测试或者实际运行环境中确认能否正常读取来自两套异构存储系统中的记录内容。 ```java @SpringBootTest class MultiDatasourceApplicationTests { @Autowired private UserMapper userMapper; @Autowired private EmployeeMapper employeeMapper; @Test void testMysqlQuery() { List<UserEntity> users = userMapper.selectList(null); assertNotNull(users); } @Test void testOracleQuery() { List<EmployeeEntity> employees = employeeMapper.selectList(null); assertNotNull(employees); } } ``` 完成以上步骤即可成功搭建起一个多数据源架构下的持久层框架解决方案。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值