Springboot项目的多数据源配置

news2024/11/24 17:42:35

spring boot项目配置多个数据源很常见!

话不多说,上代码。

首先先在system账号下创建了一个用户test1,并授予权限

create user test1 identified by 123456;
grant connect,resource to test1; 

接下来登录test1用户,创建一个表student

create table student
(
  id number primary key,
  name varchar2(30),
  address varchar2(100)
);

项目目录如下:

修改之前的配置文件

spring:
  datasource:
    driver-class-name: oracle.jdbc.driver.OracleDriver
    url: jdbc:oracle:thin:@localhost:1521:ORCL
    username: test
    password: 123456

调整后多个数据源后的配置

spring:
  datasource:
    main:
      driver-class-name: oracle.jdbc.driver.OracleDriver
      jdbc-url: jdbc:oracle:thin:@localhost:1521:ORCL
      username: test
      password: 123456
    ext:
      driver-class-name: oracle.jdbc.driver.OracleDriver
      jdbc-url: jdbc:oracle:thin:@localhost:1521:ORCL
      username: test1
      password: 123456

主数据源配置:

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 javax.sql.DataSource;

/**
 * 主数据源配置
 */
@Configuration
public class MainDataSource {

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

主数据源的mybatis配置

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.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;

/**
 * 主数据源的mybatis配置
 */
@Configuration
@MapperScan(basePackages = "com.example.demo.mapper", sqlSessionFactoryRef = "mainSqlSessionFactory", sqlSessionTemplateRef = "mainSqlSessionTemplate")
public class MainMybatisConfig {

    @Autowired
    private DataSource mainDataSources;

    @Bean(name = "mainSqlSessionFactory")
    @Primary
    public SqlSessionFactory mainSqlSessionFactory() throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(mainDataSources);
//        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
        return bean.getObject();
    }

    //配置声明式事务管理器
    @Bean(name = "mainTransactionManager")
    @Primary
    public PlatformTransactionManager mainTransactionManager() {
        return new DataSourceTransactionManager(mainDataSources);
    }

    @Bean(name = "mainSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate mainSqlSessionTemplate(
            @Qualifier("mainSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

副数据源配置:

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 javax.sql.DataSource;

/**
 * 副数据源配置
 */
@Configuration
public class ExtDataSource {

    @Bean(name = "extDataSources")
    @Qualifier(value = "extDataSources")
    @ConfigurationProperties(prefix = "spring.datasource.ext")
    public DataSource extDataSource() {
        return DataSourceBuilder.create().build();
    }
}

副数据源的mybatis配置:

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.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
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 org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;


/**
 * 副数据源的mybatis配置
 */
@Configuration
@MapperScan(basePackages = "com.example.demo.extMapper", sqlSessionFactoryRef = "extSqlSessionFactory", sqlSessionTemplateRef = "extSqlSessionTemplate")
public class ExtMybatisConfig {

    @Autowired
    @Qualifier(value = "extDataSources")
    private DataSource extDataSource;

    @Bean(name = "extSqlSessionFactory")
    public SqlSessionFactory extSqlSessionFactory() throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(extDataSource);
//        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:extMapper/*.xml"));
        return bean.getObject();
    }

    //配置声明式事务管理器
    @Bean(name = "extTransactionManager")
    public PlatformTransactionManager extTransactionManager() {
        return new DataSourceTransactionManager(extDataSource);
    }

    @Bean(name = "extSqlSessionTemplate")
    public SqlSessionTemplate extSqlSessionTemplate(
            @Qualifier("extSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

StudentMapper类

import com.example.demo.entity.Student;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;

@Mapper
public interface StudentMapper {

    List<Student> queryList();
}

StudentMapper.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.demo.extMapper.StudentMapper">
    <resultMap type="com.example.demo.entity.Student" id="Result">
        <result property="id" 			column="id"/>
        <result property="name" 		column="name"/>
        <result property="address"		column="address"/>
    </resultMap>
    <select id="queryList" resultMap="Result">
        select  id,name,address  from  student
    </select>
</mapper>

UserMapper文件

import com.example.demo.entity.User;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper {

    List<User> queryList();
}

UserMapper.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.demo.mapper.UserMapper">
    <resultMap type="com.example.demo.entity.User" id="userResult">
        <result property="id" 			column="id"/>
        <result property="name" 		column="name"/>
        <result property="age"		column="age"/>
    </resultMap>

    <select id="queryList" resultMap="userResult">
        select  id,name,age  from  "USER"
    </select>
</mapper>

controller类:

import com.example.demo.entity.Student;
import com.example.demo.entity.User;
import com.example.demo.extMapper.StudentMapper;
import com.example.demo.mapper.UserMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {

    private static final Logger logger = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private StudentMapper studentMapper;

    @PostMapping("/queryUserList")
    public List<User> queryUserList() {
        return userMapper.queryList();
    }

    @PostMapping("/queryStudentList")
    public List<Student> queryStudentList() {
        return studentMapper.queryList();
    }

}

此时查询结果:

副数据源:

    主数据源:

 若将副数据源的xml文件放到resources目录下

 此时 需要将副数据源的mybatis配置修改下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1183256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用表单登录方法模拟登录通信人家园,要求发送登录请求后打印出来的用户名下的用户组类别

目标网站&#xff1a;https://www.txrjy.com/forum.php 一、进入网页&#xff0c;右键“检查” 二、输入用户名和密码&#xff0c;点击“登录”&#xff0c;点击“Network”,上划加载项找到蓝色框中的内容 三、点击第一个加载项&#xff0c;找到URL 四、相关代码&#xff1a; …

数据结构-单链表-力扣题

移除链表元素 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;和前面学的单链表的中间删除数据一样&#xff0c;使要被删除节点的前一个节点指向下要被删除节点的下一个节点&#xff0c;然后把要被删除的节点free掉。 具体实现过程&#xff1a;先…

15 Linux 按键

一、Linux 按键驱动原理 其实案件驱动和 LED 驱动很相似&#xff0c;只不过区别在于&#xff0c;一个是读取GPIO高低电平&#xff0c;一个是从GPIO输出高低电平。 在驱动程序中使用一个整形变量来表示按键值&#xff0c;应用程序通过 read 函数来读取按键值&#xff0c;判断按键…

【Qt之绘制兔纸】

效果 代码 class drawRabbit: public QWidget { public:drawRabbit(QWidget *parent nullptr) : QWidget(parent) {}private:void paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);// 绘制兔子的耳朵painter.s…

【代码随想录】算法训练营 第十五天 第六章 二叉树 Part 2

102. 二叉树的层序遍历 层序遍历&#xff0c;就是一层一层地遍历二叉树&#xff0c;最常见的就是从上到下&#xff0c;从左到右来遍历&#xff0c;遍历的方法依然有两种&#xff0c;第一种是借助队列&#xff0c;第二种则是递归&#xff0c;都算是很简单、很容易理解的方法&am…

新登录接口独立版变现宝升级版知识付费小程序-多领域素材资源知识变现营销系统

源码简介&#xff1a; 资源入口 点击进入 源码亲测无bug&#xff0c;含前后端源码&#xff0c;非线传&#xff0c;修复最新登录接口 梦想贩卖机升级版&#xff0c;变现宝吸取了资源变现类产品的很多优点&#xff0c;摒弃了那些无关紧要的东西&#xff0c;使本产品在运营和变现…

VMware部署CentOS7

一、创建虚拟机 1、点击新建虚拟机 2、选择自定义 下一步 3、点击下一步 4、选择稍后安装操作系统 5、选择linux 下一步 6、选择要安装的centos 版本 这里选择centos7 7、自定义虚拟机名称 设置虚拟机运行空间 8、配置处理器&#xff0c;使用默认 1个处理器 1核 9、修改虚拟机…

用友U8 Cloud 反序列化RCE漏洞复现

0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP&#xff0c;主要聚焦成长型、创新型企业&#xff0c;提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友U8 Cloud存在多处&#xff08;FileManageServlet和LoginVideoServlet&#xff09;反序列化漏洞&#xff0c;系统未将…

Vue组件的存放目录问题

注意&#xff1a; .vue文件 本质无区别 1.组件分类 .vue文件分为2类&#xff0c;都是 .vue文件&#xff08;本质无区别&#xff09; 页面组件 &#xff08;配置路由规则时使用的组件&#xff09; 复用组件&#xff08;多个组件中都使用到的组件&#xff09; 2.存放目录 分…

bootstrap3简单玩法

Bootstrap v3 Bootstrap v3 是一个流行的前端框架&#xff0c;它提供了一系列的模板、组件和工具&#xff0c;可以帮助开发者快速地构建响应式的网站和应用程序。 以下是 Bootstrap v3 的一些常见应用&#xff1a; 响应式布局&#xff1a;Bootstrap v3 提供了一个易于使用的网…

Failed to connect to github.com port 443:connection timed out

解决办法&#xff1a; 步骤1&#xff1a; 在这里插入图片描述 步骤2&#xff1a; -步骤3 &#xff1a;在git终端中执行如下命令&#xff1a; git config --global http.proxy http:ip:port git config --global https.proxy http:ip:port git config --global http.proxy htt…

合肥工业大学数字逻辑实验三

** 数字逻辑 实验报告** ✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :hfut实验课设 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!…

ModuleNotFoundError: No module named ‘torchvision.models.utils‘

如图报错&#xff1a;No module named torchvision.models.utils解决方案&#xff1a;由于当前python环境高版本的torch&#xff0c; 代码用的是低版本的语法 将 from torchvision.models.utils import load_state_dict_from_url换成 from torch.hub import load_state_dict_fr…

合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(一)

基于ARM语音识别的智能家居系统 我们接下来带大家完成基于语音识别的智能家居系统嵌入式项目实战&#xff0c;使用到stm32开发板&#xff0c;讯飞的离线语音识别&#xff0c;我们在此之前&#xff0c;我们先学习一些Linux系统的基本操作。 。 一、Linux简介 在嵌入式开发中&am…

Python---upper()--转大写///与lower() --转小写

upper()&#xff1a;把字符串全部转换为 大写形式 lower()&#xff1a;把字符串全部转换为 小写形式 upper 英 /ˈʌpə(r)/ adj. 上面的&#xff0c;上层的&#xff0c;较高的&#xff1b;顶部的&#xff0c;上部的&#xff1b;&#xff08;在机构、体系等中&#xff…

YOLOv8-Pose推理详解及部署实现

目录 前言一、YOLOv8-Pose推理(Python)1. YOLOv8-Pose预测2. YOLOv8-Pose预处理3. YOLOv8-Pose后处理4. YOLOv8-Pose推理 二、YOLOv8-Pose推理(C)1. ONNX导出2. YOLOv8-Pose预处理3. YOLOv8-Pose后处理4. YOLOv8-Pose推理 三、YOLOv8-Pose部署1. 源码下载2. 环境配置2.1 配置CM…

【C++干货铺】初识模板

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 泛型编程 函数模板 函数模板格式 函数模板原理 函数模板实例化 模板参数的匹配原则 类模板 定义格式 类模板的实例化 泛型编程 什么是泛型&#xff1f; …

wsl和windows下编译C++以及函数重载和函数模板的问题记录

wslUbuntuvscodec 每次打开wsl&#xff0c;进入ubuntu中新建文件夹进行c编程的时候经常报错&#xff0c;显示配置文件有问题&#xff0c;但是每次按照vscode官方文件配置的话是没有问题的。百思不得其解。 今晚发现了问题所在。每次新建工作区的时候会自动生成.vscode文件夹&…

Keil Debug——error: #18: expected a “)“

目录 一、问题现象二、问题原因三、解决方案四、总结 一、问题现象 二、问题原因 这个错误是编译器在编译代码时发现的一种常见错误。导致这个报错的原因很多&#xff1a; 常见的自己一般可解决的&#xff1a; 它意味着在代码中某个位置缺少一个右括号 (“)”)&#xff0c;导致…

Unity 判断两个UI是否相交

今天碰到要判断两个UI是否相交的交互。 尝试了下&#xff0c;发现有两个方法都成功了。 1、使用Collider2D组件 分别创建两个Image组件&#xff0c;并且添加Collider2D组件&#xff0c;其中一个还要添加Rigidbody2D组件&#xff0c;如下图&#xff1a; 然后创建个判断脚本“…