@Bean(name = “secondaryJdbcTemplate”)
public JdbcTemplate secondaryJdbcTemplate(
@Qualifier(“secondaryDataSource”) DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
接下来通过测试用例来演示如何使用这两个针对不同数据源的JdbcTemplate。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class ApplicationTests {
@Autowired
@Qualifier(“primaryJdbcTemplate”)
protected JdbcTemplate jdbcTemplate1;
@Autowired
@Qualifier(“secondaryJdbcTemplate”)
protected JdbcTemplate jdbcTemplate2;
@Before
public void setUp() {
jdbcTemplate1.update("DELETE FROM USER ");
jdbcTemplate2.update("DELETE FROM USER ");
}
@Test
public void test() throws Exception {
// 往第一个数据源中插入两条数据
jdbcTemplate1.update(“insert into user(id,name,age) values(?, ?, ?)”, 1, “aaa”, 20);
jdbcTemplate1.update(“insert into user(id,name,age) values(?, ?, ?)”, 2, “bbb”, 30);
// 往第二个数据源中插入一条数据,若插入的是第一个数据源,则会主键冲突报错
jdbcTemplate2.update(“insert into user(id,name,age) values(?, ?, ?)”, 1, “aaa”, 20);
// 查一下第一个数据源中是否有两条数据,验证插入是否成功
Assert.assertEquals(“2”, jdbcTemplate1.queryForObject(“select count(1) from user”, String.class));
// 查一下第一个数据源中是否有两条数据,验证插入是否成功
Assert.assertEquals(“1”, jdbcTemplate2.queryForObject(“select count(1) from user”, String.class));
}
}
Spring-data-jpa支持
对于数据源的配置可以沿用上例中DataSourceConfig
的实现。
新增对第一数据源的JPA配置,注意两处注释的地方,用于指定数据源对应的Entity
实体和Repository
定义位置,用@Primary
区分主数据源。
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef=“entityManagerFactoryPrimary”,
transactionManagerRef=“transactionManagerPrimary”,
basePackages= { “com.didispace.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.didispace.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());
}
}
新增对第二数据源的JPA配置,内容与第一数据源类似,具体如下:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef=“entityManagerFactorySecondary”,
transactionManagerRef=“transactionManagerSecondary”,
basePackages= { “com.didispace.domain.s” }) //设置Repository所在位置
public class SecondaryConfig {
@Autowired @Qualifier(“secondaryDataSource”)
private DataSource secondaryDataSource;
@Bean(name = “entityManagerSecondary”)
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactorySecondary(builder).getObject().createEntityManager();
}
@Bean(name = “entityManagerFactorySecondary”)
public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {
return builder
.dataSource(secondaryDataSource)
.properties(getVendorProperties(secondaryDataSource))
.packages(“com.didispace.domain.s”) //设置实体类所在位置
.persistenceUnit(“secondaryPersistenceUnit”)
.build();
}
@Autowired
private JpaProperties jpaProperties;
private Map<String, String> getVendorProperties(DataSource dataSource) {
return jpaProperties.getHibernateProperties(dataSource);
}
@Bean(name = “transactionManagerSecondary”)
PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
}
}
完成了以上配置之后,主数据源的实体和数据访问对象位于:com.didispace.domain.p
,次数据源的实体和数据访问接口位于:com.didispace.domain.s
。
分别在这两个package下创建各自的实体和数据访问接口
- 主数据源下,创建User实体和对应的Repository接口
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private Integer age;
public User(){}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
// 省略getter、setter
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/6e20d2061d16b92fbb795fafb2a2731a.jpeg)
最后
关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。当然,这些内容我也全部整理在一份pdf文档内,分成了以下几大专题:
- Java基础部分
- 算法与编程
- 数据库部分
- 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)
这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。
作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
-YT992sJb-1712193397705)]
- 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)
[外链图片转存中…(img-wCMQfcaN-1712193397705)]
这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。
作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!