Spring Boot學習進階筆記(四)-多數據源配置(JdbcTemplate、Spring-data-jpa)

在實際開發過程當中,每每咱們須要連接多個數據庫進行操做,因此多數據源的配置就在所不免了。java

1、JdbcTemplate支持:mysql

spring boot配置多數據源比較簡單spring

1)修改配置文件「application.properties」sql

spring.datasource.primary.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false數據庫

spring.datasource.primary.username=rootapp

spring.datasource.primary.password=123456dom

spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driveride

 

 

spring.datasource.secondary.url=jdbc:mysql://192.168.2.111:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=falseui

spring.datasource.secondary.username=rooturl

spring.datasource.secondary.password=123456

spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver

2)添加數據類「DataSourceConfig.java」

import javax.sql.DataSource;

 

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;

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 org.springframework.jdbc.core.JdbcTemplate;

 

@Configuration

public class DataSourceConfig {

 

  @Bean(name = "primaryDataSource")

    @Qualifier("primaryDataSource")

    @ConfigurationProperties(prefix="spring.datasource.primary")

    public DataSource primaryDataSource() {

        return DataSourceBuilder.create().build();

    }

 

    @Bean(name = "secondaryDataSource")

    @Qualifier("secondaryDataSource")

    @Primary

    @ConfigurationProperties(prefix="spring.datasource.secondary")

    public DataSource secondaryDataSource() {

        return DataSourceBuilder.create().build();

    }

 

    @Bean(name = "primaryJdbcTemplate")

    public JdbcTemplate primaryJdbcTemplate(

            @Qualifier("primaryDataSource") DataSource dataSource) {

        return new JdbcTemplate(dataSource);

    }

 

    @Bean(name = "secondaryJdbcTemplate")

    public JdbcTemplate secondaryJdbcTemplate(

            @Qualifier("secondaryDataSource") DataSource dataSource) {

        return new JdbcTemplate(dataSource);

    }

 

}

3)在service調用的時候根據註解添加不一樣的JdbcTemplate

@Autowired

    @Qualifier("primaryJdbcTemplate")

    protected JdbcTemplate jdbcTemplate;

 

@Autowired

    @Qualifier("secondaryJdbcTemplate")

    protected JdbcTemplate jdbcTemplate2;

 

@Override

    public Integer getUserCount() {

        return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class);

    }

    

    @Override

    public Integer getUserCount2() {

        return jdbcTemplate2.queryForObject("select count(1) from USER", Integer.class);

    }

 

 

2、Spring-data-jpa支持:

1)建立數據源配置類「PrimaryConfig.java」和「SecondConfig.java」,以「」爲例子

 

 


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.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;

 

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryPrimary", transactionManagerRef = "transactionManagerPrimary", basePackages = { "com.zh.SpringBootDemo.domain.p" }) // 設置Repository所在位置
public class PrimaryConfig {

 

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

 

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

 

@Primary
@Bean(name = "entityManagerFactoryPrimary")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
return builder.dataSource(primaryDataSource).properties(getVendorProperties(primaryDataSource)).packages("com.zh.SpringBootDemo.domain.p") // 設置實體類所在位置
.persistenceUnit("primaryPersistenceUnit").build();
}

 

@Autowired
private JpaProperties jpaProperties;

 

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

 

@Primary
@Bean(name = "transactionManagerPrimary")
public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
}

 

}

 

 

2)建立實體類domain和對應的respository

 

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

 

public interface UserRepository extends JpaRepository<User, Long> {

 

User findByName(String name);

 

User findByNameAndAge(String name, Integer age);

 

@Query("from User u where u.name=:name")
User findUser(@Param("name") String name);

 


}

 

 

3)根據註解調用對應的respository便可

相關文章
相關標籤/搜索