原文: 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类。

  1. pom.xml
  2. src
  3. ├───main
  4. ├───java
  5. └───com
  6. └───zetcode
  7. Application.java
  8. MyRunner.java
  9. ├───config
  10. AppConfig.java
  11. └───model
  12. Car.java
  13. └───resources
  14. application.yaml
  15. data-h2.sql
  16. logback.xml
  17. schema-h2.sql
  18. └───test
  19. └───java

这是项目结构。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>com.zetcode</groupId>
  8. <artifactId>datasourcebuilder</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <packaging>jar</packaging>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <maven.compiler.source>11</maven.compiler.source>
  14. <maven.compiler.target>11</maven.compiler.target>
  15. </properties>
  16. <parent>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-parent</artifactId>
  19. <version>2.1.1.RELEASE</version>
  20. </parent>
  21. <dependencies>
  22. <dependency>
  23. <groupId>com.h2database</groupId>
  24. <artifactId>h2</artifactId>
  25. <scope>runtime</scope>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-jdbc</artifactId>
  30. </dependency>
  31. </dependencies>
  32. <build>
  33. <plugins>
  34. <plugin>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-maven-plugin</artifactId>
  37. </plugin>
  38. </plugins>
  39. </build>
  40. </project>

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

com/zetcode/model/Car.java

  1. package com.zetcode.model;
  2. import java.util.Objects;
  3. public class Car {
  4. private Long id;
  5. private String name;
  6. private int price;
  7. public Car() {}
  8. public Car(Long id, String name, int price) {
  9. this.id = id;
  10. this.name = name;
  11. this.price = price;
  12. }
  13. public Long getId() {
  14. return id;
  15. }
  16. public void setId(Long id) {
  17. this.id = id;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public int getPrice() {
  26. return price;
  27. }
  28. public void setPrice(int price) {
  29. this.price = price;
  30. }
  31. @Override
  32. public boolean equals(Object o) {
  33. if (this == o) return true;
  34. if (o == null || getClass() != o.getClass()) return false;
  35. Car car = (Car) o;
  36. return price == car.price &&
  37. Objects.equals(id, car.id) &&
  38. Objects.equals(name, car.name);
  39. }
  40. @Override
  41. public int hashCode() {
  42. return Objects.hash(id, name, price);
  43. }
  44. @Override
  45. public String toString() {
  46. final StringBuilder sb = new StringBuilder("Car{");
  47. sb.append("id=").append(id);
  48. sb.append(", name='").append(name).append('\'');
  49. sb.append(", price=").append(price);
  50. sb.append('}');
  51. return sb.toString();
  52. }
  53. }

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

resources/schema-h2.sql

  1. CREATE TABLE cars(id INT PRIMARY KEY AUTO_INCREMENT,
  2. name VARCHAR(255), price INT);

该 SQL 脚本创建cars表。

resources/data-h2.sql

  1. INSERT INTO cars(name, price) VALUES('Audi', 52642);
  2. INSERT INTO cars(name, price) VALUES('Mercedes', 57127);
  3. INSERT INTO cars(name, price) VALUES('Skoda', 9000);
  4. INSERT INTO cars(name, price) VALUES('Volvo', 29000);
  5. INSERT INTO cars(name, price) VALUES('Bentley', 350000);
  6. INSERT INTO cars(name, price) VALUES('Citroen', 21000);
  7. INSERT INTO cars(name, price) VALUES('Hummer', 41400);
  8. INSERT INTO cars(name, price) VALUES('Volkswagen', 21600);

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

resources/logback.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <include resource="org/springframework/boot/logging/logback/base.xml" />
  4. <logger name="org.springframework" level="ERROR"/>
  5. <logger name="com.zetcode" level="DEBUG"/>
  6. <logger name="com.zaxxer.hikari" level="INFO"/>
  7. </configuration>

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

resources/application.yml

  1. datasource:
  2. hikari:
  3. minimum-idle: 1
  4. maximum-pool-size: 20
  5. jdbcUrl: jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE
  6. driverClassName: org.h2.Driver
  7. spring:
  8. main:
  9. banner-mode: "off"
  10. datasource:
  11. platform: h2

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

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

com/zetcode/config/AppConfig.java

  1. package com.zetcode.config;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. import org.springframework.boot.jdbc.DataSourceBuilder;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.context.annotation.Primary;
  7. import javax.sql.DataSource;
  8. @Configuration
  9. public class AppConfig {
  10. @Bean
  11. @Primary
  12. @ConfigurationProperties(prefix = "datasource")
  13. public DataSource dataSource() {
  14. return DataSourceBuilder.create().build();
  15. }
  16. }

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

com/zetcode/MyRunner.java

  1. package com.zetcode;
  2. import com.zetcode.model.Car;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.boot.CommandLineRunner;
  5. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  6. import org.springframework.jdbc.core.JdbcTemplate;
  7. import org.springframework.stereotype.Component;
  8. @Component
  9. public class MyRunner implements CommandLineRunner {
  10. @Autowired
  11. private JdbcTemplate jdbcTemplate;
  12. @Override
  13. public void run(String... args) {
  14. var sql = "SELECT * FROM cars";
  15. var cars = jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance(Car.class));
  16. for (Car car: cars) {
  17. System.out.println(car);
  18. }
  19. }
  20. }

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

  1. @Autowired
  2. private JdbcTemplate jdbcTemplate;

注入JdbcTemplate

  1. var sql = "SELECT * FROM cars";

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

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

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

  1. for (Car car: cars) {
  2. System.out.println(car);
  3. }

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

com/zetcode/Application.java

  1. package com.zetcode;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Application {
  6. public static void main(String[] args) {
  7. SpringApplication.run(Application.class, args);
  8. }
  9. }

Application设置 Spring Boot 应用。

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

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

在本教程中,我们在 Spring Boot 控制台应用中使用了 DataSourceBuilder。 您可能也对这些相关教程感兴趣: Spring Boot MySQL 教程Spring Boot PostgreSQL 教程Spring Boot H2 教程Java 教程或列出所有 Spring Boot 教程