SpringBoot项目多数据源配置(亲测有效)

SpringBoot2集成Druid配置多数据数据源及SQL监控 记录一下近期练习搭建项目Spingboot集成druid配置多数据源过程,本人也是小白,我会尽量描述的详细,希望能帮助到你,也为自己之后温习做下准备。 1.开发环境 IntelliJ IDEA 2018.3.6 x64 jdk1.8 mysql 5.7 2.项目目录结构 3.导入jar包 <dependency> <groupId&gt... 阅读详情

1、开发环境准备

开发工具:IDEA
开发工具:Maven+JDK8
所用技术:SpringBoot+Mybatis
数据库:MySQL
SpringBoot版本:2.1.0

2、创建SpringBoot项目,项目结构如下
在这里插入图片描述
3、数据库信息

创建两个数据库和 user 表、money表。
我们一共创建的两个数据库 test1 和 test2,然后分别在这两个数据库中创建了 user 用户表、money工资详情表(字段随便设置)。

4、pom文件依赖

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

5、配置application.yml

注意事项:
	在1.0 配置数据源的过程中主要是写成:spring.datasource.url 和spring.datasource.driverClassName。
而在2.0升级之后需要变更成:spring.datasource.jdbc-url和spring.datasource.driver-class-name!不然在连接数据库时可能会报下面的错误:另外在在2.0.2+版本后需要在datasource后面加上hikari,如果你没有加的话,同样可能会报错。

Error querying database. Cause: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.

Spring:
  datasource:
    hikari:
      db1:
        jdbc-url: jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: root
      db2:
        jdbc-url: jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: root
      driver-class-name: com.mysql.cj.jdbc.Driver

6、实现

①:创建实体类bean
②:数据源配置

package com.test.demo.config;

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.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.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.test.demo.db1.dao", sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class DataSource1Config {

    /**
     * 生成数据源.  @Primary 注解声明为默认数据源
     */
    @Bean(name = "db1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.hikari.db1")
    @Primary
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     * 创建 SqlSessionFactory
     */
    @Bean(name = "db1SqlSessionFactory")
    @Primary
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //  bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/db1/*.xml"));
        return bean.getObject();
    }

    /**
     * 配置事务管理
     */
    @Bean(name = "db1TransactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "db1SqlSessionTemplate")
    @Primary
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
package com.test.demo.config;

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.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.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.test.demo.db2.dao", sqlSessionTemplateRef = "db2SqlSessionTemplate")
public class DataSource2Config {

    @Bean(name = "db2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.hikari.db2")
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

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

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

    @Bean(name = "db2SqlSessionTemplate")
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

关于上面的配置类这里主要提一下下面这几点:
1、@MapperScan 注解中我们声明了使用数据库1的dao类所在的位置,还声明了 SqlSessionTemplate 。SqlSessionTemplate是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常。SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用。
2、由于使用的是全注解的方式开发,所以下面这条找并且解析 mapper.xml 配置语句被注释掉了
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(“classpath:mybatis/mapper/db2/*.xml”));
3、比如我们要声明使用数据1,直接在 dao 层的类上加上这样一个注释即可:@Qualifier(“db1SqlSessionTemplate”)
4、我们在数据库1配置类的每个方法前加上了 @Primary 注解来声明这个数据库时默认数据库,不然可能会报错。

③dao层和service层

package com.test.demo.db1.dao;

import com.test.demo.bean.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.beans.factory.annotation.Qualifier;

@Mapper
@Qualifier("db1SqlSessionTemplate")
public interface UserDao {
    /**
     * 通过名字查询用户信息
     */
    @Select("SELECT * FROM user WHERE name = #{name}")
    User findUserByName(String name);
}
package com.test.demo.db1.service.impl;

import com.test.demo.bean.User;
import com.test.demo.db1.dao.UserDao;
import com.test.demo.db1.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public User selectUserByName(String name) {
        return userDao.findUserByName(name);
    }
}
package com.test.demo.db2.dao;

import com.test.demo.bean.Money;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.beans.factory.annotation.Qualifier;

@Mapper
@Qualifier("db2SqlSessionTemplate")
public interface MoneyDao {
    /**
     * 通过id 查看工资详情
     */
    @Select("SELECT * FROM money WHERE id = #{id}")
    Money findMoneyById(@Param("id") int id);
}
package com.test.demo.db2.service.impl;

import com.test.demo.bean.Money;
import com.test.demo.db2.dao.MoneyDao;
import com.test.demo.db2.service.MoneyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MoneyServiceImpl implements MoneyService {
    @Autowired
    private MoneyDao moneyDao;

    @Override
    public Money selectMoneyById(int id) {
        return moneyDao.findMoneyById(id);
    }
}

④controller层实现

package com.test.demo.controller;

import com.test.demo.bean.User;
import com.test.demo.db1.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired(required = false)
    private UserService userService;

    @RequestMapping("/query")
    public User testQuery() {
        return userService.selectUserByName("Daisy");
    }
}
package com.test.demo.controller;

import com.test.demo.bean.Money;
import com.test.demo.db2.service.MoneyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/money")
public class MoneyController {
    @Autowired(required = false)
    private MoneyService moneyService;

    @RequestMapping("/query")
    public Money testQuery() {
        return moneyService.selectMoneyById(1);
    }
}

7、之后访问接口就可以了。

在这里边有个问题,我的是在其他 module 中调用 基础 module 类,在Base里边,要用application.yml,而在Ping中,则需要使用application.properties,如果后缀不同的话会报以下错误:

There was an unexpected error (type=Internal Server Error, status=500)
nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required. ### The error may exist in com/test/demo/db2/dao/MoneyDao.java (best guess) ### The error may involve com.test.demo.db2.dao.MoneyDao.findMoneyById ### The error occurred while executing a query ### Cause: java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required.

参考:http://bbs.itheima.com/thread-452900-1-1.html

springboot之多数据源配置 应用直接操作的是abstractRoutingDataSource的实现类,告诉AbstractRoutingDataSource访问哪个数据库,然后由AbstractRoutingDataSource从事先配置好的数据源 (ds1,ds2)选择哪一个 ,来访问对应的数据库。 阅读详情

相关推荐

SpringBoot整合Jpa实现多数据源

SpringBoot整合Jpa实现多数据源 前言: 最近工作中需要用到两个数据源,刚好是SpringBoot项目整合的JPA,之前有写过SpringBoo Mybatis Druid配置多数据源 的文章,不过这次是 SpringBoot JPA Hikari 配置多数据源。好了,废话不多说,直接进入正题。 首先,我这里的SpringBoot版本是<version>2.3.1.RELEASE</version>,这个很重要,如果你的版本是低于2.1.x的,可能会有些依赖不一样,导致程序

橙子君的博客 4919

Spring Boot 配置双数据源

添加依赖添加 Spring Boot 和数据库驱动的依赖配置数据源在 application.properties 或 application.yml 中分别配置两个数据源的连接信息创建数据源配置类创建两个数据源的配置类,分别配置数据源相关信息配置数据源事务管理器创建两个数据源的事务管理器,并指定数据源配置 JPA 实体管理器工厂创建两个 JPA 实体管理器工厂,并指定数据源和配置信息配置事务注解支持启用事务注解支持,并指定事务管理器在 DAO 层使用数据源。

专注Java(全栈)应用开发,求知若渴,虚心若愚,talk is cheap, show me the code. 3341

springboot多数据源配置(sqlserver,mysql)

springboot配置多数据源,mysql,sqlserver;真实可用;

Springboot配置双数据源

双数据源配置

Tony666688888的博客 1502

SpringBoot配置多数据源实现动态切换数据源

通过简单的demo实现SpingBoot多数据源配置并动态切换多数据源

STM32F103C8T6全桥逆变电路PWM波生成(基于HAL库)

全桥逆变电路需要两组开关管相互协同工作,故需要两路PWM控制信号,为了防止电源短路,需要保证同一桥臂的上下两个开关管不会同时导通,故两路PWM在相位上需要相差180°;为了保证高频变压器不会磁饱和,使正负半周PWM占空比相同。但是传统的互补输出达不到调节占空比调节输出电压的效果。......

weixin_45042735的博客 6025

SpringBoot多数据源配置

文章目录1 SpringBoot分库配置1.1 准备数据1.2 springboot+mybatis使用分包方式整合1.2.1 pom.xml1.2.2 application.yml 配置文件1.2.3 连接数据源配置文件1.2.3.1 连接源配置一1.2.3.2 连接源配置二1.2.4 项目结构1.3 springboot+druid+mybatisplus使用注解整合1.3.1 pom.xml1.3.2 application.yml 配置文件1.3.3 使用@DS区分数据源1.4 读写分离库1.4.

上善若泪 3万+

什么是论文的创新点?公式化描述算是创新点吗?

写科研论文时,挑战之一就是如何让你的工作“脱颖而出”,也就是要有创新性。不管实验多么精确、推导多么复杂,若没有真正的创新,论文很可能会被拒。关于如何创新问题上,我最近在看刘雪峰老师的《科技论文写作指南》,看到了很多关于写作的新论述,在这里和大家进行分享。

加百力 的技术博客 1926

【实战】SpringBoot整合多数据源

项目多数据源业务场景在开发中时常会出现,本文通过实战的方式,介绍SpringBoot结合Mybatis和Mybatis-plus实现多数据源整合应用。

1万+

数学建模更新10(蒙特卡罗模拟)

蒙特卡罗模拟一.目录二.引例1:布丰投针实验1.投针步骤2.思路3. 历史实验者二.蒙特卡罗模拟概述1.定义2.提出3.原理4.讨论三.应用实例1.三门问题【1】问题【2】代码2.模拟排队问题【1】题目【2】引入参数【3】总结题目信息【4】过程可视化【5】一些推导公式【6】代码3.有约束的非线性规划问题【1】问题的分类【2】例子【3】推导过程【4】代码 一.目录 二.引例1:布丰投针实验 1.投针步骤 步骤: 1:取一张白纸,在上面画出许多条间距为a的平行线 2:去一根长度为l的针,随机的向纸张上投掷n次

沉晨尘宸的博客 3043

Python结合海康威视工业相机SDK实现高效图像采集与处理

本文详细介绍了如何使用Python结合海康威视工业相机SDK实现高效的图像采集与处理。内容涵盖从环境搭建、SDK核心模块理解,到完整的图像采集流程拆解,包括设备枚举、参数设置、主动取流以及关键的像素格式转换。同时,文章深入探讨了触发模式、参数控制等高级应用,并提供了性能优化建议和可复用的相机操作类封装,帮助开发者快速构建稳定的机器视觉应用。

weixin_29043895的博客 349

【springboot专题】二十 springboot中如何配置多数据源

使用springboot+mybatis-plus+多数据源+swagger实现多数据源,以及如何解决多数据源事务一致性。

程序猿学社的博客 1万+

【毕业设计之python系列】基于Flask的在线音乐网设计与实现

本论文旨在通过使用Python的Web框架Flask,设计和实现一个具有完整功能的在线音乐网站。该网站包括用户注册、登录、注销、歌曲上传、编辑、删除、歌单创建、编辑、删除、评论、搜索、音乐播放等功能,并针对不同用户角色(如普通用户、管理员)实现了不同的权限管理。同时,本论文还介绍了如何使用第三方API(如网易云音乐API)获取歌曲信息等技术实现。在设计上,本论文采用了MVC(Model-View-Controller)架构模式,将后端数据处理与前端展示分离,以便于代码的管理和维护。在数据库设计方面,本论文设

m0_56073435的博客 3245

springboot配置多数据源,不同业务读取不同的数据源,亲测有效

先看一下目录结构。 网上配置的多数据源有很多,但一定要配置适合自己的,中间很多坑,后边会一一标出来。 目的就是项目中不同的业务去读取不同的数据库,目录结构配置如上。 直接上代码 配置springboot的配置文件,配置好的配置文件 配置两个data类 DataSource1 类 package com.honghe.operations.datasource; import org.apache.ibatis.session.SqlSessionFactory; import or..

weixin_43952697的博客 3122

国密SSL通信的调试技巧

前面写了几篇国密开发相关的文章:解读国密非对称加密算法SM2啥?双证书?详解国密SM2的加密和解密详解国密SSL ECC_SM4_SM3套件详解国密SM2的数字签名这篇文章来聊一聊国密S...

云水木石 3206

Linux ARM平台开发系列讲解(摄像头V4L2子系统) 2.12.7 摄像头V4L2驱动开发流程总结

1.概述前几章对摄像头V4L2驱动开发各个环节做了展开分析,这一章节就做一个汇总,用来回顾前几章得知识点,概括一下摄像头开发得流程,本次使用RK3399。2.SensorSub-device开发移植Sensor驱动位于目录下,注意到本章节所描述的是具有属性的sensor驱动,故目录下的驱动并不适用。在结构下,Sensor一般作为sub-device并通过pad与cif、isp或者mipiphy链接在一起。本章主要介绍Sensor驱动的代码[1],dts配置,及如何验证sensor5个部分。...

DSMGUOGUO的博客 3731

SpringBoot实现多数据源配置

SpringBoot实现多数据源配置

一恍过去 3万+

【麒麟系统】Rsync文件复制与同步工具

本文摘要: Rsync是一款Linux/Unix系统标配的高效文件同步工具,支持增量传输、SSH加密、断点续传等核心功能,相比SCP具有显著优势。文章详细解析了Rsync的五种标准语法格式和常用参数组合,重点介绍了本地同步、远程SSH同步(推送/拉取)的实操方法,并提供了密钥免密登录配置方案。针对企业运维场景,还讲解了文件过滤、镜像同步(--delete)、迁移同步(--remove-source-files)、空运行预校验(--dry-run)等高级功能,以及带宽限速等优化技巧,帮助用户安全高效地完成各类

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 999

Spring Boot配置多数据源教程亲测有效

1.配置文件配置多数据源(本人spring boot版本2.0以上) 2.java配置多个数据源java配置自动化 His数据源配置 package com.example.storagefunction.conf; import org.apache.ibatis.session.SqlSessionFactory; import org.myba...

qq_37608766的博客 1082

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SpringBoot整合MybatisPlus配置多数据源

前言 去年的时候公司的一个项目需要配置多数据源,当时使用的是springMVC框架,网上找了一些资料,花费了一些时间也整合了;今年公司使用了新的框架,现在的项目基本都是基于SpringBoot开发。以下来记录下自己使用SpringBoot整合MybatisPlus和配置多数据源。 整合步骤目录  1. 新建SpringBoot项目。  2. 导入依赖 --> devtools,...

liangshitian的博客 3万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【SpringBoot】mybaitsPlus的多数据源配置

mybatis_plus库的product表移动到mybatis_plus_1库,这样每个库一张表,通过一个测试用例 分别获取用户数据与商品数据,如果获取到说明多库模拟成功。我们创建两个库,分别为: mybatis_plus(以前的库不动)与mybatis_plus_1 (新建),将。2、如果我们实现读写分离,将写操作方法加上主库数据源,读操作方法加上从库数据源,自动切换,是不是就能实现读写分离?目前我们就来模拟一个纯粹多库的一个场景,其他场景类似。当为true时,就严格@DS中的数据源,没有就报错。

m0_62645012的博客 1953

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SpringBoot项目多数据源配置

项目中需要,下面演示多数据源配置,包括jdbcTemplate和jpa配置。 step1: 配置数据库: import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.spr...

程序员青戈 8268

SpringBoot项目配置多数据源的两种方式

spring:druid:db1:db2:该类的作用就是初始化数据源DataSource实例,以及初始化SqlSessionFactory实例。这里需要注意的是必须使用来获取会话工厂SqlSessionFactory,不然的话,baseMapper中的生成动态SQL的方法就不能使用了。//mapper模式下的接口层/*** 配置数据源* @return*/@Primary/*** 配置数据源* @return*/@Bean。

weixin_50003028的博客 7133
上一篇: 关于IDEA中右边窗口Maven找不到的解决方法
下一篇: ActiveMQ 安装及启动(Windows)
GK_hello
博客等级 码龄8年 6粉丝 18原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值