IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> springboot项目多数据源配置 -> 正文阅读

[Java知识库]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数据库查询用户的一些基础信息

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 11:40:47  更:2022-10-31 11:44:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 5:01:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码