Spring boot Mybatis多数据源支持

4 篇文章 0 订阅
3 篇文章 0 订阅

前言

由于项目的数据存储在多源关系型数据库中,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();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值