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

作者:码拉松 时间:2022-05-25 04:02:57 

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

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

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

8. 结果验证

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

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

来源:https://blog.csdn.net/CSDN_WYL2016/article/details/124086758

标签:SpringBoot,多数据源
0
投稿

猜你喜欢

  • win10下配置java环境变量的方法

    2022-08-23 17:10:11
  • C#中的try catch finally用法分析

    2021-06-20 18:31:28
  • Java 中如何使用 stream 流

    2021-10-09 01:13:37
  • C# SQLite库使用技巧

    2023-10-27 19:05:21
  • Struts2中异常处理机制分析

    2023-11-17 21:54:32
  • JavaMap两种遍历方式keySet与entrySet详解

    2022-04-17 14:36:29
  • Java基础-Java的体系结构

    2022-05-18 00:19:05
  • springboot反爬虫组件kk-anti-reptile的使用方法

    2022-01-09 14:12:59
  • 基于java实现简单发红包功能

    2023-08-09 17:06:40
  • Java修饰符 abstract,static,final 的区别详解

    2023-12-19 22:11:25
  • Maven安装及MyEclipse中使用Maven

    2023-06-20 04:29:07
  • springmvc分层领域模型概念详解

    2021-09-07 01:21:51
  • java实现面板之间切换功能

    2021-12-03 15:06:39
  • Android Webview重定向问题解决方法

    2023-10-08 01:29:19
  • 使用Java实现简单串口通信

    2022-07-27 14:48:52
  • SpringBoot-JPA删除不成功,只执行了查询语句问题

    2022-09-10 04:13:55
  • java读取cvs文件并导入数据库

    2023-11-25 01:23:13
  • Java中的字符串常量池详细介绍

    2023-03-08 09:16:41
  • 关于MyBatis中SqlSessionFactory和SqlSession简解

    2022-02-18 13:57:37
  • Android内存优化杂谈

    2023-06-18 15:46:41
  • asp之家 软件编程 m.aspxhome.com