При разработке любого приложения довольно часто приходится обращаться к нескольким базам данных. По умолчанию 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.