首页 > 其他分享 >记录SpringBoot里JPA配置多数据源

记录SpringBoot里JPA配置多数据源

时间:2024-04-11 14:55:36浏览次数:28  
标签:SpringBoot JPA 数据源 mysql spring oracle public name

之前的系统是建立在mysql数据库上的, 后来需求变更,需要跟教务系统对接获取教师的课表数据,在Oracle上。

baidu了之后找了几篇样例,写完了。发现只能连接@Primary的数据源。思索3天后,觉得应该是系统启动时自动就将Primary的数据源加载好了,并没有根据我的bean和mapper去匹配对应的数据源。(因为debug了好久没找到user,password在哪儿设置值的,,,我太蠢了。)又百度找了半天,发现在启动类里竟然还有个

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,.....这种配置。   现在将所有的代码发上来,记录一下,(过两年我可能又忘记了) 项目目录,关键位置分了mysql和oracle目录

 

Step1:引入依赖
           <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>            
        </dependency>

Step2:数据库配置

spring.datasource.mysql.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.mysql.password=XXX
spring.datasource.mysql.username=XXX
spring.datasource.mysql.url=jdbc:mysql://localhost:3306/ledger

spring.datasource.oracle.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.oracle.password=XXXX
spring.datasource.oracle.username=XXXX
spring.datasource.oracle.url=jdbc:oracle:thin:@X.X.X.X:1521/racdb
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.OracleDialect



#jpa
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
spring.jpa.hibernate.ddl-auto=update
spring.jpa.open-in-view=false

 

Step3:自定义datasource配置

    主数据源Mysql:MysqlDataSourceConfig.java

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="mysqlEntityManagerFactory",
        transactionManagerRef="mysqlTransactionManager",
        basePackages={"com.njjs.ledgersystem.mapper.mysql"})
@EntityScan(basePackages={"com.njjs.ledgersystem.entity.mysql"})
@MapperScan(basePackages={"com.njjs.ledgersystem.mapper.mysql"},sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MysqlDataSourceConfig {
    //加载properties文件中mysql数据源的相关配置
    @Primary   //主数据源
    @Bean(name="mysqlDataSourceProperties")
    @ConfigurationProperties("spring.datasource.mysql")
    public DataSourceProperties mysqlDataSourceProperties(){
        return new DataSourceProperties();
    }
    //配置数据源
    @Primary
    @Bean(name="mysqlDataSource")
    public DataSource mysqlDataSource(@Qualifier("mysqlDataSourceProperties") DataSourceProperties mysqlDtSource){
        return mysqlDtSource.initializeDataSourceBuilder()
                .type(HikariDataSource.class)
                .build();
    }

    //配置Session指定Mapper位置,不在Main启动类里去找了,在这里手动去找
    @Primary
    @Bean(name="mysqlSqlSessionFactory")
    public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception{
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/mysql/*.xml"));
        return bean.getObject();
    }

    @Primary
    @Bean(name="mysqlSqlSessionTemplate")
    public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception{
        return new SqlSessionTemplate(sqlSessionFactory);
    }
    //配置连接工厂
    @Primary
    @Bean(name="mysqlEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("mysqlDataSource") DataSource mysqlDataSource) {
        return builder.dataSource(mysqlDataSource)
                .packages("com.njjs.ledgersystem.entity.mysql")
                .persistenceUnit("mysql")
                .build();
    }

    //事务管理
    @Primary
    @Bean(name = "mysqlTransactionManager")
    public PlatformTransactionManager mysqlTransactionManager(final @Qualifier("mysqlEntityManagerFactory")
                                                              LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory) {
        return new JpaTransactionManager(mysqlEntityManagerFactory.getObject());
    }

}

 

    从数据源Oracle:OracleDataSourceConfig.java

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="oracleEntityManagerFactory",
        transactionManagerRef="oracleTransactionManager",
        basePackages={"com.njjs.ledgersystem.mapper.oracle"})
@EntityScan(basePackages={"com.njjs.ledgersystem.entity.oracle"})
@MapperScan(basePackages={"com.njjs.ledgersystem.mapper.oracle"},sqlSessionFactoryRef="oracleSqlSessionFactory")
public class OracleDataSourceConfig {
    //加载properties文件中oracle数据源的相关配置
    //@Primary
    @Bean(name="oracleDataSourceProperties")
    @ConfigurationProperties("spring.datasource.oracle")
    public DataSourceProperties oracleDataSourceProperties(){
        return new DataSourceProperties();
    }

    //配置数据源
    //@Primary
    @Bean(name="oracleDataSource")
    public DataSource oracleDataSource(@Qualifier("oracleDataSourceProperties") DataSourceProperties oracleDtSource){
        return oracleDtSource.initializeDataSourceBuilder()
                .type(HikariDataSource.class)
                .build();
    }
    //配置Session指定Mapper位置,不在Main启动类里去找了,在这里手动去找

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


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

    //配置连接工厂
    //@Primary
    @Bean(name="oracleEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("oracleDataSource") DataSource oracleDataSource) {
        return builder.dataSource(oracleDataSource)
                .packages("com.njjs.ledgersystem.entity.oracle")
                .persistenceUnit("oracle")
                .build();
    }

    //事务管理
    //@Primary
    @Bean(name = "oracleTransactionManager")
    public PlatformTransactionManager oracleTransactionManager(final @Qualifier("oracleEntityManagerFactory")
                                                              LocalContainerEntityManagerFactoryBean oracleEntityManagerFactory) {
        return new JpaTransactionManager(oracleEntityManagerFactory.getObject());
    }

}

 

Step4: 在所有Mapper里写入注解

 Step5:修改启动类,让他不要自己加载单一数据源,有我们自定义的datasource里自己去处理Mapper,entity,数据库连接参数等等。

@EnableScheduling
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        MybatisAutoConfiguration.class})
public class LedgerSystemApplication{
    private static final  Logger logger = LogManager.getLogger();

    public static void main(String[] args) {
    
        SpringApplication.run(LedgerSystemApplication.class, args);
    }
}

 

测试通过,爽歪歪

标签:SpringBoot,JPA,数据源,mysql,spring,oracle,public,name
From: https://www.cnblogs.com/wolf-python-lily/p/18129195

相关文章

  • 基于SpringBoot+MySQL+SSM+Vue.js的餐馆订餐系统(附论文)
    演示视频基于SpringBoot+MySQL+SSM+Vue.js的餐馆订餐系统技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybatis+SpringBoot文字描述基于SpringBoot+MySQL+SSM+Vue.js的餐馆订餐系统(附论文),用......
  • SpringBoot应用监控
    在微服务监控与安全 / SpringActuator中已经示例了SpringBoot提供了运行时的应用监控和管理的功能,可以通过http、jmx、ssh协议进行操作。1、http微服务监控与安全 / SpringActuator中已经就示范了这种方式。但是这种方式有个缺点:对于springactuator......
  • 通过JPA注解获取某个类主键字段
    123456789101112131415161718public StringgetPkColumn(StringclassName){    StringpkColumn= null;    try {        Classclazz=Class.forName(className);        Field[]fields=clazz.getDeclaredFiel......
  • 京东一面:如何在SpringBoot启动时执行特定代码?有哪些方式?
    引言SpringBoot提供了许多便捷的功能和特性,使得开发者可以更加轻松地构建强大、高效的应用程序。然而,在应用程序启动时执行一些初始化操作是至关重要的,它可以确保应用程序在启动后处于预期的状态,从而提供更好的用户体验和稳定性。在应用程序启动时执行初始化操作有许多好处。......
  • 基于SpringBoot+Vue的4S店车辆管理系统(源码+文档+部署+讲解)
    一.系统概述随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,4S店车辆系统就是信息时代变革中的产物之一。任何系统都要遵循系......
  • springboot中实现异步方法
    开启配置线程池packageorg.springblade.auth.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.annotation.EnableAsync;importorg.springframework.sch......
  • SpringBoot中application.yml引入多个YML文件
    系列文章目录文章目录系列文章目录前言前言前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。首先,你要了解SpringBoot配置文件加载顺序,加载位置(代码内,Nacos等),当然这......
  • 网上图书商城的设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+LW)图
    本项目包含可运行源码+数据库+LW,文末可获取本项目的所有资料。推荐阅读300套最新项目持续更新中.....最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm......
  • 游戏分享网站的设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+LW)手
    本项目包含可运行源码+数据库+LW,文末可获取本项目的所有资料。推荐阅读300套最新项目持续更新中.....最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm......
  • 汽车车辆租赁系统的设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+L
    本项目包含可运行源码+数据库+LW,文末可获取本项目的所有资料。推荐阅读300套最新项目持续更新中.....最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm......