7.springboot中整合Jpa多数据源

news2024/12/24 22:16:39

Springboot 整合spring data jpa多数据源

在使用Mybatis时会涉及多数据源的问题,同样,当我们使用Jpa作为持久化处理方式时,也会涉及多数据源的问题,本节我们来讲解一下Springboot如何整合Spring data Jpa多数据源。

1.创建项目

添加lomboc,web,spring data jpa, mysql依赖

在这里插入图片描述

在这里插入图片描述

默认Mysql驱动时8,如果本机安装的Mysql是5,需要手动修改版本 ,修改后的依赖信息如下:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.45</version> <!-- 手动添加版本号-->
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

添加 Druid连接池依赖

 <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>

创建好的项目结构如下:

在这里插入图片描述

2.准备两个数据库

boot1和boot2

在这里插入图片描述

在这里插入图片描述

3.配置数据源

application.properties中配置两个数据源


# 数据库的基本配置
spring.datasource.one.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.one.username=root
spring.datasource.one.password=root
#注意多数据源要用jdbc-url
spring.datasource.one.jdbc-url=jdbc:mysql://localhost:3306/boot1? characterEncoding=utf8&serverTimezone=GMT%2B8   
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.two.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.two.username=root
spring.datasource.two.password=root
spring.datasource.two.jdbc-url=jdbc:mysql://localhost:3306/boot2?characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource

# JPA配置
spring.jpa.properties.database=mysql
spring.jpa.properties.show-sql=true
spring.jpa.properties.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
跟Mybatis多数据源一样,这里也是通过 one 和 two 对数据源进行了区分,但是加了 one 和 two 之后,这里的配置就没法被 SpringBoot 自动加载了(因为前面的 key 变了),需要我们自己去加载 DataSource 了,此时,需要自己配置一个 DataSourceConfig,用来提供两个 DataSource Bean。
另外Jpa的配置里面多了一个properties属性

4.创建DataSourceConfig文件

创建包config,在config包中创建DataSourceConfig类,添加两个返回DataSource的方法:

package com.test.multidatasourcejpa.config;

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 DataSourceConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.one")
    //这里添加@Primary注解,一定不能少,否则在项目启动时会出错,@Primary 表示当某一个类存在多个实例时,优先使用哪个实例
    @Primary
    DataSource dsOne() {
        return DataSourceBuilder.create().build();
    }
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.two")
    DataSource dsTwo() {
        return DataSourceBuilder.create().build();
    }
}
这里提供了两个 Bean,其中 @ConfigurationProperties 是 Spring Boot 提供的类型安全的属性绑定,以第一个Bean为例, @ConfigurationProperties(prefix = "spring.datasource.one") 表示使用 spring.datasource.one 前缀的数据库配置去创建一个 DataSource,这样配置之后,我们就有了两个不同的 DataSource

5.创建两个Jpa配置类

​ 创建JpaConfigOne类,对应数据源dsOne:

package com.test.multidatasourcejpa.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.annotation.Resource;
import javax.sql.DataSource;


@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.test.multidatasourcejpa.dao1",
        entityManagerFactoryRef = "entityManagerFactoryBeanOne",
        transactionManagerRef = "platformTransactionManagerOne")
/*
basePackages 用来指定 dao 所在的位置。
entityManagerFactoryRef 用来指定实体类管理工厂 Bean 的名称
transactionManagerRef 用来指定事务管理器的引用名称,
默认的 Bean 名称为方法名
 */
public class JpaConfigOne {

    @Resource(name = "dsOne")
    DataSource dsOne;

    @Autowired
    JpaProperties jpaProperties;

    @Bean
    @Primary
    //该 Bean 用来提供 EntityManager 实例
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBeanOne(
            EntityManagerFactoryBuilder builder) {
        return builder.dataSource(dsOne) //配置数据源
                .properties(jpaProperties.getProperties())//设置 JPA 相关配置
                .packages("com.test.multidatasourcejpa.pojo")//设置实体类所在的位置
                .persistenceUnit("pu1")//配置持久化单元名。若项目中只有一个 EntityManagerFactory,则 persistenceUnit 可以省略掉,若有多个,则必须明确指定持久化单元名。
                .build();
    }

    //创建一个事务管理器。JpaTransactionManager 提供对单个 EntityManagerFactory 的事务支持,专门用于解决 JPA 中的事务管理
    @Bean
    PlatformTransactionManager platformTransactionManagerOne(
            EntityManagerFactoryBuilder builder) {
        LocalContainerEntityManagerFactoryBean factoryBeanOne
                = entityManagerFactoryBeanOne(builder);
        return new JpaTransactionManager(factoryBeanOne.getObject());
    }

}

创建JpaConfigTwo类,对应数据源dsTwo:

package com.test.multidatasourcejpa.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.annotation.Resource;
import javax.sql.DataSource;


@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.test.multidatasourcejpa.dao2",
        entityManagerFactoryRef = "entityManagerFactoryBeanTwo",
        transactionManagerRef = "platformTransactionManagerTwo")
/*
basePackages 用来指定 dao 所在的位置。
entityManagerFactoryRef 用来指定实体类管理工厂 Bean 的名称
transactionManagerRef 用来指定事务管理器的引用名称,
默认的 Bean 名称为方法名
 */
public class JpaConfigTwo {

    @Resource(name = "dsTwo")
    DataSource dsTwo;

    @Autowired
    JpaProperties jpaProperties;

    @Bean
    //该 Bean 用来提供 EntityManager 实例
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBeanTwo(
            EntityManagerFactoryBuilder builder) {
        return builder.dataSource(dsTwo) //配置数据源
                .properties(jpaProperties.getProperties())//设置 JPA 相关配置
                .packages("com.test.multidatasourcejpa.pojo")//设置实体类所在的位置
                .persistenceUnit("pu2")//配置持久化单元名。若项目中只有一个 EntityManagerFactory,则 persistenceUnit 可以省略掉,若有多个,则必须明确指定持久化单元名。
                .build();
    }

    //创建一个事务管理器。JpaTransactionManager 提供对单个 EntityManagerFactory 的事务支持,专门用于解决 JPA 中的事务管理
    @Bean
    PlatformTransactionManager platformTransactionManagerTwo(
            EntityManagerFactoryBuilder builder) {
        LocalContainerEntityManagerFactoryBean factoryBeanTwo
                = entityManagerFactoryBeanTwo(builder);
        return new JpaTransactionManager(factoryBeanTwo.getObject());
    }

}

6.创建实体类

创建包com.test.multidatasourcejpa.pojo,在包下创建两个实体类:

Users

package com.test.multidatasourcejpa.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;


@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "users")
public class Users {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String uname;

    private int age;


}

Goods

package com.test.multidatasourcejpa.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;


@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "goods")
public class Goods {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;

    private float price;

}

7.创建数据库访问层

我们分别在 com.test.multidatasourcejpa.dao1 和 com.test.multidatasourcejpa.dao2 包下创建两个 dao,分别用于操作不同的数据源。

com.test.multidatasourcejpa.dao1包下:

package com.test.multidatasourcejpa.dao1;

import com.test.multidatasourcejpa.pojo.Users;
import org.springframework.data.jpa.repository.JpaRepository;


public interface UsersDao extends JpaRepository<Users,Integer> {
}

com.test.multidatasourcejpa.dao2包下:

package com.test.multidatasourcejpa.dao2;

import com.test.multidatasourcejpa.pojo.Goods;
import org.omg.CORBA.INTERNAL;
import org.springframework.data.jpa.repository.JpaRepository;


public interface GoodsDao extends JpaRepository<Goods,Integer> {
}

8.创建控制层

创建包controller,在controller包中创建两个控制层类:

UsersController

package com.test.multidatasourcejpa.controller;

import com.test.multidatasourcejpa.dao1.UsersDao;
import com.test.multidatasourcejpa.pojo.Users;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


@RestController
@RequestMapping("/users")
public class UsersController {

    @Autowired
    private UsersDao usersDao;


    @RequestMapping("select")
    public List<Users> selectUsers()
    {
        return usersDao.findAll();
    }

}

GoodsController

package com.test.multidatasourcejpa.controller;

import com.test.multidatasourcejpa.dao1.UsersDao;
import com.test.multidatasourcejpa.dao2.GoodsDao;
import com.test.multidatasourcejpa.pojo.Goods;
import com.test.multidatasourcejpa.pojo.Users;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


@RestController
@RequestMapping("/goods")
public class GoodsController {

    @Autowired
    private GoodsDao goodsDao;


    @RequestMapping("select")
    public List<Goods> selectGoods()
    {
        return goodsDao.findAll();
    }
}

9.测试

在这里插入图片描述

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

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

相关文章

ARM基础(1):Cortex-M3的核心寄存器和特殊寄存器

Cortex-M3处理器的寄存器包括R0~R15和一些特殊的寄存器。其中R0到R12是通用寄存器&#xff0c;但是一些16位的Thumb指令只能访问R0到R7(低寄存器)&#xff0c;而32位的Thumb-2指令则可以访问所有这些寄存器。特殊寄存器只能通过特殊访问指令访问。 文章目录1 核心寄存器1.1 R13…

牛客网刷题【BC33、BC56、BC44、BC91、BC49、写函数求最大值】

目录 一、BC33 计算平均成绩 二、BC56 线段图案 三、BC44 判断整数奇偶型 四、BC91 成绩输入输出问题 五、BC49 判断两个数的大小关系 六、写函数&#xff0c;求最大值 一、BC33 计算平均成绩 #include <stdio.h>int main() {double score0;double sum0;int i…

VK1088B 22*4点 LCD液晶显示屏驱动IC,4*4MM超小体积,具省电模式,多用于超小型LCD段码屏显示驱动,FAE技术支持

产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK1088B 封装形式&#xff1a;QFN32&#xff08;4MM*4MM&#xff09; 概述&#xff1a; VK1088B是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大88点&#xff08;22SEGx4COM&#xff09;的LCD屏&#xff0c;也…

osgEarth示例分析——osgearth_featurequery

前言 osgearth_featurequery示例&#xff0c;分析了如何拾取地球上的特征&#xff0c;并对特征信息进行提取与显示。 执行命令&#xff1a;osgearth_featurequeryd.exe earth_image\china-simple.earth 需要注意的是&#xff1a;earth文件&#xff0c;必须有特征内容。否则无…

tkinter制做一个音乐下载小软件,多种音乐免费听

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 平常我们下载的歌曲&#xff0c;都是各种妖魔鬼怪的格式横行~ 想下载下来用一下都不行&#xff0c;还只能在它的播放器内听&#xff0c;这谁受得了~ 学Python是用来干嘛的&#xff1f; 当然是解…

929903-87-7,Ac-Arg-Leu-Arg-MCA

Ac-RLR-AMC, fluorogenic substrate for assaying the trypsin-like activity of purified proteasomes (Km 78 μM). Ac-RLR-AMC&#xff0c;荧光底物&#xff0c;用于测定纯化蛋白酶体的胰蛋白酶样活性(Km 78 μM)。 多肽荧光标记由于没有放射性&#xff0c;实验操作简单。…

高通平台开发系列讲解(AI篇)如何让MTCNN运行在SNPE

文章目录 一、使用到的工具二、环境配置2.1、Snpe的环境配置2.2、opencv的环境配置2.3、caffe的环境配置三、MTCNN网络组成四、基于SNPE运行MTCNN沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要介绍如何使用高通平台SNPE运行MTCNN。 一、使用到的工具 Ubunt…

MNN简介

一、轻量级高性能推理引擎 1.简介 MNN 是一个高效、轻量的深度学习框架。它支持深度模型推理与训练&#xff0c;尤其在端侧的推理与训练性能在业界处于领先地位。目前&#xff0c;MNN 已经在阿里巴巴的手机淘宝、手机天猫、优酷、钉钉、闲鱼等 20 多个 App 中使用&#xff0…

Vue/JS中定时器模拟随机指定范围、位数的小数并更新innerHTML以及页面被销毁时监听事件中销毁定时器

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-CSDN博客_前后端分离项目本地运行 Vue页面上某个弹窗内容是innerHTML动态拼接。 系统演示时需构造模拟数据&#xff0c;模拟出数…

CAXA 3D 实体设计2023 软件下载+补丁+安装教程

CAXA 3D 实体设计2023 软件下载补丁安装教程 软件下载链接&#xff1a;https://pan.baidu.com/s/1KQFTfBg1uim5AGmhryN7_A?pwdnopn 提取码&#xff1a;nopn CAXA 3D实体设计2023新增功能 1.3D曲线支持参数化约束 通过添加尺寸约束和几何约束实现对三维曲线的参数化驱动&…

基于java(ssm)人事考勤签到管理系统源码(java毕业设计)

基于java&#xff08;ssm&#xff09;人事考勤签到管理系统 人事考勤签到管理系统是基于java编程语言&#xff0c;mysql数据库&#xff0c;ssm框架&#xff0c;idea工具开发&#xff0c;本系统分为员工&#xff0c;部门经理&#xff0c;管理员三个角色&#xff0c;员工可以登陆…

超详细!旗舰SoC RK3588参数介绍-飞凌嵌入式

OK3568-C开发板RK3588是瑞芯微旗下最新的8K旗舰SoC芯片&#xff0c;采用ARM架构&#xff0c;主要用于PC、边缘计算设备、个人移动互联网设备和其他数字多媒体应用。 RK3588集成了四核Cortex-A76和四核Cortex-A55&#xff0c;以及单独的NEON协处理器&#xff0c;支持8K视频编解码…

图像处理基础知识

图像处理基础 自己学习整理的图像处理知识 视觉基本概念和直方图基本概念 文章目录图像处理基础基本概念视觉人类视觉概念人类视觉的特性机器视觉概念图像的感知直方图直方图的定义直方图的性质直方图的应用基本概念 视觉 人类视觉概念 人类视觉的特性 多义性 同一张图像可…

[附源码]Python计算机毕业设计Django项目管理系统的专家评审模块

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

5.32 综合案例2.0 - TTS语音云播报(支持M320开发板)

HaaS506 - TTS语音云播报简介准备硬件接口代码流程功能实现1、物联网平台开发2、设备端开发代码调试3.应用平台开发3.1新建‘普通项目’3.2关联产品和设备3.3新建移动应用简介 手机端发送文字&#xff0c;开发板发出对应语音信息。 本案例需要使用到阿里云平台连接网络。通过…

【TSP问题】基于遗传算法求解固定的开放式不返回多旅行推销员问题(M-TSP)附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

基于django+sqlite3的新闻网站管理系统源代码,含数据库文件

基于djangosqlite3的新闻网站管理系统源代码&#xff0c;含数据库文件 程序部署方法 1、安装程序依赖&#xff1b; 2、 manage.py migrate #初始化数据库&#xff1b; 3、 manage.py createsuperuser创建管理员&#xff1b; 4、manage.py runserver启动程序 完整程序下载地址&…

编程内功心法「底层原理系列」 底层架构原理,分析CPU处理器鲜为人知的那些秘密

前提概要 所谓&#xff0c;知彼知己百战不殆&#xff0c;针对于计算机的优化技术来讲&#xff0c;最底层也不过是针对于CPU技术的优化了&#xff0c;但是如果要区优化程序&#xff0c;涉及到CPU的执行能力&#xff0c;那必须要了解CPU的原理和概念以及执行过程等概念&#xff0…

html网页设计大学生作业成品——公益校园网站设计与实现(HTML+CSS+JavaScript)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

1.Spring概述(Spring官方文档总结)

目录 1.1jdk环境依赖 1.2 Spring介绍 1.3 Spring历史 1.4 设计理念 1.1 jdk环境依赖 从Spring Framework 5.1开始&#xff0c;Spring需要JDK 8 (Java SE 8)&#xff0c;并提供对JDK 11 LTS的开箱即用支持。建议将Java SE 8 update 60作为Java 8的最低补丁版本&#xff0c;但…