前言
由于项目的数据存储在多源关系型数据库中,oracle、mysql等,需要提供对多源数据库链接的支持。同时支持MySQL jpa操作。
application.yml配置
需要去掉spring boot默认的jdbc链接配置
spring:
# url: jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf-8&useSSL=false
# username: root
# password: 123456
# type: com.alibaba.druid.pool.DruidDataSource
# driverClassName: com.mysql.jdbc.Driver
添加自定义数据库配置
注意:配置名称需要跟配置的连接池提供的默认名称匹配,案例采用 DruidDataSource数据源作为连接池
#mysql配置
mysql:
url: jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
#oracle配置
oracle:
url: jdbc:oracle:thin:@127.0.0.1:1521/orcl11g
username: tiger
password: tiger
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: oracle.jdbc.driver.OracleDriver
spring boot 配置类
mysql配置
MySqlConfig.java
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
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.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy;
import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/**
* mysql链接配置
*
* 支持多源配置, 注意只有默认主库中的支持jpa默认加载配置
*
* @version 2019-08-02
* @author 小米虾
*/
@Configuration
@MapperScan(value = "com.test.modules.*.*.mysql.mapper", sqlSessionFactoryRef = "mysqlSessionFactory")
public class MySqlConfig {
@Bean
//副数据库需要配置@Qualifier
@Qualifier("mysql")
@ConfigurationProperties(prefix="mysql")
@Primary //当其它地方也用数据源的时候 默认加载它
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().type(DruidDataSource.class).build();
}
//此处将 MySQL 作为第一链接 @Primary
@Bean("mysqlSessionFactory")
@Primary
public SqlSessionFactory mysqlSessionFactory(@Qualifier("mysql") DataSource mysqlDataSource) throws Exception {
MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
mybatisSqlSessionFactoryBean.setDataSource(mysqlDataSource);
//加载 mappber.xml 配置文件
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("classpath:mapper/mysql/*.xml");
mybatisSqlSessionFactoryBean.setMapperLocations(resources);
return mybatisSqlSessionFactoryBean.getObject();
}
/**
* jpa管理类,配置加载JpaRepository 相关
*/
@Bean
@Qualifier("mysqlEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(@Qualifier("mysql") DataSource mysqlDataSource) {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(false);
vendorAdapter.setShowSql(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.test.*");
factory.setDataSource(mysqlDataSource);
//配置jpa _ 驼峰转换
Properties properties = new Properties();
properties.setProperty("hibernate.physical_naming_strategy", SpringPhysicalNamingStrategy.class.getName());
properties.setProperty("hibernate.implicit_naming_strategy", SpringImplicitNamingStrategy.class.getName());
factory.setJpaProperties(properties);
return factory;
}
@Bean
public PlatformTransactionManager transactionManager(@Qualifier("mysqlEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
}
oracle配置
OracleConfig.class
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
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.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import javax.sql.DataSource;
/**
* oracle链接配置
*
* 支持多源配置
*
* @version 2019-08-02
* @author 小米虾
*/
@Configuration
@MapperScan(basePackages = "com.oracle.mapper", sqlSessionFactoryRef = "oracleSessionFactory")
public class OracleConfig {
@Bean
//副数据库需要配置@Qualifier
@Qualifier("oracle")
@ConfigurationProperties(prefix="oracle")
public DataSource oracleDataSource() {
return DataSourceBuilder.create().type(DruidDataSource.class).build();
}
@Bean("oracleSessionFactory")
public SqlSessionFactory oracleSessionFactory(@Qualifier("oracle") DataSource oracleDataSource) throws Exception {
MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
mybatisSqlSessionFactoryBean.setDataSource(oracleDataSource);
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("classpath:mapper/oracle/*.xml");
mybatisSqlSessionFactoryBean.setMapperLocations(resources);
return mybatisSqlSessionFactoryBean.getObject();
}
}