SpringBoot配置多数据源(MySQL+SQLServer)

本文介绍如何在SpringBoot项目中配置多数据源,包括MySQL和SQLServer,涉及application.properties和DataConfig的核心配置。作者分享了配置过程中的常见问题和解决方法,适合初学者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近刚学习springboot,为了以后的开发需要故搭建双数据源配置,本文中使用了MySQL+SQLServer,若想在换成oracle数据库,直接在此数据配置的基础上进行再增加一个类似的配置,项目主要分为controller层,dao层,DataConfig层,entity层,service层,并且在每层中又区分为mysql与sqlserver
在这里整个项整个目的插入图片描述
整个功能最主要的核心在于application.properties与DataConfig中的配置
并且在配置过程中也会遇到若干坑,接下来我将着重讲解比较坑的地方

application.properties

需要注意的一点在于这里应为jdbc-url,而不是url

#扫描映射文件
mybatis.mapper-locations=classpath:mapper/mysql_mapper/*.xml,classpath:mapper/sqlserver_mapper/*.xml

#配置mysql数据库
spring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&autoReconnect=true&failOve\
                rReadOnly=false&autoReconnectForPools=true&serverTimezone=UTC
spring.datasource.test1.username=root
spring.datasource.test1.password=root

#sqlserver数据库
spring.datasource.test2.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.test2.jdbc-url=jdbc:sqlserver://127.0.0.1:1433;databasename=testms
spring.datasource.test2.username=sa
spring.datasource.test2.password=root

#mybitis中打印sql语句
logging.level.com.example.testoubledatasource.dao.mysql_dao.*=debug
logging.level.com.example.testoubledatasource.dao.sqlserver_dao.*=debug

#过滤静态资源
spring.mvc.static-path-pattern=/**

#指定系统直接访问路径
spring.resources.static-locations = classpath:/templates/,classpath:/META-INF/resources/,classpath:/resources/
#热部署:修改后台文件保存后自动重启
#spring.devtools.restart.enabled=true

#Messages资源信息
#spring.messages.basename=messages

#关闭thymeleaf缓存 开发时使用 否则没有实时画面
spring.thymeleaf.cache=false

DataByMySQL

package com.example.testoubledatasource.DataConfig;



import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;
//basePackages为dao层接口(用来与数据库做交互)所在的包名
@Configuration
@MapperScan(basePackages = {
   
   "com.example.testoubledatasource.dao.mysql_dao"},sqlSessionFactoryRef = "test1SqlSessionFactory")
public class DataByMySQL {
   
   

//  @ConfigurationProperties注解的作用就是从application.properties中读取以  spring.datasource.test1 开头的那些配置,并将其设置为数据源的配置
    @Bean(name = "test1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    public DataSource testDataSource(){
   
   
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "test1SqlSessionFactory")
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource)throws Exception{
   
   
        SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
//        路径地址为mapper.xml所在的位置,这个xml是配置文件,处在resource里面,主要用来写查询语句
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/mysql_mapper/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "test1TransactionManager")
    public DataSourceTransactionManager testTransactionManager(@Qualifier
### Spring Boot多数据源配置方法 #### 配置文件设置 为了在Spring Boot项目配置并使用多个数据源MySQL和SQL Server),需要先修改`application.yml`或`application.properties`中的相应属性。以下是针对两个不同数据库的数据源配置示例: 对于MySQL数据源,在配置文件中添加如下属性[^1]: ```yaml spring: datasource: mysql: url: jdbc:mysql://localhost:3306/db_mysql?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: secret driver-class-name: com.mysql.cj.jdbc.Driver ``` 而对于SQL Server,则需指定另一组参数来定义其连接细节[^4]: ```yaml spring: datasource: sqlserver: url: jdbc:sqlserver://localhost:1433;DatabaseName=db_sqlserver username: sa password: your_password_here driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver ``` 注意这里通过不同的前缀区分了两种类型的数据库,即`mysql:` 和 `sqlserver:`。 #### 编写自定义配置类 除了上述基本配置外,还需要创建Java配置类以便更好地管理和初始化这些数据源对象。这可以通过继承`AbstractRoutingDataSource`来自定义路由逻辑或者直接声明Bean实例的方式完成。当采用后者时,代码可能类似于这样[^2]: ```java @Configuration public class DataSourceConfig { @Primary @Bean(name = "primaryDataSource") @ConfigurationProperties(prefix="spring.datasource.mysql") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @ConfigurationProperties(prefix="spring.datasource.sqlserver") public DataSource secondaryDataSource(){ return DataSourceBuilder.create().build(); } } ``` 此部分展示了如何为每种数据源分别注册对应的bean,并指定了各自的名称以及关联的属性前缀用于读取相应的环境变量。 #### 定义DAO接口和服务层组件 接下来就是按照业务需求编写持久化层接口及其服务端实现。考虑到可能存在跨库查询的情况,建议将与特定DBMS交互的操作封装到独立的服务模块内,从而提高系统的可维护性和扩展性。 例如,针对MySQL设计了一个名为`MobileMySqlMapper`的映射器接口,它负责执行一些简单的CRUD操作: ```java @Component(value = "mobileMySqlMapper") public interface MobileMySqlMapper { /** * 查询用户信息 * * @return 用户列表 */ @Select("SELECT id, openId, telephone FROM mobile_user WHERE status = 0 ") List<MobileUserInfo> getMobileUserInfo(); } ``` 同样地,也可以为SQL Server建立类似的访问入口点,只是要确保它们位于各自专属的基础包路径下以避免混淆。 #### 使用Dynamic Datasource Starter简化流程 如果希望进一步减少编码工作量并且增强灵活性的话,还可以考虑引入第三方依赖项——`dynamic-datasource-spring-boot-starter`,该插件支持多种主流关系型数据库之间的无缝切换,同时也兼容XA/XID协议下的分布式事务管理机制[^3]。 只需简单调整POM文件即可快速集成这一特性: ```xml <!-- pom.xml --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>x.x.x</version> </dependency> ``` 之后便能轻松实现在运行期间动态改变目标数据源的功能而无需频繁改动原有架构。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值