SpringBoot 整合Spring Data JPA多数据源
JPA和MyBatis配置多数据源类似,不同的是,JPA配置时主要提供不同的LocalContainerEntityManagerFactoryBean以及事务管理器
添加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
application.yml配置
spring: datasource: boot: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/boot?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: 123456 boot2: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/boot2?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: 123456 jpa: properties: hibernate: dialect: org.hibernate.dialect.MySQL57InnoDBDialect database: mysql show-sql: true
DataSourceConfig:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @Configuration public class DataSourceConfig { @Bean @ConfigurationProperties ( "spring.datasource.boot" ) @Primary DataSource dsOne() { return DruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties ( "spring.datasource.boot2" ) DataSource dsTwo() { return DruidDataSourceBuilder.create().build(); } } |
创建JPA配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | @Configuration @EnableTransactionManagement @EnableJpaRepositories (basePackages = "com.xc.xcspringboot.repository" , entityManagerFactoryRef = "entityManagerFactoryBeanOne" , transactionManagerRef = "platformTransactionManagerOne" ) public class JpaConfigOne { @Resource (name = "dsOne" ) DataSource dsOne; @Autowired JpaProperties jpaProperties; @Bean @Primary LocalContainerEntityManagerFactoryBean entityManagerFactoryBeanOne(EntityManagerFactoryBuilder builder) { return builder.dataSource(dsOne) .properties(jpaProperties.getProperties()) .packages( "com.xc.xcspringboot.model" ) .persistenceUnit( "pu1" ) .build(); } @Bean PlatformTransactionManager platformTransactionManagerOne(EntityManagerFactoryBuilder builder) { LocalContainerEntityManagerFactoryBean factoryOne = entityManagerFactoryBeanOne(builder); return new JpaTransactionManager(factoryOne.getObject()); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | @Configuration @EnableTransactionManagement @EnableJpaRepositories (basePackages = "com.xc.xcspringboot.repository2" , entityManagerFactoryRef = "entityManagerFactoryBeanTwo" , transactionManagerRef = "platformTransactionManagerTwo" ) public class JpaConfigTwo { @Resource (name = "dsTwo" ) DataSource dsTwo; @Autowired JpaProperties jpaProperties; @Bean LocalContainerEntityManagerFactoryBean entityManagerFactoryBeanTwo(EntityManagerFactoryBuilder builder) { return builder.dataSource(dsTwo) .properties(jpaProperties.getProperties()) .packages( "com.xc.xcspringboot.model" ) .persistenceUnit( "pu2" ) .build(); } @Bean PlatformTransactionManager platformTransactionManagerTwo(EntityManagerFactoryBuilder builder) { LocalContainerEntityManagerFactoryBean factoryTwo = entityManagerFactoryBeanTwo(builder); return new JpaTransactionManager(factoryTwo.getObject()); } } |
• 使用@EnableJpaRepositories注解来进行JPA的配置,该注解中主要配置三个属性:basePackages、entityManagerFactoryRef以及transactionManagerRef。其中,basePackages用来指定Repository所在的位置,entityManagerFactoryRef用来指定实体类管理工厂Bean的名称,transactionManagerRef则用来指定事务管理器的引用名称,这里的引用名称就是JpaConfigOne类中注册的Bean的名称(默认的Bean名称为方法名)。
• 创建LocalContainerEntityManagerFactoryBean,该Bean将用来提供EntityManager实例,在该类的创建过程中,首先配置数据源,然后设置JPA相关配置(JpaProperties由系统自动加载),再设置实体类所在的位置,最后配置持久化单元名,若项目中只有一个EntityManagerFactory,则persistenceUnit可以省略掉,若有多个,则必须明确指定持久化单元名。
• 由于项目中会提供两个LocalContainerEntityManagerFactoryBean实例,注解@Primary表示当存在多个LocalContainerEntityManagerFactoryBean实例时,该实例将被优先使用。
• 创建一个事务管理器。JpaTransactionManager提供对单个EntityManagerFactory的事务支持,专门用于解决JPA中的事务管理。
创建Repository:
1 2 3 4 5 6 7 | public interface BookDao extends JpaRepository<Book, Integer> { } public interface BookDao2 extends JpaRepository<Book, Integer> { } |
创建Controller:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @Slf4j @RestController public class BookController { @Autowired BookDao bookDao; @Autowired BookDao2 bookDao2; @GetMapping ( "/test1" ) public void test1() { List<Book> all = bookDao.findAll(); log.info( "all " + all); List<Book> all2 = bookDao2.findAll(); log.info( "all2 " + all2); } } |
文章来源: Spring Boot+Vue全栈开发实战 5.4 多数据源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2021-05-27 pinyin4j 中文转拼音
2019-05-27 mybatis 传递多个参数