1.介绍
Java H2 是一个用 Java 编写的轻量级、开源的关系型数据库。它以其体积小、性能高、易于使用而闻名,常被用于开发和测试环境中,也适用于特定的生产环境。H2 数据库支持内存存储模式,这意味着数据可以直接存储在内存中,从而提供快速的数据访问速度。此外,H2 还支持磁盘持久化存储。
H2 的主要特点包括:
-
内存数据库:H2 可以将数据存储在内存中,提供比基于磁盘的数据库更快的数据访问速度。但如有需要,也可以将数据持久化存储在磁盘上。
-
JDBC API 支持:H2 支持 Java 数据库连接(JDBC)API,使其能够兼容广泛的 Java 应用程序。
-
SQL 支持:H2 提供了广泛的 SQL 支持,包括许多标准 SQL 功能和一些特定的自定义增强功能。
-
Web 控制台:H2 提供了一个基于网络的控制台,用于数据库管理,方便执行 SQL 查询和进行数据库操作。
-
嵌入式和服务器模式:在嵌入式模式中,数据库在您的应用程序内运行;在服务器模式中,它作为一个单独的进程运行,可以被多个应用程序访问。
-
跨平台:作为 Java 应用程序,H2 是跨平台的,可以在任何支持 Java 的系统上运行。
在 Java 项目中使用 H2,通常需要在项目的构建文件(如 Maven 或 Gradle)中添加它作为依赖。之后,您可以通过 JDBC 连接到 H2 数据库,创建表格、插入数据和执行查询,就像使用任何其他 SQL 数据库一样。
1.1.官方网站、GitHub仓库、社区
-
官方网站: H2 的官方网站提供了关于这个数据库的详细信息,包括它的主要特性、使用方法和下载链接。您可以通过 H2 Database 官网 来获取这些信息。
-
GitHub 仓库: 在 GitHub 上,您可以找到 H2 数据库的源代码,以及关于其开发和维护的更多细节。这对于希望深入了解 H2 内部工作原理的开发者特别有用。访问 H2 GitHub 仓库 来了解更多。
-
GitHub 中文社区: 在 GitHub 中文社区,您可以找到有关 H2 数据库的信息,包括项目介绍和使用教程,这可能对讲中文的用户更加友好。您可以通过 GitHub 中文社区 来访问相关信息。
2.Java SpringBoot集成H2数据库并应用
2.1. 代码
2.1.1. pom文件
<?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>org.example</groupId> <artifactId>H2Demo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <!-- Spring Boot Starter Web, 包含了 Spring MVC --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.3.12.RELEASE</version> </dependency> <!-- Spring Boot Starter Data JPA, 用于数据库操作 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>2.3.12.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/com.h2database/h2 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.1.214</version> </dependency> </dependencies>
</project>
2.1.2.application.yml配置文件
server: port: 6610 maxHttpHeaderSize: 10240000
spring: datasource: # 内存存储
# url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1 # 文件存储 url: jdbc:h2:file:E:/demodb driverClassName: org.h2.Driver username: sa password: h2: console: enabled: true path: /h2-console jpa: show-sql: true hibernate: ddl-auto: update properties: hibernate: dialect: org.hibernate.dialect.H2Dialect
2.1.3.代码
package xiaocai; /** * @BelongsProject: H2Demo * @BelongsPackage: xiaocai * @Author: 蔡名洋 * @CreateTime: 2024-01-31 16:36 * @Description: TODO * @Version: 1.0 */import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication()
public class App { public static void main(String[] args) { System.setProperty("user.timezone", "GMT +08"); SpringApplication.run(App.class, args); }
}
package xiaocai.controller; /** * @BelongsProject: H2Demo * @BelongsPackage: xiaocai.controller * @Author: 蔡名洋 * @CreateTime: 2024-01-31 16:38 * @Description: TODO * @Version: 1.0 */import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import xiaocai.entity.Person;
import xiaocai.repository.PersonRepository; import java.util.List; @RestController
@RequestMapping("/persons")
public class PersonController { @Autowired private PersonRepository personRepository; @GetMapping(value = "getAllPersons") public List<Person> getAllPersons() { return (List<Person>) personRepository.findAll(); } @PostMapping public Person addPerson(@RequestBody Person person) { return personRepository.save(person); }
}
package xiaocai.entity; import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id; /** * @BelongsProject: H2Demo * @BelongsPackage: xiaocai.entity * @Author: 蔡名洋 * @CreateTime: 2024-01-31 16:37 * @Description: TODO * @Version: 1.0 */@Entity
public class Person { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private int age; 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 getAge() { return age; } public void setAge(int age) { this.age = age; }
}
package xiaocai.repository; /** * @BelongsProject: H2Demo * @BelongsPackage: xiaocai.repository * @Author: 蔡名洋 * @CreateTime: 2024-01-31 16:37 * @Description: TODO * @Version: 1.0 */import org.springframework.data.repository.CrudRepository;
import xiaocai.entity.Person; public interface PersonRepository extends CrudRepository<Person, Long> {
}
2.1.4.运行效果
http://localhost:6610/h2-console
localhost:6610/persons/getAllPersons
[{"id": 1,"name": "1","age": 1},{"id": 2,"name": "2","age": 2},{"id": 3,"name": "3","age": 3}
]
3.重要的点
3.1.内存和物理存储
# 内存存储
# url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1 # 文件存储 url: jdbc:h2:file:E:/demodb