Spring 学习

spring boot jpa mybatis多数据源配置

2018-08-10  本文已影响57人  Hogwarts1024

首先配置数据库


spring:
    datasource:
        primary:
            driver-class-name: com.mysql.jdbc.Driver
            url: jdbc:mysql://****
            username: ****
            password: ****
        secondary:
            driver-class-name: com.mysql.jdbc.Driver
            url: jdbc:mysql://****
            username: ****
            password: ****

其次是数据库config,因为项目中用到了jpa所以datasource单独拿出来

@Configuration
public class DataSourceConfig {

    @Primary//设置主数据库
    @Bean("primaryDB")
    @Qualifier("primaryDB")
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDS() {
        return DataSourceBuilder.create().build();
    }

    @Bean("secondaryDB")
    @Qualifier("secondaryDB")
    @ConfigurationProperties(prefix = "spring.datasource.crescent")
    public DataSource secondDS() {
        return DataSourceBuilder.create().build();
    }
    
}

然后是mybatis的配置

package com.zero.common.base.config;

import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
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.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Map;
import java.util.Properties;


@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "primaryEntityManagerFactory", transactionManagerRef =
        "primaryTransactionManager", basePackages = {"com.zero.project.dal.primary.dao"})
@MapperScan(basePackages = {"com.zero.project.dal.primary.mapper"}, sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryRepositoryConfig {

    @Autowired
    private JpaProperties jpaProperties;

    @Autowired
    @Qualifier("primaryDataSource")
    private DataSource primaryDataSource;

    @Bean(name = "primaryEntityManager")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
    }

    @Bean(name = "primaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(primaryDataSource).properties(getVendorProperties(primaryDataSource))
                .packages("com.zero.project.dal.primary.entity")
                .persistenceUnit("persistenceUnit").build();
    }

    private Map<String, String> getVendorProperties(DataSource dataSource) {
        return jpaProperties.getHibernateProperties(dataSource);
    }

    /**
     * 事务注解
     */
    @Primary
    @Bean(name = "primaryTransactionManager")
    PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
    }

    @Primary
    @Bean("primarySqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        //驼峰自动转换
        configuration.setMapUnderscoreToCamelCase(true);

        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(primaryDataSource);
        bean.setConfiguration(configuration);

        PageInterceptor pageInterceptor = new PageInterceptor();
        Properties properties = new Properties();
        properties.setProperty("helperDialect", "mysql");
        pageInterceptor.setProperties(properties);
        Interceptor[] interceptors = {pageInterceptor};
        bean.setPlugins(interceptors);
        //添加XML目录
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
            bean.setMapperLocations(resolver.getResources("classpath*:mybatis/primary/**/*.xml"));
            return bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

}

secondary数据库配置和主数据库一样只要把@primary注解去掉相应的bean名称修改就行

上一篇下一篇

猜你喜欢

热点阅读