Spring Boot 怎么处理数据库?

文章导读
Previous Quiz Next Spring Boot 为创建数据库的 DataSource 提供了出色的支持。我们无需在 Spring Boot 中编写额外的代码来创建 DataSource。只需添加依赖并进行配置即可创建 DataSource 并连接数据库。
📋 目录
  1. A 连接 H2 数据库
  2. B 连接 MySQL
  3. C 连接 Redis
  4. D JDBCTemplate
  5. E 多个 DataSource
A A

Spring Boot - 数据库处理



Previous
Quiz
Next

Spring Boot 为创建数据库的 DataSource 提供了出色的支持。我们无需在 Spring Boot 中编写额外的代码来创建 DataSource。只需添加依赖并进行配置即可创建 DataSource 并连接数据库。

在本章中,我们将使用 Spring Boot JDBC driver connection 来连接数据库。

首先,我们需要在构建配置文件中添加 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>
   <scope>runtime</scope>
</dependency>

对于 Gradle 用户,请在 build.gradle 文件中添加以下依赖。

compile('com.h2database:h2')

我们需要在 classpath 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-j</artifactId>
   <scope>runtime</scope>
</dependency>

对于 Gradle 用户,请在 build.gradle 文件中添加以下依赖。

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

现在,在 MySQL 中创建数据库和表,如下所示 −

Database and Tables in MySQL

对于 properties 文件用户,请在 application.properties 文件中添加以下属性。

spring.datasource.url = jdbc:mysql://localhost:3306/PRODUCTSERVICE
spring.datasource.username = root
spring.datasource.password = root

对于 YAML 用户,请在 application.yml 文件中添加以下属性。

spring:
   datasource: 
      url: "jdbc:mysql://localhost:3306/PRODUCTSERVICE"
      username: "root"
      password: "root"

连接 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 class,并从 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 JdbcTemplate class,Spring Boot 会自动连接数据库并为 JdbcTemplate 对象设置 Datasource。

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

应在类文件中添加 @Repository 注解。@Repository 注解用于为你的 Spring Boot 应用创建数据库 repository。

@Repository
public class ProductServiceDAO {
}

多个 DataSource

我们可以在单个 Spring Boot 应用中保持 n 个 DataSource。本示例展示了如何在 Spring Boot 应用中创建超过 1 个数据源。现在,在 application properties 文件中添加两个数据源的配置详情。

对于使用 properties 文件的用户,请在 application.properties 文件中添加以下属性。

spring.dbProductService.url = jdbc:mysql://localhost:3306/PRODUCTSERVICE
spring.dbProductService.username = root
spring.dbProductService.password = root

spring.dbUserService.url = jdbc:mysql://localhost:3306/USERSERVICE
spring.dbUserService.username = root
spring.dbUserService.password = root

YAML 用户应在 application.yml 文件中添加以下属性。

spring:
   dbProductService: 
      url: "jdbc:mysql://localhost:3306/PRODUCTSERVICE?autoreconnect=true"
      password: "root"
      username: "root"
   dbUserService: 
      url: "jdbc:mysql://localhost:3306/USERSERVICE?autoreconnect=true"
      password: "root"
      username: "root"

现在,创建一个 Configuration class 来为多个数据源创建 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;