1 介绍
-
2 示例
2.1 依赖引入
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
2.2 自定义配置两个数据库
``` spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/primary?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT&allowPublicKeyRetrieval=true spring.datasource.primary.username=root spring.datasource.primary.password=123456 spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.second.jdbc-url=jdbc:mysql://localhost:3306/second?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT&allowPublicKeyRetrieval=true spring.datasource.second.username=root spring.datasource.second.password=123456 spring.datasource.second.driver-class-name=com.mysql.cj.jdbc.Driver
日志打印执行的SQL
spring.jpa.show-sql=true
Hibernate的DDL策略
spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.format_sql=true spring.jpa.hibernate.primary-dialect=org.hibernate.dialect.MySQL55Dialect spring.jpa.hibernate.second-dialect=org.hibernate.dialect.MySQL55Dialect
<a name="lL4ZT"></a>## 2.3 配置默认的数据库源```javapackage com.hikktn.config;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.context.annotation.Primary;import org.springframework.stereotype.Component;import javax.sql.DataSource;@Configuration@Componentpublic class DataSourceConfig {/*** 主数据连接,默认优先级最高* @return*/@Bean(name = "primaryDataSource")@Qualifier("primaryDataSource")@ConfigurationProperties(prefix="spring.datasource.primary")public DataSource PrimaryDataSource() {return DataSourceBuilder.create().build();}/*** 从数据源* @return*/@Primary@Bean(name = "secondDataSource")@Qualifier("secondDataSource")@ConfigurationProperties(prefix="spring.datasource.second")public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}}
2.4 JPA配置主数据库
package com.hikktn.config;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.autoconfigure.domain.EntityScan;import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;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.env.Environment;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@EntityScan(basePackages = "com.hikktn.domain.primary")@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryPrimary",transactionManagerRef = "transactionManagerPrimary",basePackages = {"com.hikktn.dao.primary"})public class PrimaryConfig {@Autowired@Qualifier("primaryDataSource")private DataSource primaryDataSource;@Autowiredprivate JpaProperties jpaProperties;@Autowiredprivate HibernateProperties hibernateProperties;private Map<String, Object> getVendorProperties() {return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());}@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()).packages("com.hikktn.domain.primary").persistenceUnit("primaryPersistenceUnit").build();}@Primary@Bean(name = "transactionManagerPrimary")public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());}}
2.5 JPA配置副数据库
package com.hikktn.config;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.env.Environment;import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;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.annotation.Resource;import javax.persistence.EntityManager;import javax.sql.DataSource;import java.util.HashMap;import java.util.Map;@Configuration@EnableTransactionManagement@EnableJpaRepositories(//实体管理entityManagerFactoryRef="entityManagerFactorySecond",//事务管理transactionManagerRef="transactionManagerSecond",//实体扫描,设置Repository所在位置basePackages= { "com.hikktn.dao.second" })public class SecondConfig {@Autowired@Qualifier("secondDataSource")private DataSource secondDataSource;@Autowiredprivate JpaProperties jpaProperties;@Autowiredprivate HibernateProperties hibernateProperties;private Map<String, Object> getVendorProperties() {return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());}@Bean(name = "entityManagerSecond")public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactorySecond(builder).getObject().createEntityManager();}@Bean(name = "entityManagerFactorySecond")public LocalContainerEntityManagerFactoryBean entityManagerFactorySecond (EntityManagerFactoryBuilder builder) {return builder.dataSource(secondDataSource).properties(getVendorProperties()).packages("com.hikktn.domain.second").persistenceUnit("secondPersistenceUnit").build();}@Bean(name = "transactionManagerSecond")PlatformTransactionManager transactionManagerSecond(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactorySecond(builder).getObject());}}
2.6 主数据库Bean
package com.hikktn.domain.primary;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import javax.persistence.*;import java.io.Serializable;@Data@Entity@NoArgsConstructor@AllArgsConstructor@Table(name = "t_user")public class UserPrimaryEntity implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)Long id;/*** 名称*/String name;/*** 性别*/String sex;}
2.7 副数据库Bean
package com.hikktn.domain.second;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import javax.persistence.*;import java.io.Serializable;@Data@Entity@NoArgsConstructor@AllArgsConstructor@Table(name = "t_user")public class UserSecondEntity implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)Long id;/*** 名称*/String name;/*** 性别*/String sex;}
2.8 DAO层
package com.hikktn.dao.primary;import com.hikktn.domain.primary.UserPrimaryEntity;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.stereotype.Repository;@Repositorypublic interface UserPrimaryRepository extends JpaRepository<UserPrimaryEntity, Long> {}
package com.hikktn.dao.second;import com.hikktn.domain.second.UserSecondEntity;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.stereotype.Repository;@Repositorypublic interface UserSecondRepository extends JpaRepository<UserSecondEntity, Long> {}
2.9 启动类
package com.hikktn;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
2.10 测试
import com.hikktn.Application;import com.hikktn.dao.primary.UserPrimaryRepository;import com.hikktn.dao.second.UserSecondRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)@SpringBootTest(classes = Application.class)public class SpringbootJapDatasourceApplicationTests {@Autowiredprivate UserPrimaryRepository userPrimaryRepository;@Autowiredprivate UserSecondRepository userSecondRepository;@Testpublic void contextLoads() {System.out.println(userPrimaryRepository.findAll());System.out.println(userSecondRepository.findAll());}}
- 数据库里的数据

- 结果
Hibernate: select userprimar0_.id as id1_0_, userprimar0_.name as name2_0_, userprimar0_.sex as sex3_0_ from t_user userprimar0_[UserPrimaryEntity(id=1, name=zhansan, sex=男), UserPrimaryEntity(id=2, name=tom, sex=男)]2021-08-31 00:48:12.156 INFO 22556 --- [ main] o.h.h.i.QueryTranslatorFactoryInitiator : HHH000397: Using ASTQueryTranslatorFactoryHibernate: select usersecond0_.id as id1_0_, usersecond0_.name as name2_0_, usersecond0_.sex as sex3_0_ from t_user usersecond0_[UserSecondEntity(id=1, name=kitty, sex=女)]
