Spring如何支持多种数据库引擎?

reg*_*sxp 0 spring database-connection spring-boot

I\xe2\x80\x99m 构建一个支持各种数据库引擎(MySQL、PostgreSQL、Oracle、SQL Server)的 Spring Boot 应用程序。

\n\n

安装应用程序时,系统将提示用户选择要使用的数据库,之后将创建所有表。我认为我应该将用户选项保存在某处,然后使用它来选择我的应用程序将用于实例化存储库的正确引擎。

\n\n

我在谷歌上搜索了一些参考资料或最佳实践,我应该遵循这些参考资料或最佳实践来实现这一点,但\xe2\x80\x99无法找到(也许我\xe2\x80\x99m搜索了错误的术语 - 抱歉)。

\n\n

您有任何资源可以指引我正确的方向吗?

\n\n

多谢!!!

\n

小智 5

您可以参考样品。在示例中,我对多个数据库使用 hibernate + spring boot。您可以通过以下方式工作:

步骤1:在application.properties中声明数据库的连接信息(mysql、oracle、postgresql)

# MySQL-Database
mysql.db.driver: com.mysql.jdbc.Driver
mysql.db.url: jdbc:mysql://localhost:3306/test
mysql.db.username: root
mysql.db.password: root
mysql.hibernate.dialect: org.hibernate.dialect.MySQL5Dialect
mysql.entitymanager.packagesToScan: com.test.mysql


# postgresql-Database
postgresql.db.driver: org.postgresql.Driver
postgresql.db.url: jdbc:postgresql://localhost:5432/postgres_demo
postgresql.db.username: root
postgresql.db.password: 
postgresql.hibernate.dialect: org.hibernate.dialect.PostgreSQLDialect
postgresql.entitymanager.packagesToScan: com.test.postgresql


# Oracle-Database
oracle.db.driver: oracle.jdbc.driver.OracleDriver
oracle.db.url: jdbc:oracle:thin:@localhost:1521:xe
oracle.db.username: root
oracle.db.password: 
oracle.hibernate.dialect: org.hibernate.dialect.Oracle10gDialect
oracle.entitymanager.packagesToScan: com.test.oracle
Run Code Online (Sandbox Code Playgroud)

步骤2:在项目spring boot中,您可以参考结构项目,例如:

在此输入图像描述

步骤3:实现mysql、oracle、postgresql的数据源。你可以参考MysqlDatabaseConfig.java,OracleDatabaseConfig.java,PostgresDatabaseConfig.java

package com.test.mysql;

import java.util.Properties;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
public class MysqlDatabaseConfig {

  @Value("${mysql.db.driver}")
  private String DB_DRIVER;

  @Value("${mysql.db.password}")
  private String DB_PASSWORD;

  @Value("${mysql.db.url}")
  private String DB_URL;

  @Value("${mysql.db.username}")
  private String DB_USERNAME;

  @Value("${mysql.hibernate.dialect}")
  private String HIBERNATE_DIALECT;

  @Value("${mysql.entitymanager.packagesToScan}")
  private String ENTITYMANAGER_PACKAGES_TO_SCAN;

  @Bean(name="mysqlDataSource")
  @Primary
  public DataSource cmrDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(DB_DRIVER);
    dataSource.setUrl(DB_URL);
    dataSource.setUsername(DB_USERNAME);
    dataSource.setPassword(DB_PASSWORD);
    return dataSource;
  }

  @Bean(name="mysqlSessionFactory")
  public LocalSessionFactoryBean crmSessionFactory() {
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setDataSource(cmrDataSource());
    sessionFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN);
    Properties hibernateProperties = new Properties();
    hibernateProperties.put("hibernate.dialect", HIBERNATE_DIALECT);
    sessionFactoryBean.setHibernateProperties(hibernateProperties);

    return sessionFactoryBean;
  }

  @Bean(name="mysqlTransactionManager")
  public HibernateTransactionManager transactionManager() {
    HibernateTransactionManager transactionManager =  new HibernateTransactionManager();
    transactionManager.setSessionFactory(crmSessionFactory().getObject());
    return transactionManager;
  }

}
Run Code Online (Sandbox Code Playgroud)

OracleDatabaseConfig.java

package com.test.oracle;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@EnableTransactionManagement
public class OracleDatabaseConfig {

  @Value("${oracle.db.driver}")
  private String DB_DRIVER;

  @Value("${oracle.db.password}")
  private String DB_PASSWORD;

  @Value("${oracle.db.url}")
  private String DB_URL;

  @Value("${oracle.db.username}")
  private String DB_USERNAME;

  @Value("${oracle.hibernate.dialect}")
  private String HIBERNATE_DIALECT;

  @Value("${oracle.entitymanager.packagesToScan}")
  private String ENTITYMANAGER_PACKAGES_TO_SCAN;

  @Bean(name="oracleDataSource")
  @Primary
  public DataSource cmrDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(DB_DRIVER);
    dataSource.setUrl(DB_URL);
    dataSource.setUsername(DB_USERNAME);
    dataSource.setPassword(DB_PASSWORD);
    return dataSource;
  }

  @Bean(name="oracleSessionFactory")
  public LocalSessionFactoryBean crmSessionFactory() {
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setDataSource(cmrDataSource());
    sessionFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN);
    Properties hibernateProperties = new Properties();
    hibernateProperties.put("hibernate.dialect", HIBERNATE_DIALECT);
    sessionFactoryBean.setHibernateProperties(hibernateProperties);

    return sessionFactoryBean;
  }

  @Bean(name="oracleTransactionManager")
  public HibernateTransactionManager transactionManager() {
    HibernateTransactionManager transactionManager =  new HibernateTransactionManager();
    transactionManager.setSessionFactory(crmSessionFactory().getObject());
    return transactionManager;
  }

}
Run Code Online (Sandbox Code Playgroud)

PostgresDatabaseConfig.java

package com.test.postgresql;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@EnableTransactionManagement
public class PostgresDatabaseConfig {

  @Value("${postgresql.db.driver}")
  private String DB_DRIVER;

  @Value("${postgresql.db.password}")
  private String DB_PASSWORD;

  @Value("${postgresql.db.url}")
  private String DB_URL;

  @Value("${postgresql.db.username}")
  private String DB_USERNAME;

  @Value("${postgresql.hibernate.dialect}")
  private String HIBERNATE_DIALECT;

  @Value("${postgresql.entitymanager.packagesToScan}")
  private String ENTITYMANAGER_PACKAGES_TO_SCAN;

  @Bean(name="postgresqlDataSource")
  @Primary
  public DataSource cmrDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(DB_DRIVER);
    dataSource.setUrl(DB_URL);
    dataSource.setUsername(DB_USERNAME);
    dataSource.setPassword(DB_PASSWORD);
    return dataSource;
  }

  @Bean(name="postgresqlSessionFactory")
  public LocalSessionFactoryBean crmSessionFactory() {
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setDataSource(cmrDataSource());
    sessionFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN);
    Properties hibernateProperties = new Properties();
    hibernateProperties.put("hibernate.dialect", HIBERNATE_DIALECT);
    sessionFactoryBean.setHibernateProperties(hibernateProperties);

    return sessionFactoryBean;
  }

  @Bean(name="postgresqlTransactionManager")
  public HibernateTransactionManager transactionManager() {
    HibernateTransactionManager transactionManager =  new HibernateTransactionManager();
    transactionManager.setSessionFactory(crmSessionFactory().getObject());
    return transactionManager;
  }

}
Run Code Online (Sandbox Code Playgroud)

第四步:调用使用:以防mysql

package com.test.mysql.dao;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
@Transactional("mysqlTransactionManager")
public class TestMysqlDao {
    @Autowired
    @Qualifier("mysqlSessionFactory")
    private SessionFactory sessionFactory;
}
Run Code Online (Sandbox Code Playgroud)

万一甲骨文

package com.test.oracle.dao;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
@Transactional("oracleTransactionManager")
public class TestOracleDao {
    @Autowired
    @Qualifier("oracleSessionFactory")
    private SessionFactory sessionFactory;
}
Run Code Online (Sandbox Code Playgroud)

如果是 postgresql

package com.test.postgresql.dao;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
@Transactional("postgresqlTransactionManager")
public class TestPostgresDao {
    @Autowired
    @Qualifier("postgresqlSessionFactory")
    private SessionFactory sessionFactory;
}
Run Code Online (Sandbox Code Playgroud)