Spring Data Jpa +alibaba druid+query dsl 实现多数据源

Spring Data Jpa +alibaba druid+query dsl 实现多数据源,主要通过配置来实现多个数据源的操作,无需动态切换

1.maven 配置

 		 <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-data-jpaartifactId>
            <version>2.3.12.RELEASEversion>
        dependency>
 		<dependency>
            <groupId>com.alibabagroupId>
            <artifactId>druid-spring-boot-starterartifactId>
            <version>1.1.24version>
        dependency>
         <dependency>
            <groupId>com.querydslgroupId>
            <artifactId>querydsl-coreartifactId>
            <version>4.2.1version>
        dependency>
        <dependency>
            <groupId>com.querydslgroupId>
            <artifactId>querydsl-aptartifactId>
            <version>4.2.1version>
        dependency>
          <dependency>
            <groupId>com.querydslgroupId>
            <artifactId>querydsl-jpaartifactId>
            <version>4.2.1version>
        dependency>

2.properties配置


spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

#ds1
spring.datasource.druid.ds1.url=jdbc:mysql://localhost:3306/test1
spring.datasource.druid.ds1.username=xxxx
spring.datasource.druid.ds1.password=xxxxx
spring.datasource.druid.ds1.driverClassName=com.mysql.cj.jdbc.Driver

#ds2
spring.datasource.druid.ds2.url=jdbc:mysql://localhost:3306/test2
spring.datasource.druid.ds2.username=xxxxx
spring.datasource.druid.ds2.password=xxxxxx
spring.datasource.druid.ds2.driverClassName=com.mysql.cj.jdbc.Driver

3.代码

  • 数据源配置
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

/**
 * 多数据源配置
 *
 */
@Configuration
public class MultipleDataSourceConfig {
    
    @Primary
    @Bean(name = "ds1")
    @ConfigurationProperties(prefix = "spring.datasource.druid.ds1")
    public DataSource ds1() {
        return new DruidDataSource();
    }
    @Bean(name = "ds2")
    @ConfigurationProperties(prefix = "spring.datasource.druid.ds2")
    public DataSource ds2() {
        return new DruidDataSource();
    }
}

  • ds1配置
import org.springframework.beans.factory.annotation.Qualifier;
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.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.EntityManagerFactory;
import javax.sql.DataSource;


@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "ds1EntityManagerFactory",
        transactionManagerRef = "ds1TransactionManager", basePackages = {"cn.test.dao.ds1"})
public class Ds1DataSourceConfig {

    private final EntityManagerFactoryBuilder builder;

    public Ds1DataSourceConfig(EntityManagerFactoryBuilder builder) {
        this.builder = builder;
    }
    @Primary
    @Bean(name = "ds1EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean ds1EntityManagerFactory(@Qualifier("ds1") DataSource ds1) {
        return builder
                .dataSource(ds1)
                .properties(JpaDataSourceConstant.getJpaProperties())
                //ds1实体包名
                .packages("cn.test.entity.ds1")
                .persistenceUnit("ds1")
                .build();
    }
    @Primary
    @Bean(name = "ds1TransactionManager")
    public PlatformTransactionManager ds1TransactionManager(
            @Qualifier("ds1EntityManagerFactory") EntityManagerFactory ds1EntityManagerFactory) {
        return new JpaTransactionManager(ds1EntityManagerFactory);
    }
}

  • ds2配置
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.EntityManagerFactory;
import javax.sql.DataSource;


@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "ds2EntityManagerFactory",
        transactionManagerRef = "ds2TransactionManager", basePackages = {"cn.test.dao.ds2"})
public class Ds2DataSourceConfig {
    private final EntityManagerFactoryBuilder builder;

    public Ds2DataSourceConfig(EntityManagerFactoryBuilder builder) {
        this.builder = builder;
    }
    @Bean(name = "ds2EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean ds2EntityManagerFactory(@Qualifier("ds2") DataSource ds2) {
        return builder
                .dataSource(ds2)
                .properties(JpaDataSourceConstant.getJpaProperties())
                .packages("cn.test.entity.ds2")
                .persistenceUnit("ds2")
                .build();
    }
    @Bean(name = "ds2TransactionManager")
    public PlatformTransactionManager ds2TransactionManager(
            @Qualifier("ds2EntityManagerFactory") EntityManagerFactory ds2EntityManagerFactory) {
        return new JpaTransactionManager(ds2EntityManagerFactory);
    }
}

  • querydsl 配置
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.persistence.EntityManagerFactory;

@Configuration
public class QuerydslConfig {
    @Primary
    @Bean(name = "ds1QueryFactory")
    public JPAQueryFactory ds1QueryFactory(@Qualifier("ds1EntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JPAQueryFactory(entityManagerFactory.createEntityManager());
    }

    @Bean(name = "ds2QueryFactory")
    public JPAQueryFactory ds2QueryFactory(@Qualifier("ds2EntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JPAQueryFactory(entityManagerFactory.createEntityManager());
    }
}

  • jpa自定义配置
 public static Map<String, Object> getJpaProperties() {
        Map<String, Object> properties = new HashMap<>();
        //(没有这个配置会出现数据库和实体字段驼峰映射失败)
        properties.put("hibernate.physical_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
        properties.put("hibernate.implicit_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
        // 取消自动建表和动态更新表字段
        properties.put("hibernate.hbm2ddl.auto", "none");
        properties.put("hibernate.ddl-auto", "none");
        return properties;
    }
温馨提示使用querydsl 进行查询的时候不同的库需要使用不同的JPAQueryFactory哦~

总结一下,看起来简单,结果实际使用的时候踩了好多坑,记录一下分享给大家。

你可能感兴趣的:(spring,data,jpa,java)