乐趣区

关于java:springbootroute十多数据源切换

后面咱们曾经介绍了三种形式来操作数据库,在理论开发中,往往会呈现一个服务连贯多个数据库的需要,这时候就须要在我的项目中进行灵便切换数据源来实现多个数据库操作。这一章中,咱们应用 jdbcTemplate 来学习多数据源的配置。

一 筹备工作

1.1 建库、建表

咱们新建两个库 db1db2,数据结构还是用后面演示的,别离在两个库中新建表student

CREATE TABLE `student` (`student_id` int(30) NOT NULL AUTO_INCREMENT,
   `age` int(1) DEFAULT NULL COMMENT '年龄',
   `name` varchar(45) DEFAULT NULL COMMENT '姓名',
   `sex` int(1) DEFAULT NULL COMMENT '性别:1:男,2:女,0:未知',
   `create_time` datetime DEFAULT NULL COMMENT '创立工夫',
   `status` int(1) DEFAULT NULL COMMENT '状态:1:失常,-1:删除',
   PRIMARY KEY (`student_id`)
 ) ENGINE=InnoDB CHARSET=utf8mb4 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='学生表'

1.2 引入 mysql 和 jdbcTemplate 依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

1.3 写入两个数据源配置

spring:
  datasource:
    db1:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/db1
      username: root
      password: root
    db2:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/db2
      username: root
      password: root

二 多数据源配置

@Configuration
public class DataSourceConfig {

    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.db1")
    public DataSource db1DataSource(){return DataSourceBuilder.create().build();}

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    public DataSource db2DataSource(){return DataSourceBuilder.create().build();}
}
  • @Primary:示意主的,即呈现多个 bean 的时候如果不指定具体的 bean,则会采纳这个
  • @bean:标注为一个 bean,如果不指定 name 属性,则会应用创立 bean 办法的名字做为 bean 的名字
  • @ConfigurationProperties:读取配置文件

三 配置 JdbcTemplate 对象

@Configuration
public class DataSourceConfig {
    
    @Bean
    public JdbcTemplate db1JdbcTemplate(@Qualifier("db1DataSource") DataSource dataSource){return new JdbcTemplate(dataSource);
    }
    @Primary
    @Bean
    public JdbcTemplate db2JdbcTemplate(@Qualifier("db2DataSource") DataSource dataSource){return new JdbcTemplate(dataSource);
    }
}
  • @Qualifier:bean 类型雷同后,指定应用的 bean 的 name

四 测试类

4.1 测试 @Primary 属性

不指定应用哪个 JdbcTemplate 对象时,会应用标注了 @Primary 属性的对象

@SpringBootTest
class SpringBootDatasourceApplicationTests {
    
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    @Test
    void testPrimary() {jdbcTemplate.update("insert into student(name,age) values(?,?)",new Object[]{"Java 旅途",18});
    }
}

4.2 测试多数据源

@SpringBootTest
class SpringBootDatasourceApplicationTests {


    @Autowired
    private JdbcTemplate db1JdbcTemplate;
    @Autowired
    private JdbcTemplate db2JdbcTemplate;

    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Test
    void contextLoads() {db1JdbcTemplate.update("insert into student(name,age) values(?,?)",new Object[]{"Java 旅途",18});
        db2JdbcTemplate.update("insert into student(name,age) values(?,?)",new Object[]{"Java 旅途",18});
    }
    }
}

这里分享一道面试题:@Autowired 与 @Resource 有什么区别

@Autowired 是 Spring 提供的,@Resource 是 JDK 提供的;

@Autowired 是依据 bean 的类型匹配的,@Resource 是依据 bean 的 name 匹配的;

如果 @Autowird 想要依据 name 匹配应该怎么做呢?

  1. 配合 @Qualifier 注解指定 bean 的 name
  2. 应用变量名称作为 bean 的 id,@Autowired 如果匹配到多个符合条件的对象后,会主动依据变量名称做为 bean 的 id 持续匹配。咱们在 4.2 中采纳的就是这种形式。

此是 spring-boot-route 系列的第十篇文章,这个系列的文章都比较简单,次要目标就是为了帮忙首次接触 Spring Boot 的同学有一个零碎的意识。本文已收录至我的 github,欢送各位小伙伴star

github:https://github.com/binzh303/s…

点关注、不迷路

如果感觉文章不错,欢送 关注 点赞 珍藏,你们的反对是我创作的能源,感激大家。

如果文章写的有问题,请不要悭吝,欢送留言指出,我会及时核查批改。

如果你还想更加深刻的理解我,能够微信搜寻「Java 旅途」进行关注。回复「1024」即可取得学习视频及精美电子书。每天 7:30 准时推送技术文章,让你的下班路不在孤单,而且每月还有送书流动,助你晋升硬实力!

退出移动版