springboot整合mybatis配置多数据源(mysql/oracle)

目录

前言

springboot整合mybatis配置多数据源,可以都是mysql数据源,也可以都是oracle数据源,也可以mysql/oracle数据源都有,下面是配置多数据源的步骤(不局限与某一类数据库),之前配过都是oracle数据源的配置,下面是验证这个想法的实现,实现效果后,好像也可以同时配MongoDB、Redis等其他的数据源配置,但是好像也没碰到有人在一个项目里面这么干过...要么都是mysql数据源要么都是oracle数据源。

导入依赖坐标

xml 复制代码
<dependencies>
    <!--springboot起步依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>${spring-boot.version}</version>
    </dependency>
    <!-- spring-boot-starter-web  -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--单元测试 包含junit-jupiter-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!--springboot整合mybatis -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>${mybatis.version}</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter-test</artifactId>
        <version>${mybatis.version}</version>
        <scope>test</scope>
    </dependency>
    <!--添加tk.mybatis用于对单表进行处理-->
    <dependency>
        <groupId>tk.mybatis</groupId>
        <artifactId>mapper-spring-boot-starter</artifactId>
        <version>${tk.mybatis.version}</version>
    </dependency>
    <!-- oracle驱动 -->
    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <version>${oracle.version}</version>
    </dependency>
    <!-- mysql驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
    </dependency>
    <!-- alibaba/druid -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>${druid.version}</version>
    </dependency>
    <!--c3p0连接池-->
    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>${c3p0.version}</version>
    </dependency>
</dependencies>

创建mysql/oracle数据源配置类

MySQLDataSourceConfig

java 复制代码
@Configuration
@MapperScan(basePackages = "com.example.dao.mysql", sqlSessionFactoryRef = "mysqlSessionFactory")
public class MySQLDataSourceConfig {
    @Primary // 表示这个数据源是默认数据源, 这个注解必须要加,因为不加的话spring将分不清楚那个为主数据源(默认数据源)
    @Bean("mysqlDataSource")
    //方式一:@ConfigurationProperties(prefix = "spring.datasource.mysql")
    @ConfigurationProperties(prefix = "spring.datasource.mysql") //读取application.yml中的配置参数映射成为一个对象
    public DataSource getMysqlDataSource() {
        return DataSourceBuilder.create().build();
    }
    //方式二:@Value注解方法 set方法注入yml数据源属性
    /*@Value("${spring.datasource.mysql.driver-class-name}")
    String driverClass;
    @Value("${spring.datasource.mysql.jdbc-url}")
    String url;
    @Value("${spring.datasource.mysql.username}")
    String userName;
    @Value("${spring.datasource.mysql.password}")
    String passWord;
    @Bean(name = "mysqlDataSource")
    @ConfigurationProperties("spring.datasource.mysql")
    public DataSource masterDataSource(){
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClass(driverClass);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(userName);
        dataSource.setPassword(passWord);
        return dataSource;
    }*/


    @Primary
    @Bean("mysqlSessionFactory")
    public SqlSessionFactory mysqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        // mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致)
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/mysql/*.xml")); // 持久化.xml文件的地址
        return bean.getObject();
    }

    @Primary
    @Bean("mysqlSessionTemplate")
    public SqlSessionTemplate mysqlSessionTemplate(@Qualifier("mysqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

OracleDataSourceConfig

java 复制代码
@Configuration
@MapperScan(basePackages = "com.example.dao.oracle", sqlSessionFactoryRef = "oracleSessionFactory")
public class OracleDataSourceConfig {
    @Bean("oracleDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.oracle") //读取application.yml中的配置参数映射成为一个对象
    public DataSource getOracleDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean("oracleSessionFactory")
    public SqlSessionFactory oracleSessionFactory(@Qualifier("oracleDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        // mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致)
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/oracle/*.xml")); // 持久化.xml文件的地址
        return bean.getObject();
    }

    @Bean("oracleSessionTemplate")
    public SqlSessionTemplate oracleSessionTemplate(@Qualifier("oracleSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

application.yml配置文件配置mysql/oracle数据源

yml 复制代码
spring:
  # 配置数据源
  datasource:
    #单一数据源配置
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://rhel:3306/note_boot
    username: root
    password: Redhat1

    #多数据源配置
    mysql:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://rhel:3306/note_boot
      username: root
      password: Redhat1
    oracle:
      driver-class-name: oracle.jdbc.OracleDriver
      jdbc-url: jdbc:oracle:thin:@//rhel:1521/orcl
      username: testdb
      password: oraclepass
      hikari:
        connection-timeout: 3000
        idle-timeout: 60000
        maximum-pool-size: 50
        minimum-idle: 5
        connection-test-query: select 1 from dual
        validation-timeout: 2000

编写Mapper接口

java 复制代码
//BookDao里面都是两个简单查询测试方法,注解实现...
//mysql数据库测试
public Book getById(Integer id);
//oracle数据库测试
public Book findById(Integer id);

编写Book实体类

java 复制代码
public class Book {
    private Integer id;
    private String name;
    private String type;
    private String description;
    //get/set方法省略...
}

编写测试类

java 复制代码
public class MybatisDemo {
    @Autowired
    private BookDao bookDao;
    @Autowired
    private BookDao1 bookDao1;
    @Autowired
    private BookDao2 bookDao2;

    @Test
    void test() {
        //原始配置,单一数据库查询
        Book book = bookDao.getById(1);
        System.out.println(book);
        //多数据源配置 mysql查询
        Book book1 = bookDao1.getById(1);
        System.out.println(book1);
        //多数据源配置 oracle查询
        Book book2 = bookDao2.findById(1);
        System.out.println(book2);
    }
}

效果图:

相关推荐
Python私教5 小时前
model中能定义字段声明不存储到数据库吗
数据库·oracle
弗拉唐7 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
mqiqe8 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
工业甲酰苯胺8 小时前
MySQL 主从复制之多线程复制
android·mysql·adb
BestandW1shEs8 小时前
谈谈Mysql的常见基础问题
数据库·mysql
重生之Java开发工程师8 小时前
MySQL中的CAST类型转换函数
数据库·sql·mysql
教练、我想打篮球8 小时前
66 mysql 的 表自增长锁
数据库·mysql
Ljw...8 小时前
表的操作(MySQL)
数据库·mysql·表的操作
2401_857610038 小时前
SpringBoot社团管理:安全与维护
spring boot·后端·安全