本文使用application或yml+配置类的方式,进行多数据源配置,与传统的xml方式相比,原理一致,但该方式更简便,上手难度低,避免的繁琐的xml配置,企业级开发一般使用该方式
以MySQL和Oracle两个数据库为例
建表如下:
- CREATE TABLE `user` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT,
- `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
- `age` int(11) NULL DEFAULT NULL,
- PRIMARY KEY (`id`) USING BTREE
- ) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-
-
- INSERT INTO `user` VALUES (1, '张三', 18);
- INSERT INTO `user` VALUES (2, '李四', 19);
- INSERT INTO `user` VALUES (3, '王五', 20);
- INSERT INTO `user` VALUES (4, '赵六', 19);
- INSERT INTO `user` VALUES (5, '老七', 17);
- INSERT INTO `user` VALUES (6, '芈八子', 18);
- INSERT INTO `user` VALUES (7, '久久', 99);
- --Oracle测试表
- CREATE TABLE city (
- id number(10) not null,
- name varchar2(40),
- parent varchar2(40)
- );
-
- insert into city(id,name,parent) values(1,'广州','广东');
- insert into city(id,name,parent) values(1,'深圳','广东');
- insert into city(id,name,parent) values(1,'厦门','福建');
- insert into city(id,name,parent) values(1,'长沙','湖南');
- commit;
| 数据库类型 | 数据库名称 | 账号 | 密码 |
|---|---|---|---|
| MySQL | demo | root | root |
| Oracle | demo2 | root | 123456 |
这里我就略过了,我使用的版本为2.3.7.RELEASE
这里附上项目所需的maven依赖,如下(注意Druid与mybatis的版本):
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
- <dependency>
- <groupId>com.baomidougroupId>
- <artifactId>mybatis-plus-boot-starterartifactId>
- <version>3.3.0version>
- dependency>
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>druidartifactId>
- <version>1.1.21version>
- dependency>
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>fastjsonartifactId>
- <version>1.2.72version>
- dependency>
- <dependency>
- <groupId>com.google.code.gsongroupId>
- <artifactId>gsonartifactId>
- <version>2.8.5version>
- dependency>
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-lang3artifactId>
- <version>3.1version>
- dependency>
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>5.1.48version>
- <scope>runtimescope>
- dependency>
- <dependency>
- <groupId>com.oraclegroupId>
- <artifactId>ojdbc6artifactId>
- <version>11.2.0.4.0version>
- <scope>runtimescope>
- dependency>
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <optional>trueoptional>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- <exclusions>
- <exclusion>
- <groupId>org.junit.vintagegroupId>
- <artifactId>junit-vintage-engineartifactId>
- exclusion>
- exclusions>
- dependency>
在resource目录下,新建application.yml文件,并配置两个数据源的链接信息:
如下:
- spring:
- datasource:
- #使用Druid数据源连接池
- type: com.alibaba.druid.pool.DruidDataSource
- #数据源01的连接信息
- db1:
- #存在多个 url时,必须使用jdbc-url来定义,否则连接不到数据库
- jdbc-url: jdbc:mysql://127.0.0.1:3306/demo
- username: root
- password: root
- driver-class-name: com.mysql.jdbc.Driver
- #数据源02的连接信息
- db2:
- jdbc-url: jdbc:oracle:thin:@127.0.0.1:1521:salescdh
- username: root
- password: 123456
- driver-class-name: oracle.jdbc.OracleDriver
在与controller同层中,新建一个包,存放两个数据源对应的配置类
如下:

内容如下:
- package com.shuizhu.config;
-
- 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.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.context.annotation.Primary;
- import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
-
- import javax.sql.DataSource;
-
- /**
- * 数据源01的配置类
- *
- * @author 睡竹
- * @date 2022/9/19
- */
- @Configuration
- @MapperScan(basePackages = "com.shuizhu.dao.db1", sqlSessionFactoryRef = "db1SqlSessionFactory")
- public class DataSource01 {
- @Primary
- @Bean(name = "db1DataSource")
- @ConfigurationProperties("spring.datasource.db1")
- public DataSource db1DataSource() {
- return DataSourceBuilder.create().build();
- }
-
- @Bean(name = "db1SqlSessionFactory")
- public SqlSessionFactory sqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
- SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
- bean.setDataSource(dataSource);
- //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResource("classpath:mapper/db1/Demo.xml"));
- PathMatchingResourcePatternResolver resource = new PathMatchingResourcePatternResolver();
- bean.setMapperLocations(resource.getResources("classpath:mapper/db1/*.xml"));
- return bean.getObject();
- }
- }
- package com.shuizhu.config;
-
- 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.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.context.annotation.Primary;
- import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
-
- import javax.sql.DataSource;
-
- /**
- * 数据源02的配置类
- *
- * @author 睡竹
- * @date 2022/9/19
- */
- @Configuration
- @MapperScan(basePackages = "com.shuizhu.dao.db2", sqlSessionFactoryRef = "db2SqlSessionFactory")
- public class DataSource02 {
- @Primary
- @Bean(name = "db2DataSource")
- @ConfigurationProperties("spring.datasource.db2")
- public DataSource db2DataSource() {
- return DataSourceBuilder.create().build();
- }
-
- @Bean(name = "db2SqlSessionFactory")
- public SqlSessionFactory sqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
- SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
- bean.setDataSource(dataSource);
- bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db2/*.xml"));
- return bean.getObject();
- }
- }
如图所示:
db1文件夹表示数据源1的映射xml文件存放地;
db2文件夹表示数据源2的映射xml文件存放地。
分别在文件夹下新建xml映射文件:

手写测试的SQL代码:
Demo.xml:
- "1.0" encoding="UTF-8"?>
- mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.shuizhu.dao.db1.DemoDao">
- <select id="getUsers" resultType="com.shuizhu.domain.User">
- select id,name,age from user
- select>
- mapper>
Demo2.xml:
- "1.0" encoding="UTF-8"?>
- mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.shuizhu.dao.db2.DemoOracleDao">
- <select id="getCitys" resultType="com.shuizhu.domain.City">
- select id,name,parent from city
- select>
- mapper>
如图所示:

测试代码如下:
DemoDao代码:
- package com.shuizhu.dao.db1;
-
- import com.shuizhu.domain.User;
- import org.springframework.stereotype.Repository;
-
- import java.util.List;
-
- /**
- * MySQL数据源的dao
- * @author 睡竹
- * @date 2022/9/15
- */
- @Repository
- public interface DemoDao {
- //@Select("select id,name,age from user")
- List
getUsers(); - }
DemoOracleDao代码:
- package com.shuizhu.dao.db2;
-
- import com.shuizhu.domain.City;
- import org.springframework.stereotype.Repository;
-
- import java.util.List;
-
- /**
- * Oracle数据源的dao
- * @author 睡竹
- * @date 2022/9/15
- */
- @Repository
- public interface DemoOracleDao {
- List
getCitys(); - }
如图所示:

- package com.shuizhu.controller;
-
- import com.shuizhu.domain.City;
- import com.shuizhu.domain.User;
- import com.shuizhu.service.IDemoService;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- import javax.annotation.Resource;
- import java.util.List;
-
- /**
- * @author 睡竹
- * @date 2022/9/15
- */
- @RestController
- public class DemoController {
-
- @Resource
- private IDemoService service;
-
- /**
- * 测试MySQL数据源是否生效
- * @return
- */
- @RequestMapping("testMySQL")
- public Object testMySQL(){
- List
users = service.getUsers(); - return users;
- }
-
- /**
- * 测试Oracle数据源是否生效
- * @return
- */
- @RequestMapping("testOracle")
- public Object testOracle(){
- List
users = service.getCitys(); - return users;
- }
- }
- package com.shuizhu.service;
-
- import com.shuizhu.domain.City;
- import com.shuizhu.domain.User;
-
- import java.util.List;
-
- /**
- * @author 睡竹
- * @date 2022/9/15
- */
- public interface IDemoService {
- List
getUsers(); - List
getCitys(); - }
- package com.shuizhu.service.impl;
-
- import com.shuizhu.dao.mysql.DemoDao;
- import com.shuizhu.dao.oracle.DemoOracleDao;
- import com.shuizhu.domain.City;
- import com.shuizhu.domain.User;
- import com.shuizhu.service.IDemoService;
- import lombok.RequiredArgsConstructor;
- import org.springframework.stereotype.Service;
-
- import java.util.List;
-
- /**
- * 偷懒了,直接写入到同一个service
- * @author 睡竹
- * @date 2022/9/15
- */
- @Service
- @RequiredArgsConstructor
- public class DemoService implements IDemoService {
-
- //MySQL的Dao构造器注入
- final DemoDao dao1;
- //Oracle的Dao构造器注入
- final DemoOracleDao dao2;
-
- @Override
- public List
getUsers() { - List
users = dao1.getUsers(); - return users;
- }
-
- @Override
- public List
getCitys() { - List
citys = dao2.getCitys(); - return citys;
- }
- }
User实体类:
- package com.shuizhu.domain;
-
- import lombok.Data;
- import java.io.Serializable;
- /**
- * MySQL库user表实体类
- * @author 睡竹
- * @date 2022/9/15
- */
- @Data
- public class User implements Serializable {
- private static final long serialVersionUID = 1L;
-
- private Integer id;
- private String name;
- private Integer age;
- }
City实体类:
- package com.shuizhu.domain;
-
- import lombok.Data;
- import java.io.Serializable;
- /**
- * Oracle库city表实体类
- * @author 睡竹
- * @date 2022/9/16
- */
- @Data
- public class City implements Serializable {
- private static final long serialVersionUID = 1L;
- private Integer id;
- private String name;
- private String parent;
- }
至此,测试流程及代码都已实现
附上整个springboot项目完整目录结构如:

使用api工具对接口进行测试,检验数据源是否生效
请求路径:http://127.0.0.1:9080/testMySQL

请求路径:http://127.0.0.1:9080/testOracle

测试成功,多数据源配置生效