Spring Boot - 数据库处理
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 中创建数据库和表,如下所示 −
对于 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;