Spring Boot數據庫源(連接數據庫)

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數據庫,需要在構建配置文件中添加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數據庫,需要將MySQL依賴項添加到我們的構建配置文件中。
對於Maven用戶,請在pom.xml 文件中添加以下依賴項。

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
</dependency>

對於Gradle用戶,請在build.gradle 文件中添加以下依賴項。

compile('mysql:mysql-connector-java')

現在,在MySQL中創建數據庫和表,如圖所示 -

Spring Boot數據庫源(連接數據庫)

對於屬性文件用戶,請在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

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」);

JdbcTemplate

要在Spring Boot應用程序中使用JdbcTemplate訪問關係數據庫,需要在構建配置文件中添加Spring Boot Starter JDBC依賴項。

然後,如果[@Autowired](https://github.com/Autowired "@Autowired") JdbcTemplate類,Spring Boot會自動連接數據庫併爲JdbcTemplate對象設置數據源。

@Autowired
JdbcTemplate jdbcTemplate;
Collection<Map<String, Object>> rows = jdbc.queryForList("SELECT QUERY");

應將[@Repository](https://github.com/Repository "@Repository")註釋添加到類文件中。 [@Repository](https://github.com/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 類,爲多個數據源創建DataSourceJdbcTemplate

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](https://github.com/Qualifier "@Qualifier")註釋自動連接JDBCTemplate對象。

@Qualifier("jdbcProductService")
@Autowired
JdbcTemplate jdbcTemplate;

@Qualifier("jdbcUserService")
@Autowired
JdbcTemplate jdbcTemplate;