springboot项目多数据源配置

简介:对于分布式架构项目,A服务想访问B服务中的数据,有2种方式,第1种是通过B服务提供的开放的restapi,第2种就是直接连B服务数据库,本文实现第2种方式。

方式一、自定义多数据源

application.properties

# sso数据库配置
spring.datasource.sso.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.sso.username=root
spring.datasource.sso.password=root
spring.datasource.sso.url=jdbc:mysql://127.0.0.1:3306/miqu_sso?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false

# server数据库配置
spring.datasource.server.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.server.username=root
spring.datasource.server.password=root
spring.datasource.server.url=jdbc:mysql://127.0.0.1:3306/miqu_server?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false

自定义数据源配置

通过application.properties不同的数据源参数,构建不同的DataSource数据源对象,再通过不同的数据源对象构建SqlSessionFactory工厂


package com.cong.miqu.sso.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;


/**
 * @Author zhangyc
 * @Date 2022/10/24 23:29
 * @PackageName:com.cong.miqu.sso.config
 * @ClassName: ServerDataSourceConfig
 * @Description: TODO
 * @Version 1.0
 */

@Configuration
@MapperScan(basePackages = "com.cong.miqu.sso.dao.mapper.server",sqlSessionFactoryRef = "serverSqlSessionFactory")
public class ServerDataSourceConfig {
    @Primary
    @Bean(name = "serverDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.server")
    public DataSource ssoDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "serverSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier(value = "serverDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:com/cong/miqu/sso/dao/mapper/server/*.xml"));
        return sessionFactoryBean.getObject();
    }
}


package com.cong.miqu.sso.config;

import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver;
import com.baomidou.mybatisplus.core.config.GlobalConfig;


import com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.type.EnumTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.aop.interceptor.PerformanceMonitorInterceptor;
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;
import java.util.ArrayList;
import java.util.List;


/**
 * ssodata源配置
 *
 * @Author zhangyc
 * @Date 2022/10/24 23:28
 * @PackageName:com.cong.miqu.sso.config
 * @ClassName: SSODataSourceConfig
 * @Description: TODO
 * @Version 1.0
 */

@Configuration
@MapperScan(basePackages = "com.cong.miqu.sso.dao.mapper.sso",sqlSessionFactoryRef = "ssoSqlSessionFactory")
public class SSODataSourceConfig {

    @Primary
    @Bean(name = "ssoDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.sso")
    public DataSource ssoDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "ssoSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier(value = "ssoDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setDefaultEnumTypeHandler(MybatisEnumTypeHandler.class);
        configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
        configuration.setJdbcTypeForNull(JdbcType.NULL);
        sqlSessionFactoryBean.setConfiguration(configuration);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:com/cong/miqu/sso/dao/mapper/sso/*.xml"));
        sqlSessionFactoryBean.setGlobalConfig(new GlobalConfig().setBanner(false));
        return sqlSessionFactoryBean.getObject();
    }
}

目录结构

 方式二、引入dynamic-datasource-spring-boot-starter(推荐)

mybatis-plus官网推荐的扩展
  1. 本框架只做 切换数据源 这件核心的事情,并不限制你的具体操作,切换了数据源可以做任何CRUD。
  2. 配置文件所有以下划线 _ 分割的数据源 首部 即为组的名称,相同组名称的数据源会放在一个组下。
  3. 切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。
  4. 默认的数据源名称为 master ,你可以通过 spring.datasource.dynamic.primary 修改。
  5. 方法上的注解优先于类上注解。
  6. DS支持继承抽象类上的DS,暂不支持继承接口上的DS

多数据源 | MyBatis-Plus

引入依赖,注意版本要与mybatis-plus版本保持一致

         <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
        </dependency>

application.properties

# sso数据库配置
spring.datasource.dynamic.primary=sso
spring.datasource.dynamic.strict=false
spring.datasource.dynamic.datasource.sso.url=jdbc:mysql://127.0.0.1:3306/miqu_sso?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false
spring.datasource.dynamic.datasource.sso.username=root
spring.datasource.dynamic.datasource.sso.password=root
spring.datasource.dynamic.datasource.sso.driverClassName=com.mysql.jdbc.Driver

# server数据库配置
spring.datasource.dynamic.datasource.server.driverClassName=com.mysql.jdbc.Driver
spring.datasource.dynamic.datasource.server.username=root
spring.datasource.dynamic.datasource.server.url=jdbc:mysql://127.0.0.1:3306/miqu_server?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false
spring.datasource.dynamic.datasource.server.password=root

@DS注解使用

package com.cong.miqu.server.service;

import cn.hutool.core.util.StrUtil;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cong.miqu.server.dao.mapper.UserInfoMapper;
import com.cong.miqu.server.dao.pojo.UserInfo;
import org.springframework.stereotype.Service;

import java.util.Set;

/**
 * 用户信息服务
 *
 * @author zhangyc
 * @date 2022/10/24
 */
@Service
@DS(value = "sso")
public class UserInfoService extends ServiceImpl<UserInfoMapper, UserInfo> {


    public IPage<UserInfo> page(int page, int pageSize, String keyword, Set<Long> friendsUserIds) {
        IPage<UserInfo> iPage = new Page<>(page, pageSize);
        LambdaQueryWrapper<UserInfo> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(UserInfo::getUserId, friendsUserIds).like(StrUtil.isNotEmpty(keyword), UserInfo::getNickName, keyword);
        iPage = this.page(iPage, wrapper);
        return iPage;
    }
}

测试验证

说明:查询好友列表是B服务模块中的功能,用户注册以及完善身份信息是在A服务中完成的,好友列表需要到A数据库查询用户的一些基础信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值