原文: http://zetcode.com/spring/embeddeddatabasebuilder/

Spring EmbeddedDatabaseBuilder教程展示了如何使用EmbeddedDatabaseBuilder在 Spring 应用中创建 H2 嵌入式数据库。

Spring 是流行的 Java 应用框架。

EmbeddedDatabaseBuilder

EmbeddedDatabaseBuilder是一个 Spring 构建器,它提供方便的 API 在 Spring 应用中创建嵌入式数据库。

Spring EmbeddedDatabaseBuilder示例

以下示例使用EmbeddedDatabaseBuilder构建嵌入式 H2 数据库。 我们使用 Spring JdbcTemplate与数据库进行交互。

  1. pom.xml
  2. src
  3. ├───main
  4. ├───java
  5. └───com
  6. └───zetcode
  7. Application.java
  8. ├───config
  9. DBConfig.java
  10. └───model
  11. Car.java
  12. └───resources
  13. logback.xml
  14. └───db
  15. create-db.sql
  16. insert-data.sql
  17. └───test
  18. └───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>embeddeddatabasebuilderex</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. <maven.compiler.source>11</maven.compiler.source>
  13. <maven.compiler.target>11</maven.compiler.target>
  14. <spring-version>5.1.3.RELEASE</spring-version>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>com.h2database</groupId>
  19. <artifactId>h2</artifactId>
  20. <version>1.4.197</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>ch.qos.logback</groupId>
  24. <artifactId>logback-classic</artifactId>
  25. <version>1.2.3</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework</groupId>
  29. <artifactId>spring-context</artifactId>
  30. <version>${spring-version}</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework</groupId>
  34. <artifactId>spring-core</artifactId>
  35. <version>${spring-version}</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework</groupId>
  39. <artifactId>spring-jdbc</artifactId>
  40. <version>${spring-version}</version>
  41. </dependency>
  42. </dependencies>
  43. <build>
  44. <plugins>
  45. <plugin>
  46. <groupId>org.codehaus.mojo</groupId>
  47. <artifactId>exec-maven-plugin</artifactId>
  48. <version>1.6.0</version>
  49. <configuration>
  50. <mainClass>com.zetcode.Application</mainClass>
  51. </configuration>
  52. </plugin>
  53. </plugins>
  54. </build>
  55. </project>

这是我们 Spring 应用的 Maven 构建文件。

resources/logback.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <logger name="org.springframework" level="ERROR"/>
  4. <logger name="com.zetcode" level="INFO"/>
  5. <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
  6. <encoder>
  7. <Pattern>%d{HH:mm:ss.SSS} %blue(%-5level) %magenta(%logger{36}) - %msg %n
  8. </Pattern>
  9. </encoder>
  10. </appender>
  11. <root>
  12. <level value="INFO" />
  13. <appender-ref ref="consoleAppender" />
  14. </root>
  15. </configuration>

这是 Logback 配置文件。

EmbeddedDatabaseBuilder将使用以下两个 SQL 脚本来创建cars表并将数据插入其中。

resources/db/schema.sql

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

schema.sql创建数据库表。

resources/db/data.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);

data.sql将数据插入表中。

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 Long getId() {
  8. return id;
  9. }
  10. public void setId(Long id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public int getPrice() {
  20. return price;
  21. }
  22. public void setPrice(int price) {
  23. this.price = price;
  24. }
  25. @Override
  26. public boolean equals(Object o) {
  27. if (this == o) return true;
  28. if (o == null || getClass() != o.getClass()) return false;
  29. Car car = (Car) o;
  30. return price == car.price &&
  31. Objects.equals(id, car.id) &&
  32. Objects.equals(name, car.name);
  33. }
  34. @Override
  35. public int hashCode() {
  36. return Objects.hash(id, name, price);
  37. }
  38. @Override
  39. public String toString() {
  40. final StringBuilder sb = new StringBuilder("Car{");
  41. sb.append("id=").append(id);
  42. sb.append(", name='").append(name).append('\'');
  43. sb.append(", price=").append(price);
  44. sb.append('}');
  45. return sb.toString();
  46. }
  47. }

这是一个Car类。

com/zetcode/config/DBConfig.java

  1. package com.zetcode.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.jdbc.core.JdbcTemplate;
  5. import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
  6. import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
  7. import javax.sql.DataSource;
  8. @Configuration
  9. public class DBConfig {
  10. @Bean
  11. public DataSource dataSource() {
  12. var builder = new EmbeddedDatabaseBuilder();
  13. var db = builder
  14. .setType(EmbeddedDatabaseType.H2) // HSQL or DERBY
  15. .addScript("db/schema.sql")
  16. .addScript("db/data.sql")
  17. .build();
  18. return db;
  19. }
  20. @Bean
  21. public JdbcTemplate createJdbcTeamplate() {
  22. var template = new JdbcTemplate();
  23. template.setDataSource(dataSource());
  24. return template;
  25. }
  26. }

DBConfig使用EmbeddedDatabaseBuilder创建嵌入式 H2 数据库。 我们还创建了一个JdbcTemplate bean。

  1. @Bean
  2. public DataSource dataSource() {
  3. var builder = new EmbeddedDatabaseBuilder();
  4. var db = builder
  5. .setType(EmbeddedDatabaseType.H2) // HSQL or DERBY
  6. .addScript("db/schema.sql")
  7. .addScript("db/data.sql")
  8. .build();
  9. return db;
  10. }

该方法使用EmbeddedDatabaseBuilderbuild()方法创建数据源。 我们使用setType()指定数据库类型,并使用addScript()方法添加 SQL 脚本。

  1. @Bean
  2. public JdbcTemplate createJdbcTeamplate() {
  3. var template = new JdbcTemplate();
  4. template.setDataSource(dataSource());
  5. return template;
  6. }

此方法生成一个新的JdbcTemplate。 我们使用setDataSource()将生成的数据源设置为模板。

com/zetcode/Application.java

  1. package com.zetcode;
  2. import com.zetcode.model.Car;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  7. import org.springframework.context.annotation.ComponentScan;
  8. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  9. import org.springframework.jdbc.core.JdbcTemplate;
  10. @ComponentScan(basePackages = "com.zetcode")
  11. public class Application {
  12. private static final Logger logger = LoggerFactory.getLogger(Application.class);
  13. public static void main(String[] args) {
  14. var ctx = new AnnotationConfigApplicationContext(Application.class);
  15. var app = ctx.getBean(Application.class);
  16. app.run();
  17. ctx.close();
  18. }
  19. @Autowired
  20. private JdbcTemplate jdbcTemplate;
  21. private void run() {
  22. var sql = "SELECT * FROM cars";
  23. var cars = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Car.class));
  24. cars.forEach(car -> logger.info("{}", car));
  25. }
  26. }

在应用中,我们执行查询以查找所有汽车。

  1. @Autowired
  2. private JdbcTemplate jdbcTemplate;

注入了JdbcTemplate bean。

  1. var cars = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Car.class));

使用JdbcTemplatequery()方法执行 SQL 查询。

  1. cars.forEach(car -> logger.info("{}", car));

检索到的汽车将写入控制台。

  1. $ mvn -q exec:java
  2. 19:13:35.753 INFO com.zetcode.Application - Car{id=1, name='Audi', price=52642}
  3. 19:13:35.768 INFO com.zetcode.Application - Car{id=2, name='Mercedes', price=57127}
  4. 19:13:35.768 INFO com.zetcode.Application - Car{id=3, name='Skoda', price=9000}
  5. 19:13:35.768 INFO com.zetcode.Application - Car{id=4, name='Volvo', price=29000}
  6. 19:13:35.768 INFO com.zetcode.Application - Car{id=5, name='Bentley', price=350000}
  7. 19:13:35.768 INFO com.zetcode.Application - Car{id=6, name='Citroen', price=21000}
  8. 19:13:35.768 INFO com.zetcode.Application - Car{id=7, name='Hummer', price=41400}
  9. 19:13:35.768 INFO com.zetcode.Application - Car{id=8, name='Volkswagen', price=21600}

我们运行该应用。

在本教程中,我们使用EmbeddedDatabaseBuilder在 Spring 应用中创建嵌入式 H2 数据库。

您可能也对相关教程感兴趣: JdbcTemplate教程Spring @ComponentScan教程Java 教程