基于Druid的多数据源配置(最简单的方式)

一、先修改配置文件

spring: 
	datasource:
	    name: druidDataSource
	    type: com.alibaba.druid.pool.DruidDataSource
	    driver-class-name: com.mysql.cj.jdbc.Driver
	    druid:
	      #数据库1
	      db1:
	        url: jdbc:mysql://localhost:3306/mysql?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true
	        username: root
	        password: root
	      #数据源2
	      db2:
	        # 数据源2开关、默认关闭
	        enable: false
	        url: jdbc:mysql://localhost:3306/nacos_config?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true
	        username: root
	        password: root

二、添加配置类(根据生效位置配置)

1. DB1Config.java(数据源1)

import com.alibaba.druid.pool.DruidDataSource;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
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.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * @Author liull
 * @DATE 2022/6/21 13:22
 **/
@Slf4j
@Configuration
@MapperScan(value = {"xxx.xxx.xxx.db1.dao"}, sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class DB1Config {
    @Value("${spring.datasource.druid.db1.url}")
    private String url;
    @Value("${spring.datasource.druid.db1.username}")
    private String username;
    @Value("${spring.datasource.druid.db1.password}")
    private String password;
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;

    @Bean("db1DataSource")
    @Primary
    public DruidDataSource dataSource() {
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(this.url);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
        log.info("db1 init");
        return datasource;
    }

    @Bean("db1SqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*Mapper.xml"));
        return sessionFactory.getObject();
    }

    @Bean("db1TransactionManager")
    @Primary
    public DataSourceTransactionManager transactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean("db1SqlSessionTemplate")
    @Primary
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

2. DB2Config.java(数据源2)

import com.alibaba.druid.pool.DruidDataSource;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
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;

/**
 * @Author liull
 * @DATE 2022/6/21 13:32
 **/
@Slf4j
@Configuration
// 修改包扫描路径
@MapperScan(value = "xxx.xxx.xxx.db2.dao", sqlSessionTemplateRef = "db2SqlSessionTemplate")
public class DB2Config {
    @Value("${spring.datasource.druid.db2.url}")
    private String url;
    @Value("${spring.datasource.druid.db2.username}")
    private String username;
    @Value("${spring.datasource.druid.db2.password}")
    private String password;
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;

    @Bean("db2DataSource")
    @Qualifier("db2DataSource")
    public DruidDataSource dataSource() {
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(this.url);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
        log.info("db2 init");
        return datasource;
    }

    @Bean("db2SqlSessionFactory")
    @Qualifier("db2DataSource")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db2/*Mapper.xml"));
        return sessionFactory.getObject();
    }

    @Bean("db2TransactionManager")
    @Qualifier("db2DataSource")
    public DataSourceTransactionManager transactionManager(@Qualifier("db2DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean("db2SqlSessionTemplate")
    @Qualifier("db2DataSource")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

三、注意事项

1. 注意包扫描路径,建议两种数据源持久层分包写(dao.dao1,dao.dao2)

2. 注意两个配置文件:

Ⅰ)定义不同的sqlSessionTemplateRef

Ⅱ)注意默认的数据源@Primary

3. 注意静态文件路径,建议两种数据源分包写(mapper.db1,mapper.db2)

四、特别提示

  1. 多数据源配置几乎相同,只是换了不同的名字,由连接一个数据库变为连接两个数据库,在配置类中设置对应的包扫描路径和静态文件路径。
  2. 某些技术贴分享需要先修改启动类上面的注解,比如多数据源配置起数据库名(如下图),需要将@SpringBootApplication()修改为@SpringBootApplication(exclude={DataSourceAutoConfiguration.calss}),并且去掉@MapperScan(),为了让系统关闭自动扫描,这个视情节而定,不修改目前没有遇到问题。
    在这里插入图片描述

如果大家遇到类似问题,欢迎评论区讨论,如有错误之处,敬请留言。

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
MyBatis是一个开源的持久层框架,可以与多种数据源进行集成。Durid是一个Java数据库连接池框架,支持多数据源操作。 在MyBatis配置Durid多数据源的步骤如下: 1. 在pom.xml文件中引入MyBatis和Durid的依赖包。可以使用Maven进行管理,添加如下依赖: ```xml <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.x.x</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>x.x.x</version> </dependency> ``` 2. 在Spring配置文件中配置Durid数据源。可以通过配置一个DruidDataSource的Bean来完成,设置数据源的相关属性,例如: ```xml <!-- 配置第一个数据源 --> <bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/db1" /> <property name="username" value="username1" /> <property name="password" value="password1" /> </bean> <!-- 配置第二个数据源 --> <bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/db2" /> <property name="username" value="username2" /> <property name="password" value="password2" /> </bean> ``` 3. 在MyBatis的Mapper配置文件中配置多个数据源的Mapper。可以通过使用不同的命名空间来区分不同的Mapper,例如: ```xml <!-- 第一个数据源的Mapper --> <mapper namespace="com.example.mapper1"> <!-- 配置操作第一个数据源的SQL语句 --> </mapper> <!-- 第二个数据源的Mapper --> <mapper namespace="com.example.mapper2"> <!-- 配置操作第二个数据源的SQL语句 --> </mapper> ``` 4. 在Java代码中使用指定的数据源。可以通过在Mapper接口上使用@Mapper注解来指定数据源,例如: ```java @Mapper public interface Mapper1 { // 定义操作第一个数据源的方法 } @Mapper public interface Mapper2 { // 定义操作第二个数据源的方法 } ``` 通过以上步骤,就可以在MyBatis配置并使用Durid的多数据源了。可以根据具体的需求配置并操作不同的数据源,实现数据的读写分离或其他数据处理需要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘刘刘刘刘先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值