Доступ к нескольким базам данных из Java приложения Spring Boot

При разработке любого приложения довольно часто приходится обращаться к нескольким базам данных. По умолчанию Spring Boot обеспечивает легкий доступ к одному источнику данных, в простейшем случае просто указав драйвер JDBC в пути к классу!

Однако доступ к нескольким базам данных с помощью Spring Boot по-прежнему прост. В этой статье показано, как подключиться к двум различным источникам данных MySql из приложения Spring Boot.

Чтобы продемонстрировать, как подключаться к различным базам данных, рассмотрим базу данных продуктов и базу данных клиентов со следующей упрощенной схемой и данными.

База 1 - База данных продуктов

Схема

create table PRODUCT(id integer, name varchar(255));

Данные

insert into PRODUCT(id, name) values (1, ‘XBox');

База 2 - База данных клиентов

Схема

create table CUSTOMER(id integer, name varchar(255));

Данные

insert into CUSTOMER(id, name) values (1, 'Daphne Jefferson’);

Чтобы получить доступ к базам данных, нам нужно объявить JdbcTemplate для каждой базы данных. В Spring JdbcTemplates создаются из DataSource, который имеет набор свойств подключения (URL-адрес, имя пользователя, пароль и т. Д.)

@Configuration
public class DataSourceConfig {

  Bean
  @Qualifier("customerDataSource")
  @Primary
  @ConfigurationProperties(prefix="customer.datasource")
  DataSource customerDataSource() {
    return DataSourceBuilder.create().build();
  }

  @Bean
  @Qualifier("productDataSource")
  @ConfigurationProperties(prefix="product.datasource")
  DataSource productDataSource() {
    return DataSourceBuilder.create().build();
  }

  @Bean
  @Qualifier("customerJdbcTemplate")
  JdbcTemplate customerJdbcTemplate(@Qualifier("customerDataSource")DataSource customerDataSource) {
    return new JdbcTemplate(customerDataSource);
  }

  @Bean
  @Qualifier("productJdbcTemplate")
  JdbcTemplate productJdbcTemplate(@Qualifier("productDataSource")DataSource productDataSource) {
    return new JdbcTemplate(productDataSource);
  }
}

В приведенном выше коде мы видим, что был объявлен компонент @Configuration, который определяет customerDatasource и customerJdbcTemplate. Каждый из этих bean-компонентов снабжен аннотацией @Qualifier («клиент ...»), чтобы идентифицировать их как относящиеся к базе данных клиентов.

Точно так же в приведенном выше коде определены productDataSource и productJdbcTemplate. Они снова помечаются @Qualifier(«продукт ...»), чтобы идентифицировать их как относящиеся к базе данных продуктов.

Наконец, каждый компонент DataSource аннотируется @ConfigurationProperties(prefix = "... datasource"). Это сообщает Spring Boot, какие свойства в файле application.properties следует использовать для подключения к каждой базе данных. Таким образом, файл application.properties выглядит следующим образом:

product.datasource.url = jdbc:mysql://localhost:3306/dbOne
product.datasource.username = user1
product.datasource.password = password
product.datasource.driverClassName = com.mysql.jdbc.Driver

customer.datasource.url = jdbc:mysql://localhost:3306/dbTwo
customer.datasource.username = user2
customer.datasource.password = password
customer.datasource.driverClassName = com.mysql.jdbc.Driver

Теперь, когда мы увидели, как создать DataSource и JdbcTemplate, JdbcTemplate можно вставить в @Repository для использования, например

@Repository
public class CustomerRepository {

  private static final String SELECT_SQL = "select NAME from CUSTOMER where ID=?"; 
  @Autowired
  @Qualifier("customerJdbcTemplate")
  JdbcTemplate customerJdbcTemplate;

  public String getCustomerName(int id) {
    String name = customerJdbcTemplate.queryForObject(SELECT_SQL, new Object[] {id}, String.class);

    return name;
  }
}

Опять же, обратите внимание на использование аннотации @Qualifier, чтобы указать, какой JdbcTemplate требуется для разных репозиториев.

ProductRepository аналогичным образом написан для доступа к productJdbcTemplate.

@Repository
public class ProductRepository {

  private static final String SELECT_SQL = "select NAME from PRODUCT where ID=?"; 
  @Autowired
  @Qualifier("productJdbcTemplate")
  JdbcTemplate productJdbcTemplate;

  public String getProductName(int id) {
    String name = productJdbcTemplate.queryForObject(SELECT_SQL, new Object[] {id}, String.class);

    return name;
  }
}

С помощью нескольких простых шагов Spring Boot позволяет нам легко подключаться к нескольким базам данных при использовании JdbcTemplates.