# Spring Boot `DataSourceBuilder` 教程

> 原文： [http://zetcode.com/springboot/datasourcebuilder/](http://zetcode.com/springboot/datasourcebuilder/)

Spring Boot `DataSourceBuilder`教程展示了如何使用`DataSourceBuilder`在命令行 Spring Boot 应用中创建数据源。 使用了 HikariCP 连接池。

`DataSourceBuilder`是 Java 便利类，用于创建具有常见实现和属性的数据源。

H2 是完全用 Java 创建的开源关系数据库管理系统。 它可以嵌入 Java 应用中或以客户端-服务器模式运行。 它易于部署和安装，占地面积小。

Spring 是用于开发 Java 企业应用的 Java 应用框架。 它还有助于集成各种企业组件。 Spring Boot 使创建具有 Spring 动力的生产级应用和服务变得很容易，而对安装的要求却最低。

## Spring Boot `DataSourceBuilder` 示例

以下是一个简单的 Spring Boot 控制台应用。 它从 H2 内存数据库中检索数据并将其显示在终端中。 要配置数据源，我们使用`DataSourceBuilder`类。

```java
pom.xml
src
├───main
│   ├───java
│   │   └───com
│   │       └───zetcode
│   │           │   Application.java
│   │           │   MyRunner.java
│   │           ├───config
│   │           │       AppConfig.java
│   │           └───model
│   │                   Car.java
│   └───resources
│           application.yaml
│           data-h2.sql
│           logback.xml
│           schema-h2.sql
└───test
    └───java

```

这是项目结构。

`pom.xml`

```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zetcode</groupId>
    <artifactId>datasourcebuilder</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

```

Maven `pom.xml`我们声明必要的依赖关系。

`com/zetcode/model/Car.java`

```java
package com.zetcode.model;

import java.util.Objects;

public class Car {

    private Long id;
    private String name;
    private int price;

    public Car() {}

    public Car(Long id, String name, int price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Car car = (Car) o;
        return price == car.price &&
                Objects.equals(id, car.id) &&
                Objects.equals(name, car.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, price);
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Car{");
        sb.append("id=").append(id);
        sb.append(", name='").append(name).append('\'');
        sb.append(", price=").append(price);
        sb.append('}');
        return sb.toString();
    }
}

```

这是`Car` bean 类。 它包含商品 ID，名称和价格。

`resources/schema-h2.sql`

```java
CREATE TABLE cars(id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255), price INT);

```

该 SQL 脚本创建`cars`表。

`resources/data-h2.sql`

```java
INSERT INTO cars(name, price) VALUES('Audi', 52642);
INSERT INTO cars(name, price) VALUES('Mercedes', 57127);
INSERT INTO cars(name, price) VALUES('Skoda', 9000);
INSERT INTO cars(name, price) VALUES('Volvo', 29000);
INSERT INTO cars(name, price) VALUES('Bentley', 350000);
INSERT INTO cars(name, price) VALUES('Citroen', 21000);
INSERT INTO cars(name, price) VALUES('Hummer', 41400);
INSERT INTO cars(name, price) VALUES('Volkswagen', 21600);

```

该脚本用数据填充表。 这两个脚本都位于类路径的根目录中。

`resources/logback.xml`

```java
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <logger name="org.springframework" level="ERROR"/>
    <logger name="com.zetcode" level="DEBUG"/>
    <logger name="com.zaxxer.hikari" level="INFO"/>
</configuration>

```

在`logback.xml`文件中，我们配置日志记录级别。 我们将 Spring 框架的日志记录级别设置为`ERROR`，以便我们的输出不会被不必要的细节所困扰。

`resources/application.yml`

```java
datasource:
  hikari:
    minimum-idle: 1
    maximum-pool-size: 20
  jdbcUrl: jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE
  driverClassName: org.h2.Driver

spring:
  main:
    banner-mode: "off"

  datasource:
    platform: h2

```

Spring Boot 的主要配置文件称为`application.yml`。 在`datasource`属性中，我们配置数据源和 HikariCP。 我们使用内存中的 H2 数据库。

使用`banner-mode`属性，我们关闭 Spring Boot 横幅。 该平台值用在 SQL 初始化脚本中：`schema-${platform}.sql`和`data-${platform}.sql`。

`com/zetcode/config/AppConfig.java`

```java
package com.zetcode.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

@Configuration
public class AppConfig {

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
}

```

在`AppConfig`中生成一个数据源。 使用`@ConfigurationProperties`注解，我们已将配置外部化到 YAML 文件中。

`com/zetcode/MyRunner.java`

```java
package com.zetcode;

import com.zetcode.model.Car;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyRunner implements CommandLineRunner {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void run(String... args) {

        var sql = "SELECT * FROM cars";

        var cars = jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance(Car.class));

        for (Car car: cars) {

            System.out.println(car);
        }
    }
}

```

`MyRunner`执行 SQL 查询并在控制台中显示输出。

```java
@Autowired
private JdbcTemplate jdbcTemplate;

```

注入`JdbcTemplate`。

```java
var sql = "SELECT * FROM cars";

```

这是要执行的 SQL。 我们从`cars`表中选择所有汽车。

```java
var cars = jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance(Car.class));

```

`BeanPropertyRowMapper`将一行转换为指定映射目标类的新实例。

```java
for (Car car: cars) {

    System.out.println(car);
}

```

我们遍历所有汽车对象，并将它们打印到控制台。

`com/zetcode/Application.java`

```java
package com.zetcode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

```

`Application`设置 Spring Boot 应用。

```java
$ mvn -q spring-boot:run
... 
Car{id=1, name='Audi', price=52642}
Car{id=2, name='Mercedes', price=57127}
Car{id=3, name='Skoda', price=9000}
Car{id=4, name='Volvo', price=29000}
Car{id=5, name='Bentley', price=350000}
Car{id=6, name='Citroen', price=21000}
Car{id=7, name='Hummer', price=41400}
Car{id=8, name='Volkswagen', price=21600}
...

```

我们运行 Spring Boot 应用。 显示八辆车。

在本教程中，我们在 Spring Boot 控制台应用中使用了 DataSourceBuilder。 您可能也对这些相关教程感兴趣： [Spring Boot MySQL 教程](/springboot/mysql/)， [Spring Boot PostgreSQL 教程](/springboot/postgresql/)， [Spring Boot H2 教程](/articles/springbooth2/)， [Java 教程](/lang/java/)或列出[所有 Spring Boot 教程](/all/#springboot)。