总体简介:

Spring Boot Jpa配置多个数据源(此次两个mysql数据库),访问其中一个库

alime_counsel_assign_log下的assign_data_backflow表,实现查询某个id的数据

一、整体项目目录:

补充pom.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.6</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.mock</groupId><artifactId>mockStrategyCenter</artifactId><version>0.0.1-SNAPSHOT</version><name>mockStrategyCenter</name><description>mockStrategyCenter</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--日主输出模块通常spring-boot自带依赖不需要手动添加--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency><!--JPA模块,支持Spring实现的上层操作,默认包含JDBC模块   数据持久化数据库访问jar包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!--mysql模块,主要包含连接数据库的驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--Lombok是用来简化Java代码的编写,那么就需要IDE和编译器(Maven)支持Lombok,因此ideal需要安装插件,maven和jdk需要满足你一定的版本 --><!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!--<dependency><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>0.8.3</version></dependency>--></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.5</version><configuration><includes><include>**/*Test.java</include><include>**/*Tests.java</include></includes></configuration></plugin><!-- Jacoco插件用来生成代码覆盖率--><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>0.8.3</version><configuration><skip>false</skip></configuration><executions><execution><id>pre-test</id><goals><goal>prepare-agent</goal></goals></execution><execution><id>post-test</id><phase>test</phase><goals><goal>report</goal></goals><configuration><!-- 指定从哪里对其jacoco的exec文件,默认路径为jacoco.exec--><!--<dataFile>target/jacoco.exec</dataFile>--><!-- 指定dataFile路径中文件被解析后输出地址--><outputDirectory>target/${project.artifactId}/jacoco-ut</outputDirectory></configuration></execution></executions></plugin></plugins></build></project>

二、数据库配置及数据源初始化

1)、main/resources目录下application.yml配置文件配置数据库相关信息:

定义了 项目的各种配置文件,包括多个数据源的链接信息

#1.内容格式比较: .properties文件,通过.来连接,通过=来赋值,结构上,没有分层的感觉,但比较直接。 .yml文件,通过:来分层,结构上,有比较明显的层次感,最后key赋值的:后需要留一个空格
#.执行顺序 如果工程中同时存在application.properties文件和 application.yml文件,yml文件会先加载,而后加载的properties文件会覆盖yml文件。所以建议工程中,只使用其中一种类型的文件即可。
#使用jdbc-url属性代替之前配置中的url属性 否则会报错使用jdbc-url属性代替之前配置中的url属性
server:port: 8080#编码格式tomcat:uri-encoding: utf-8#数据库相关配置
# 多数据源配置
#primary
spring:#应用名称application:name: mock-strategy-centerdatasource:primary:jdbc-url: jdbc:mysql://11.164.61.168:3306/alime_counsel_assign_logusername: alibbpocpassword: alibbpocdriver-class-name: com.mysql.cj.jdbc.Driver#secondarysecondary:jdbc-url: jdbc:mysql://11.164.61.168:3306/alime_counselusername: alibbpocpassword: alibbpocdriver-class-name: com.mysql.cj.jdbc.Driverjpa:hibernate:primary-dialect: org.hibernate.dialect.MySQL57Dialectsecondary-dialect: org.hibernate.dialect.MySQL57Dialecthbm2ddl: updateopen-in-view: trueshow-sql: true

2)、读取多数据源配置的几个类DataSourceConfig、PrimaryConfig、SecondaryConfig

DataSourceConfig类,从application.yml配置文件中读取主数据源和第二数据源的链接信息PrimaryConfig类和SecondaryConfig 指定jpa接口的Repository,实体entity,读取到的数据源配置从哪里取

DataSourceConfig类

package com.mock.mockstrategycenter.dataSource;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 javax.sql.DataSource;@Configuration
public class DataSourceConfig {@Bean(name = "primaryDataSource")@Qualifier("primaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource masterDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "secondaryDataSource")@Qualifier("secondaryDataSource")@Primary@ConfigurationProperties(prefix="spring.datasource.secondary")public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}}
PrimaryConfig
package com.mock.mockstrategycenter.dataSource;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
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.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Properties;@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryPrimary",transactionManagerRef = "transactionManagerPrimary",basePackages = {"com.mock.mockstrategycenter.repository.alimeCounselAssignLogRepository"}//设置Repository所在位置
)
public class PrimaryConfig {@Autowired@Qualifier("primaryDataSource")private DataSource primaryDataSource;@Primary@Bean(name = "entityManagerPrimary")public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactoryPrimary(builder).getObject().createEntityManager();}@Resourceprivate Properties jpaProperties;@Primary@Bean(name = "entityManagerFactoryPrimary")public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {LocalContainerEntityManagerFactoryBean entityManagerFactory = builder.dataSource(primaryDataSource).packages("com.mock.mockstrategycenter.entity.alimeCounselAssignLogEntity") //设置实体类所在位置.persistenceUnit("primaryPersistenceUnit").build();entityManagerFactory.setJpaProperties(jpaProperties);return entityManagerFactory;}@Primary@Bean(name = "transactionManagerPrimary")public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());}
}
SecondaryConfig
package com.mock.mockstrategycenter.dataSource;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Properties;@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactorySecondary",transactionManagerRef="transactionManagerSecondary",basePackages= { "com.mock.mockstrategycenter.repository.alimeCounselRepository" }) //设置Repository所在位置
public class SecondaryConfig {@Autowired@Qualifier("secondaryDataSource")private DataSource secondaryDataSource;@Bean(name = "entityManagerSecondary")public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactorySecondary(builder).getObject().createEntityManager();}@Resourceprivate Properties jpaProperties;@Bean(name = "entityManagerFactorySecondary")public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {LocalContainerEntityManagerFactoryBean entityManagerFactory = builder.dataSource(secondaryDataSource).packages("com.mock.mockstrategycenter.entity.alimeCounselEntity") //设置实体类所在位置.persistenceUnit("secondaryPersistenceUnit").build();entityManagerFactory.setJpaProperties(jpaProperties);return entityManagerFactory;}@Bean(name = "transactionManagerSecondary")PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());}}

三、数据库访问实现相关:

1)、AssignDataBackflow实体类,定义表assign_data_backflow的字段

package com.mock.mockstrategycenter.entity.alimeCounselAssignLogEntity;import lombok.Data;import javax.persistence.*;
import java.util.Date;@Entity
@Table(name = "assign_data_backflow")
@Data
public class AssignDataBackflow {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;@Column(name ="gmt_create")private Date gmt_create;@Column(name="tenant_id")private Integer tenant_id;@Column(name="session_id")private String session_id;//@Column(name="content") 符合命名格式可以不用加Column备注private String content;public void setId(Integer id) {this.id = id;}public Integer getId() {return id;}
}

2)、AssignDataBackflowRepository接口

package com.mock.mockstrategycenter.repository.alimeCounselAssignLogRepository;import com.mock.mockstrategycenter.entity.alimeCounselAssignLogEntity.AssignDataBackflow;
import org.springframework.data.jpa.repository.JpaRepository;/**** @Query* @Modifying 等注释可以实现自定义语句*/
public interface AssignDataBackflowRepository extends JpaRepository<AssignDataBackflow,Integer> {/*@Modifying@Query(value = "INSERT INTO `alime_counsel_assign_log`.`assign_data_backflow`(`tenant_id`, `session_id`, `content`) VALUES (:tenant_id, :session_id, '|n|r|99|62|84||34|92|18|9|106.5|h|47|h|z|11|91||e|36|e|s||g|||f||')", nativeQuery=true)void insert(@Param("tenant_id")Integer tenantId,@Param("session_id")String sessionId);*/}

3)、service层封装业务逻辑访问数据库ModeTrainingService

ModeTrainingService:

package com.mock.mockstrategycenter.service;import com.mock.mockstrategycenter.repository.alimeCounselAssignLogRepository.AssignDataBackflowRepository;
import org.springframework.stereotype.Service;import javax.annotation.Resource;@Service
public class ModeTrainingService {// 注入数据访问层接口对象@Resourceprivate AssignDataBackflowRepository assignDataBackflowRepository;public String findData(){Object  data=assignDataBackflowRepository.findById(new Integer(2008));return data.toString();}
}

通过MockHttpResponse将接口暴露

具体源码:

package com.mock.mockstrategycenter.controller;import com.mock.mockstrategycenter.service.ModeTrainingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
public class MockHttpResponse {@AutowiredModeTrainingService modeTrainingService;@RequestMapping(value = "/",produces="text/html;charset=UTF-8",method= RequestMethod.GET)@ResponseBodypublic String helloWord(@RequestParam Integer id){//访问执行时间long beforeTime = System.currentTimeMillis();String ob= modeTrainingService.findData();long afterTime = System.currentTimeMillis();return "Hello"+id+"query ["+ob +"] use time: "+(afterTime-beforeTime);}@RequestMapping(value = "/value",produces="application/json;charset=UTF-8",method= RequestMethod.GET)@ResponseBodypublic String dataValue(@RequestParam Integer id){String name="test"+id;return "{\"name\":\""+name+"\"}";}/*** 传入什么返回什么* @param thing* @return*/@RequestMapping(value = "/youSelf",produces="application/json;charset=UTF-8",method= RequestMethod.GET)@ResponseBodypublic String dataValue(@RequestParam String thing){return "{\"value\":\""+thing+"\"}";}
}

Spring Boot Jpa 配置多个数据源,并读取其中一个表的具体数据相关推荐

  1. Spring Boot自动配置原理分析

    一.写在前面 随着时间的迁移Spring Boot 越来越多的出现在Java 后端程序员的视野中,Spring Boot 之所以会那么流行,很大的一个原因是自身集成了很多的Bean,简化了传统Srin ...

  2. Spring Boot Jpa多数据源配置

    2019独角兽企业重金招聘Python工程师标准>>> 前言 随着业务量发展,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源,如:user一个库,busine ...

  3. 关于纯洁的微笑《Spring Boot(七):Mybatis 多数据源最简解决方案》文章补充说明多数据源事务的配置

    关于Spring boot中使用Mybatis多数据源的配置,我推荐纯洁的微笑博主的<Spring Boot(七):Mybatis 多数据源最简解决方案>这篇文章,简单清晰易懂 疑问 但是 ...

  4. (转)Spring Boot(五):Spring Boot Jpa 的使用

    http://www.ityouknow.com/springboot/2016/08/20/spring-boot-jpa.html 在上篇文章Spring Boot(二):Web 综合开发中简单介 ...

  5. 芋道 Spring Boot JPA 入门(一)之快速入门

    点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2019 超神之路,很肝~ 中文详细注释的开源项目 RP ...

  6. Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件

    本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...

  7. springboot原生mysql写法_【Rainbond最佳实践】Spring Boot框架配置MySQL

    Rainbond开源软件介绍: Rainbond是国内首个开源的生产级无服务器PaaS. 深度整合基于Kubernetes的容器管理.多类型CI/CD应用构建与交付.多数据中心的资源管理等技术,提供云 ...

  8. Spring Boot自动配置原理、实战

    Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...

  9. Spring Boot 自动配置的 “魔法” 是如何实现的?

    转载自  Spring Boot 自动配置的 "魔法" 是如何实现的? Spring Boot是Spring旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数 ...

最新文章

  1. Nature Biotechnology封面 | 经济快速:纳米孔宏基因组方案, 6小时准确识别下呼吸道病原体...
  2. JVM优化之调整大内存分页(LargePage)
  3. Linux 虚拟机安装后的配置和一些命令符笔记
  4. 面试题,说说你理解的中台
  5. word 编辑域中的汉字_Word中根号2、根号3怎么打?
  6. java拆装箱(转)
  7. oracle if 和,oracle if 和 case语句的使用
  8. Docker 之MySQL 重启,提示Error response from daemon: driver failed programming external connectivity on **
  9. Maven 使用本地Tomcat9 一键启动和热部署
  10. 【node爬虫】通过高德接口爬取地址的经纬度
  11. iOS内存扫描工具实现
  12. 炉石传说外 挂记(序)
  13. 2019 拼多多校招第三题sum 服务端研发工程师
  14. 剑指offer(第二版)读书笔记以及编程题目python版答案(二)
  15. java——菜鸟飞机大战
  16. android land,Mirror Land
  17. 139.深度学习分布式计算框架-2
  18. windbg通过网络启动进行内核调试
  19. HoloLens开发环境安装部署(基于Unity2018.4/VS2017/MRTK)
  20. 计算机网络知识大全.

热门文章

  1. 高并发-高可用-高性能
  2. 元素匹配jquery中filter、find、children、contents、contains区别
  3. K8S 自动部署工具
  4. 以“共域流量”生态思维破解独立管理餐厅的“短命”之殇弘扬中华餐饮传播中国符号
  5. 02 OpenCV图像通道处理
  6. 个人学习笔记——庄懂的技术美术入门课(美术向)09
  7. 有1,2,3,4个数,能组成多少个不相同无重复的三位数,分别是多少?
  8. mysqloffset什么意思_mysql limit和offset用法
  9. jenkins使用Role-based Authorization Strategy插件管理视图任务权限
  10. DTOJ 1587:Hamsters(hamsters)