Spring Jpa多数据源工程配置过程解析
工程创建
首先是创建一个SpringBoot工程,创建时添加基本的Web、Jpa以及MySQL依赖,如下:
创建完成后,添加Druid依赖,这里和前文的要求一样,要使用专为SpringBoot打造的Druid,大伙可能发现了,如果整合多数据源一定要使用这个依赖,因为这个依赖中才有DruidDataSourceBuilder,最后还要记得锁定数据库依赖的版本,因为可能大部分人用的还是5.x的MySQL而不是8.x。完整依赖如下:
org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-web com.alibaba druid-spring-boot-starter 1.1.10 mysql mysql-connector-java 5.1.28 runtime
如此之后,工程就创建成功了。
基本配置
在基本配置中,我们首先来配置多数据源基本信息以及DataSource,首先在application.properties中添加如下配置信息:
#数据源一 spring.datasource.one.username=root spring.datasource.one.password=root spring.datasource.one.url=jdbc:mysql:///test01?useUnicode=true&characterEncoding=UTF-8 spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource #数据源二 spring.datasource.two.username=root spring.datasource.two.password=root spring.datasource.two.url=jdbc:mysql:///test02?useUnicode=true&characterEncoding=UTF-8 spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource #Jpa配置 spring.jpa.properties.database=mysql spring.jpa.properties.show-sql=true spring.jpa.properties.database-platform=mysql spring.jpa.properties.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
这里Jpa的配置和上文相比key中多了properties,多数据源的配置和前文一致,然后接下来配置两个DataSource,如下:
@Configuration publicclassDataSourceConfig{ @Bean @ConfigurationProperties(prefix="spring.datasource.one") @Primary DataSourcedsOne(){ returnDruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix="spring.datasource.two") DataSourcedsTwo(){ returnDruidDataSourceBuilder.create().build(); } }
这里的配置和前文的多数据源配置基本一致,但是注意多了一个在Spring中使用较少的注解@Primary,这个注解一定不能少,否则在项目启动时会出错,@Primary表示当某一个类存在多个实例时,优先使用哪个实例。
好了,这样,DataSource就有了。
多数据源配置
接下来配置Jpa的基本信息,这里两个数据源,我分别在两个类中来配置,先来看第一个配置:
@Configuration @EnableJpaRepositories(basePackages="org.sang.jpa.dao",entityManagerFactoryRef="localContainerEntityManagerFactoryBeanOne",transactionManagerRef="platformTransactionManagerOne") publicclassJpaConfigOne{ @Autowired @Qualifier(value="dsOne") DataSourcedsOne; @Autowired JpaPropertiesjpaProperties; @Bean @Primary LocalContainerEntityManagerFactoryBeanlocalContainerEntityManagerFactoryBeanOne(EntityManagerFactoryBuilderbuilder){ returnbuilder.dataSource(dsOne) .packages("org.sang.jpa.model") .properties(jpaProperties.getProperties()) .persistenceUnit("pu1") .build(); } @Bean PlatformTransactionManagerplatformTransactionManagerOne(EntityManagerFactoryBuilderbuilder){ LocalContainerEntityManagerFactoryBeanfactoryBeanOne=localContainerEntityManagerFactoryBeanOne(builder); returnnewJpaTransactionManager(factoryBeanOne.getObject()); } }
首先这里注入dsOne,再注入JpaProperties,JpaProperties是系统提供的一个实例,里边的数据就是我们在application.properties中配置的jpa相关的配置。然后我们提供两个Bean,分别是LocalContainerEntityManagerFactoryBean和PlatformTransactionManager事务管理器,不同于MyBatis和JdbcTemplate,在Jpa中,事务一定要配置。在提供LocalContainerEntityManagerFactoryBean的时候,需要指定packages,这里的packages指定的包就是这个数据源对应的实体类所在的位置,另外在这里配置类上通过@EnableJpaRepositories注解指定dao所在的位置,以及LocalContainerEntityManagerFactoryBean和PlatformTransactionManager分别对应的引用的名字。
好了,这样第一个就配置好了,第二个基本和这个类似,主要有几个不同点:
- dao的位置不同
- persistenceUnit不同
- 相关bean的名称不同
注意实体类可以共用。
代码如下:
@Configuration @EnableJpaRepositories(basePackages="org.sang.jpa.dao2",entityManagerFactoryRef="localContainerEntityManagerFactoryBeanTwo",transactionManagerRef="platformTransactionManagerTwo") publicclassJpaConfigTwo{ @Autowired @Qualifier(value="dsTwo") DataSourcedsTwo; @Autowired JpaPropertiesjpaProperties; @Bean LocalContainerEntityManagerFactoryBeanlocalContainerEntityManagerFactoryBeanTwo(EntityManagerFactoryBuilderbuilder){ returnbuilder.dataSource(dsTwo) .packages("org.sang.jpa.model") .properties(jpaProperties.getProperties()) .persistenceUnit("pu2") .build(); } @Bean PlatformTransactionManagerplatformTransactionManagerTwo(EntityManagerFactoryBuilderbuilder){ LocalContainerEntityManagerFactoryBeanfactoryBeanTwo=localContainerEntityManagerFactoryBeanTwo(builder); returnnewJpaTransactionManager(factoryBeanTwo.getObject()); } }
接下来,在对应位置分别提供相关的实体类和dao即可,数据源一的dao如下:
packageorg.sang.jpa.dao; publicinterfaceUserDaoextendsJpaRepository{ List getUserByAddressEqualsAndIdLessThanEqual(Stringaddress,Integerid); @Query(value="select*fromt_userwhereid=(selectmax(id)fromt_user)",nativeQuery=true) UsermaxIdUser(); }
数据源二的dao如下:
packageorg.sang.jpa.dao2; publicinterfaceUserDao2extendsJpaRepository{ List getUserByAddressEqualsAndIdLessThanEqual(Stringaddress,Integerid); @Query(value="select*fromt_userwhereid=(selectmax(id)fromt_user)",nativeQuery=true) UsermaxIdUser(); }
共同的实体类如下:
packageorg.sang.jpa.model; @Entity(name="t_user") publicclassUser{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY) privateIntegerid; privateStringusername; privateStringaddress; //省略getter/setter }
到此,所有的配置就算完成了,接下来就可以在Service中注入不同的UserDao,不同的UserDao操作不同的数据源。
其实整合Jpa多数据源也不算难,就是有几个细节问题,这些细节问题解决,其实前面介绍的其他多数据源整个都差不多。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。