使用SpringBoot配置多数据源的经验分享

 更新时间:2022年04月11日 10:23:07   作者:码拉松  
这篇文章主要介绍了使用SpringBoot配置多数据源的经验分享,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

1. 引入jar包

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.multi.datasource</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.8</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.22</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2. properties配置

分别准备两个数据源

server.port=18888
mybatis.mapper-locations=classpath:mapper/*.xml

my1.datasource.url=jdbc:mysql://10.0.0.125:3306/wyl?autoReconnect=true
my1.datasource.driverClassName=com.mysql.cj.jdbc.Driver
my1.datasource.username=root
my1.datasource.password=123456

my2.datasource.url=jdbc:mysql://10.0.0.160:3306/wyl?autoReconnect=true
my2.datasource.driverClassName=com.mysql.cj.jdbc.Driver
my2.datasource.username=root
my2.datasource.password=123456

3. 分别配置两个数据源

第一个数据源

package com.multi.datasource.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
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;

@Configuration
@MapperScan(basePackages = My1DataSourceConfig.PACKAGE, sqlSessionFactoryRef = "my1SqlSessionFactory")
public class My1DataSourceConfig {

    static final String PACKAGE = "com.multi.datasource.dao.my1";
    static final String MAPPER_LOCATION = "classpath:mapper/*.xml";

    @Value("${my1.datasource.url}")
    private String url;

    @Value("${my1.datasource.username}")
    private String user;

    @Value("${my1.datasource.password}")
    private String password;

    @Value("${my1.datasource.driverClassName}")
    private String driverClass;

    @Bean(name = "my1DataSource")
    public DataSource my1DataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        dataSource.setMaxWait(Integer.MAX_VALUE);
        dataSource.setTestOnBorrow(true);
        dataSource.setTestOnReturn(true);
        dataSource.setTestWhileIdle(true);
        return dataSource;
    }

    @Bean(name = "my1TransactionManager")
    public DataSourceTransactionManager my1TransactionManager() {
        return new DataSourceTransactionManager(my1DataSource());
    }

    @Bean(name = "my1SqlSessionFactory")
    public SqlSessionFactory my1SqlSessionFactory(@Qualifier("my1DataSource") DataSource my1DataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(my1DataSource);
        sessionFactory.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources(My1DataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

第二个数据源

package com.multi.datasource.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
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;

@Configuration
@MapperScan(basePackages = My1DataSourceConfig.PACKAGE, sqlSessionFactoryRef = "my1SqlSessionFactory")
public class My1DataSourceConfig {

    static final String PACKAGE = "com.multi.datasource.dao.my1";
    static final String MAPPER_LOCATION = "classpath:mapper/*.xml";

    @Value("${my1.datasource.url}")
    private String url;

    @Value("${my1.datasource.username}")
    private String user;

    @Value("${my1.datasource.password}")
    private String password;

    @Value("${my1.datasource.driverClassName}")
    private String driverClass;

    @Bean(name = "my1DataSource")
    public DataSource my1DataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        dataSource.setMaxWait(Integer.MAX_VALUE);
        dataSource.setTestOnBorrow(true);
        dataSource.setTestOnReturn(true);
        dataSource.setTestWhileIdle(true);
        return dataSource;
    }

    @Bean(name = "my1TransactionManager")
    public DataSourceTransactionManager my1TransactionManager() {
        return new DataSourceTransactionManager(my1DataSource());
    }

    @Bean(name = "my1SqlSessionFactory")
    public SqlSessionFactory my1SqlSessionFactory(@Qualifier("my1DataSource") DataSource my1DataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(my1DataSource);
        sessionFactory.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources(My1DataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

4. Dao目录

为了区分两个数据源,分别设置了不同的目录

package com.multi.datasource.dao.my1;

import com.multi.datasource.entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface Test1Mapper {
    
    UserEntity query();
    
}
package com.multi.datasource.dao.my2;

import com.multi.datasource.entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface Test2Mapper {
    
    UserEntity query();
    
}

5. Entity

package com.multi.datasource.entity;

import lombok.Data;

@Data
public class UserEntity {

    private String userName;

}

6. Mapper文件

从my1数据源查询

<?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.multi.datasource.dao.my1.Test1Mapper">

<select id="query" resultType="com.multi.datasource.entity.UserEntity">
        select user_name as userName from t_user
    </select>

</mapper>

从my2数据源查询

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.multi.datasource.dao.my2.Test2Mapper">
    
    <select id="query" resultType="com.multi.datasource.entity.UserEntity">
        select user_name as userName from t_user
    </select>
    
</mapper>

7. Controller测试

package com.multi.datasource.controller;

import com.multi.datasource.dao.my1.Test1Mapper;
import com.multi.datasource.dao.my2.Test2Mapper;
import com.multi.datasource.entity.UserEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class TestController {

    @Resource
    private Test1Mapper test1Mapper;

    @Resource
    private Test2Mapper test2Mapper;

    @RequestMapping("query")
    public void query() {
        UserEntity user1 = test1Mapper.query();
        System.out.println("my1 dataSource:" + user1);


        UserEntity user2 = test2Mapper.query();
        System.out.println("my2 dataSource:" + user2);
    }

}

两个数据源,对应的user_name分别是zhangsan和lisi

在这里插入图片描述

在这里插入图片描述

8. 结果验证

访问 http://localhost:18888/query,结果如下

在这里插入图片描述

到此这篇关于使用SpringBoot配置多数据源的经验分享的文章就介绍到这了,更多相关SpringBoot配置多数据源内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java把数字格式化为货币字符串实例代码

    Java把数字格式化为货币字符串实例代码

    这篇文章主要介绍了Java把数字格式化为货币字符串实例代码,需要的朋友可以参考下
    2014-02-02
  • java 取模与取余的区别说明

    java 取模与取余的区别说明

    这篇文章主要介绍了java 取模与取余的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • spring boot actuator监控超详细教程

    spring boot actuator监控超详细教程

    Spring Boot Actuator就是一款可以帮助你监控系统数据的框架,其可以监控很多很多的系统数据,接下来通过本文给大家介绍spring boot actuator监控超详细教程,感兴趣的朋友一起看看吧
    2021-10-10
  • Java 你知道什么是耦合、如何解(降低)耦合

    Java 你知道什么是耦合、如何解(降低)耦合

    这篇文章主要介绍了Java 你知道什么是耦合、如何解(降低)耦合的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • mybatis-plus 版本不兼容问题的解决

    mybatis-plus 版本不兼容问题的解决

    这篇文章主要介绍了mybatis-plus 版本不兼容问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java 超基础讲解String的使用

    Java 超基础讲解String的使用

    字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串,让我们一起来了解它
    2022-04-04
  • Java泛型映射不同的值类型详解及实例代码

    Java泛型映射不同的值类型详解及实例代码

    这篇文章主要介绍了Java泛型映射不同的值类型详解及实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • SpringBoot自定义FailureAnalyzer详解

    SpringBoot自定义FailureAnalyzer详解

    这篇文章主要介绍了SpringBoot自定义FailureAnalyzer详解,FailureAnalyzer是一种在启动时拦截 exception 并将其转换为 human-readable 消息的好方法,包含在故障分析中,需要的朋友可以参考下
    2023-11-11
  • 详解SpringBoot注册Windows服务和启动报错的原因

    详解SpringBoot注册Windows服务和启动报错的原因

    这篇文章主要介绍了详解SpringBoot注册Windows服务和启动报错的原因,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Java的反射机制之类加载详解

    Java的反射机制之类加载详解

    这篇文章主要介绍了Java的反射机制之类加载详解,反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载,静态加载是指在编译时期确定要加载的类的类型,即通过class关键字和类名来获取对应类的类型,需要的朋友可以参考下
    2023-09-09

最新评论