多数据源配置-springBoot

前言

这里展示的是springBoot项目双数据源的配置,为了增加一定的代表性,这里采用两个不同的数据库Orcale和Mysql作为数据源。

依赖

<!-- orcale驱动包 -->
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <scope>runtime</scope>
</dependency>
<!-- JDBC:mysql驱动包 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.29</version>
    <scope>runtime</scope>
</dependency>
 <!--德鲁伊,数据库连接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.12</version>
</dependency>
<!-- Mybatis_plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatis.plus.version}</version>
    <exclusions>
        <exclusion>
            <artifactId>jsqlparser</artifactId>
            <groupId>com.github.jsqlparser</groupId>
        </exclusion>
        <exclusion>
            <artifactId>slf4j-api</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
</dependency>

目录结构

在这里插入图片描述

操作实体类

person
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Setter
@Getter
@ToString
public class Person {
    private Integer id;
    private String name;
    private Integer age;
    private String parentName;
    public Person() {
    }
    public Person(String name, Integer age, String parentName) {
        this.name = name;
        this.age = age;
        this.parentName = parentName;
    }
}

数据源配置

application.properties

# 配置orcale的相关连接信息
orcale.dataSource.type= oracle.jdbc.datasource.impl.OracleConnectionPoolDataSource
orcale.dataSource.url = jdbc:oracle:thin:@localhost:1521:orcl?Unicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false
orcale.dataSource.driverClassName = oracle.jdbc.driver.OracleDriver
orcale.dataSource.username = testrole
orcale.dataSource.password = 123456
orcale.dataSource.druid.max-active = 20
orcale.dataSource.druid.initial-size = 20
orcale.dataSource.druid.max-wait = 3000
orcale.dataSource.druid.minIdle = 10
orcale.dataSource.druid.time-between-eviction-runsMillis = 60000
orcale.dataSource.druid.min-evictable-idle-timeMillis = 300000
orcale.dataSource.druid.validation-query = SELECT 1
orcale.dataSource.druid.test-while-idle = true
orcale.dataSource.druid.test-on-borrow = false
orcale.dataSource.druid.test-on-return = false
orcale.dataSource.druid.pool-prepared-statements = false
orcale.dataSource.druid.max-open-prepared-statements = -1
# 配置mysql中的的相关配置
mysql.dataSource.type =com.mysql.cj.jdbc.MysqlDataSource
mysql.dataSource.url = jdbc:mysql://localhost:3306/xmltest?useUnicode=true&characterEncoding=UTF-8&useSSL=false
mysql.dataSource.driverClassName = com.mysql.cj.jdbc.Driver
mysql.dataSource.username = root
mysql.dataSource.password = shijian
mysql.dataSource.druid.max-active = 40
mysql.dataSource.druid.initial-size = 40
mysql.dataSource.druid.max-wait = 3000
mysql.dataSource.druid.minIdle = 20
mysql.dataSource.druid.time-between-eviction-runsMillis = 60000
mysql.dataSource.druid.min-evictable-idle-timeMillis = 300000
mysql.dataSource.druid.validation-query = SELECT 1
mysql.dataSource.druid.test-while-idle = true
mysql.dataSource.druid.test-on-borrow = false
mysql.dataSource.druid.test-on-return = false
mysql.dataSource.druid.pool-prepared-statements = false
mysql.dataSource.druid.max-open-prepared-statements = -1

映射文件

Mysql

mysqlPersonMapper.xml

<?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.example.summary.dao.MysqlPersonMapper">
    <select id="getAll" resultType="com.example.summary.util.Person">
        SELECT * FROM person
    </select>
</mapper>
Orcale

orcalePersonMapper.xml

<?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.example.summary.dao.OrcalePersonMapper">
    <select id="getAll" resultType="com.example.summary.util.Person">
        SELECT * FROM person
    </select>
</mapper>

mapper

import com.example.summary.util.Person;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface MysqlPersonMapper {
    List<Person> getAll();
}
import com.example.summary.util.Person;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface OrcalePersonMapper {
    List<Person> getAll();
}


mapper不能放在一个包内不然就只会让主数据源识别到,其它源无法识别

配置注入

Mysql
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
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.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
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 org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.example.summary.mysql",sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MysqlDataSourceConfig {
    // 读取配置文件中的 spring.datasource配置
    // 配置多数据源时要默认一个数据源,所以要加 @Primary
    @ConfigurationProperties(prefix = "mysql.datasource")
    @Bean(name = "mysqlDataSource")
    @Primary
    public DataSource dataSource() {
        return new DruidDataSource();
    }
    @Bean(name = "mysqlTransactionManager")
    @Primary
    public DataSourceTransactionManager mysqlTransactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }
    @Bean(name = "mysqlSqlSessionFactory")
    @Primary
    public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource mysqlDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(mysqlDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/mysql/*.xml"));   // 对应的mapper.xml
        //mybatis 数据库字段与实体类属性驼峰映射配置
        sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        return sessionFactory.getObject();
    }
    @Bean(name = "mysqlJdbcTemplate")
    @Primary
    public JdbcTemplate mysqlJdbcTemplate() {
        return new JdbcTemplate(dataSource());
    }
}
Orcale
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.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.example.summary.orcale",sqlSessionFactoryRef = "orcaleSqlSessionFactory")
public class OrcaleDataSourceConfig {
    @ConfigurationProperties(prefix = "orcale.datasource")
    @Bean(name = "orcaleDataSource")
    public DataSource dataSource() {
        return new DruidDataSource();
    }
    @Bean(name = "orcaleTransactionManager")
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }
    @Bean(name = "orcaleSqlSessionFactory")
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("orcaleDataSource") DataSource masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/orcale/*.xml"));   // 对应的mapper.xml
        //mybatis 数据库字段与实体类属性驼峰映射配置
        sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        return sessionFactory.getObject();
    }
    @Bean(name = "orcaleJdbcTemplate")
    public JdbcTemplate orcaleJdbcTemplate() {
        return new JdbcTemplate(dataSource());
    }
}


@Primary注解代表该数据源为主数据源
@MapperScan的basePackages值代表的是包扫描位置,及该包下的所有mapper都会被扫描且绑定在数据源上

测试

元数据

Mysql
在这里插入图片描述
Orcale
在这里插入图片描述

测试代码
import com.example.summary.mysql.MysqlPersonMapper;
import com.example.summary.orcale.OrcalePersonMapper;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
@MapperScan(value = "com.example.summary.dao")
public class test {
    @Autowired
    MysqlPersonMapper mysqlPersonMapper;
    @Autowired
    OrcalePersonMapper orcalePersonMapper;
    @Test
    public void listAll(){
        System.out.println("MySQL数据库--------------");
        System.out.println(mysqlPersonMapper.getAll());
        System.out.println("Orcale数据库-------------");
        System.out.println(orcalePersonMapper.getAll());
    }
}
运行结果

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中配置MyBatis多数据源可以通过以下步骤进行: 1. 添加相关依赖:导入MyBatis和数据库驱动的依赖,例如MySQL或者其他数据库的驱动。 2. 配置数据源:在`application.properties`或`application.yml`中配置多个数据源的连接信息,例如: ```yaml spring: datasource: primary: url: jdbc:mysql://localhost:3306/primary_db username: primary_user password: primary_password secondary: url: jdbc:mysql://localhost:3306/secondary_db username: secondary_user password: secondary_password ``` 这里配置了两个数据源,一个是主数据源(primary),另一个是次要数据源(secondary)。 3. 配置数据源 Bean:创建多个数据源的`DataSource`对象,并将其注册为Spring Bean。可以使用`@Configuration`注解的类来完成这个配置,例如: ```java @Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } } ``` 这里通过`@ConfigurationProperties`注解将数据源的配置信息绑定到对应的`DataSource`对象。 4. 配置MyBatis SqlSessionFactory:创建多个SqlSessionFactory对象,分别关联不同的数据源。可以使用`@MapperScan`注解扫描MyBatis的Mapper接口,并指定对应的SqlSessionFactory对象,例如: ```java @Configuration @MapperScan(basePackages = "com.example.primary", sqlSessionFactoryRef = "primarySqlSessionFactory") public class MyBatisConfigPrimary { @Bean public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource primaryDataSource) throws Exception { SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); sessionFactoryBean.setDataSource(primaryDataSource); return sessionFactoryBean.getObject(); } } @Configuration @MapperScan(basePackages = "com.example.secondary", sqlSessionFactoryRef = "secondarySqlSessionFactory") public class MyBatisConfigSecondary { @Bean public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) throws Exception { SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); sessionFactoryBean.setDataSource(secondaryDataSource); return sessionFactoryBean.getObject(); } } ``` 这里通过`@MapperScan`注解指定了不同包下的Mapper接口,并关联了对应的SqlSessionFactory对象。 5. 配置事务管理器(可选):如果需要使用事务管理,可以配置多个事务管理器,并指定对应的数据源。例如: ```java @Configuration @EnableTransactionManagement public class TransactionConfig { @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Autowired @Qualifier("secondaryDataSource") private DataSource secondaryDataSource; @Bean public DataSourceTransactionManager primaryTransactionManager() { return new DataSourceTransactionManager(primaryDataSource); } @Bean public DataSourceTransactionManager secondaryTransactionManager() { return new DataSourceTransactionManager(secondaryDataSource); } } ``` 这里通过`@EnableTransactionManagement`启用事务管理,同时配置了对应的数据源的事务管理器。 通过以上配置,即可实现MyBatis多数据源配置。注意,在编写Mapper接口时,需要通过`@Qualifier`注解指定使用哪个数据源。例如: ```java @Qualifier("primarySqlSessionFactory") @Repository public interface PrimaryMapper { // ... } @Qualifier("secondarySqlSessionFactory") @Repository public interface SecondaryMapper { // ... } ``` 这样就可以在不同的Mapper接口中使用不同的数据源了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值