Spring Boot為建立資料庫的資料源提供了非常好的支援。不需要編寫任何額外的程式碼來在Spring Boot中建立資料源(DataSource)。 只需新增依賴項併執行組態詳細資訊就足以建立DataSource並連線資料庫。
在本章中,將使用Spring Boot JDBC驅動程式連線來連線資料庫。
首先,需要在構建組態檔案中新增Spring Boot Starter JDBC依賴項。
Maven使用者可以在pom.xml 檔案中新增以下依賴項。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
Gradle使用者可以在build.gradle 檔案中新增以下依賴項。
compile('org.springframework.boot:spring-boot-starter-jdbc')
要連線H2資料庫,需要在構建組態檔案中新增H2資料庫依賴項。
對於Maven使用者,請在pom.xml 檔案中新增以下依賴項。
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
對於Gradle使用者,請在build.gradle 檔案中新增以下依賴項。
compile('com.h2database:h2')
需要在src/main/resources 目錄下建立schema.sql 檔案和data.sql 檔案來連線H2資料庫。
schema.sql 檔案的內容如下所示。
CREATE TABLE PRODUCT (ID INT PRIMARY KEY, PRODUCT_NAME VARCHAR(25));
data.sql 檔案的內容如下所示。
INSERT INTO PRODUCT (ID,PRODUCT_NAME) VALUES (1,'Honey');
INSERT INTO PRODUCT (ID,PRODUCT_NAME) VALUES (2,'Almond');
要連線MySQL資料庫,需要將MySQL依賴項新增到我們的構建組態檔案中。
對於Maven使用者,請在pom.xml 檔案中新增以下依賴項。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
對於Gradle使用者,請在build.gradle 檔案中新增以下依賴項。
compile('mysql:mysql-connector-java')
現在,在MySQL中建立資料庫和表,如圖所示 -
對於屬性檔案使用者,請在application.properties 檔案中新增以下屬性。
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/PRODUCTSERVICE?autoreconnect = true
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.testOnBorrow = true
spring.datasource.testWhileIdle = true
spring.datasource.timeBetweenEvictionRunsMillis = 60000
spring.datasource.minEvictableIdleTimeMillis = 30000
spring.datasource.validationQuery = SELECT 1
spring.datasource.max-active = 15
spring.datasource.max-idle = 10
spring.datasource.max-wait = 8000
對於YAML使用者,請在application.yml 檔案中新增以下屬性。
spring:
datasource:
driverClassName: com.mysql.jdbc.Driver
url: "jdbc:mysql://localhost:3306/PRODUCTSERVICE?autoreconnect=true"
username: "root"
password: "root"
testOnBorrow: true
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 30000
validationQuery: SELECT 1
max-active: 15
max-idle: 10
max-wait: 8000
Redis是一個用於儲存記憶體資料結構的開源資料庫。 要在Spring Boot應用程式中連線Redis資料庫,需要在構建組態檔案中新增Redis依賴項。
Maven使用者應在pom.xml 檔案中新增以下依賴項。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
Gradle使用者應在build.gradle 檔案中新增以下依賴項。
compile('org.springframework.boot:spring-boot-starter-data-redis')
對於Redis連線,需要使用RedisTemplate。 對於RedisTemplate,需要提供JedisConnectionFactory
的詳細資訊。
@Bean
JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory jedisConFactory = new JedisConnectionFactory();
jedisConFactory.setHostName("localhost");
jedisConFactory.setPort(6000);
jedisConFactory.setUsePool(true);
return jedisConFactory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new StringRedisSerializer());
template.setValueSerializer(new StringRedisSerializer());
return template;
}
現在自動連線RedisTemplate
類並從Redis資料庫存取資料。
@Autowired
RedisTemplate<String, Object> redis;
Map<Object,Object> datalist = redis.opsForHash().entries(「Redis_code_index_key」);
要在Spring Boot應用程式中使用JdbcTemplate存取關聯式資料庫,需要在構建組態檔案中新增Spring Boot Starter JDBC依賴項。
然後,如果@Autowired JdbcTemplate
類,Spring Boot會自動連線資料庫並為JdbcTemplate
物件設定資料源。
@Autowired
JdbcTemplate jdbcTemplate;
Collection<Map<String, Object>> rows = jdbc.queryForList("SELECT QUERY");
應將@Repository
註釋新增到類檔案中。 @Repository
注釋用於為Spring Boot應用程式建立資料庫儲存庫。
@Repository
public class ProductServiceDAO {
}
可以在一個Spring Boot應用程式中保留’n’個資料源。 此處給出的範例顯示了如何在Spring Boot應用程式中建立多個資料源。 例如,要在應用程式屬性檔案中新增兩個資料源組態詳細資訊。
對於屬性檔案使用者,請將以下屬性新增到application.properties 檔案中。
spring.dbProductService.driverClassName = com.mysql.jdbc.Driver
spring.dbProductService.url = jdbc:mysql://localhost:3306/PRODUCTSERVICE?autoreconnect = true
spring.dbProductService.username = root
spring.dbProductService.password = root
spring.dbProductService.testOnBorrow = true
spring.dbProductService.testWhileIdle = true
spring.dbProductService.timeBetweenEvictionRunsMillis = 60000
spring.dbProductService.minEvictableIdleTimeMillis = 30000
spring.dbProductService.validationQuery = SELECT 1
spring.dbProductService.max-active = 15
spring.dbProductService.max-idle = 10
spring.dbProductService.max-wait = 8000
spring.dbUserService.driverClassName = com.mysql.jdbc.Driver
spring.dbUserService.url = jdbc:mysql://localhost:3306/USERSERVICE?autoreconnect = true
spring.dbUserService.username = root
spring.dbUserService.password = root
spring.dbUserService.testOnBorrow = true
spring.dbUserService.testWhileIdle = true
spring.dbUserService.timeBetweenEvictionRunsMillis = 60000
spring.dbUserService.minEvictableIdleTimeMillis = 30000
spring.dbUserService.validationQuery = SELECT 1
spring.dbUserService.max-active = 15
spring.dbUserService.max-idle = 10
spring.dbUserService.max-wait = 8000
Yaml使用者應該在application.yml 檔案中新增以下屬性。
spring:
dbProductService:
driverClassName: com.mysql.jdbc.Driver
url: "jdbc:mysql://localhost:3306/PRODUCTSERVICE?autoreconnect=true"
password: "root"
username: "root"
testOnBorrow: true
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 30000
validationQuery: SELECT 1
max-active: 15
max-idle: 10
max-wait: 8000
dbUserService:
driverClassName: com.mysql.jdbc.Driver
url: "jdbc:mysql://localhost:3306/USERSERVICE?autoreconnect=true"
password: "root"
username: "root"
testOnBorrow: true
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 30000
validationQuery: SELECT 1
max-active: 15
max-idle: 10
max-wait: 8000
現在,建立一個Configuration 類,為多個資料源建立DataSource
和JdbcTemplate
。
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
@Configuration
public class DatabaseConfig {
@Bean(name = "dbProductService")
@ConfigurationProperties(prefix = "spring.dbProductService")
@Primary
public DataSource createProductServiceDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "dbUserService")
@ConfigurationProperties(prefix = "spring.dbUserService")
public DataSource createUserServiceDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "jdbcProductService")
@Autowired
public JdbcTemplate createJdbcTemplate_ProductService(@Qualifier("dbProductService") DataSource productServiceDS) {
return new JdbcTemplate(productServiceDS);
}
@Bean(name = "jdbcUserService")
@Autowired
public JdbcTemplate createJdbcTemplate_UserService(@Qualifier("dbUserService") DataSource userServiceDS) {
return new JdbcTemplate(userServiceDS);
}
}
然後,使用@Qualifier
注釋自動連線JDBCTemplate
物件。
@Qualifier("jdbcProductService")
@Autowired
JdbcTemplate jdbcTemplate;
@Qualifier("jdbcUserService")
@Autowired
JdbcTemplate jdbcTemplate;