什么是内存数据库

内存数据库依赖于系统内存而不是磁盘空间来存储数据。由于内存访问比磁盘访问更快,因此在不需要持久化数据时可以使用内存数据库。内存数据库是嵌入式数据库。内存数据库默认情况下是易失性的,当我们重新启动应用程序时,所有存储的数据都会丢失。

广泛使用的内存数据库包括 H2、HSQLDB(HyperSQL Database) 和 Apache Derby。它们会自动创建配置。

持久化 vs 内存数据库

持久化数据库将数据持久保存在物理内存中。即使数据库服务器重新启动,数据也将可用。一些常用的持久化数据库包括 [Oracle]、[MySQL]、[Postgres] 等。

在内存数据库的情况下,数据存储在系统内存中。当程序关闭时,数据会丢失。它对于概念验证(Proof of Concepts)很有帮助,但不适用于生产应用程序。广泛使用的内存数据库是 H2

什么是 H2 数据库

H2 是一种 嵌入式、开源内存 数据库。它是用 [Java] 编写的关系型数据库管理系统。它是一个 客户端/服务器 应用程序。通常用于 单元测试。它将数据存储在内存中,而不是将数据持久化到磁盘上。

优点

  • 零配置
  • 易于使用
  • 轻量且快速
  • 提供简单的配置以在真实数据库和内存数据库之间切换
  • 支持标准的 SQL 和 JDBC API
  • 提供 Web 控制台来维护数据库

配置 H2 数据库

如果我们想在应用程序中使用 H2 数据库,我们需要在 pom.xml 文件中添加以下依赖项:

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

在添加依赖项之后,我们需要在 application.properties 文件中配置 H2 数据库的 数据源 URL、驱动类名、用户名密码。Spring Boot 在 application.properties 文件中提供了一种简单的方式来配置这些属性。

spring.datasource.url=jdbc:h2:mem:testdb  
spring.datasource.driverClassName=org.h2.Driver  
spring.datasource.username=sa  
spring.datasource.password=  
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect  

在上面的配置中,mem 是内存数据库的名称,testdb 是 H2 默认提供的模式名称。我们也可以定义自己的模式和数据库。默认的用户名是 sa,空密码表示空密码。如果要更改用户名和密码,我们可以覆盖这些值。

在 H2 数据库中持久化数据

如果要在 H2 数据库中持久化数据,我们应该将数据存储在文件中。为了实现这一点,我们需要更改数据源的 URL 属性。

#persist the data  
spring.datasource.url=jdbc:h2:file:/data/sampledata  
spring.datasource.url=jdbc:h2:C:/data/sampledata  

在上面的属性中,sampledata 是文件名。

创建模式并填充数据

我们可以通过在资源文件夹(src/main/resources)中创建 SQL 文件来定义模式。

schema.sql

DROP TABLE IF EXISTS CITY;  
CREATE TABLE CITY (  
City_code INT AUTO_INCREMENT  PRIMARY KEY,  
city_name VARCHAR(50) NOT NULL,  
city_pincode INT(8) NOT NULL  
);  

我们可以通过在资源文件夹(src/main/resources)中创建 SQL 文件来填充表中的数据。

data.sql

INSERT INTO CITY VALUES (11, 'Delhi', 110001);    
INSERT INTO CITY VALUES (12, 'Kanpur', 208001);    
INSERT INTO CITY VALUES (13, 'Lucknow', 226001);    

Spring Boot 在应用程序启动时会自动运行 data.sql 文件,并在 H2 数据库中执行它。

H2 控制台

默认情况下,H2 数据库的控制台视图是禁用的。在访问 H2 数据库之前,我们必须通过以下属性将其启用。

#enabling the H2 console  
spring.h2.console.enabled=true  

启用 H2 控制台后,我们可以在浏览器中通过访问 URL http://localhost:8080/h2-console 来访问 H2 控制台。下面的图片显示了 H2 数据库的控制台视图。

7bb7a50ade96d0003a8ca39c6a453d1.png

在上面的截图中,我们定义了一个名为 javatiku 的数据库。

Spring Boot H2 示例

让我们创建一个带有 H2 数据库的 Spring Boot 应用程序。

步骤 1: 打开 Spring Initializr [http://start.spring.io](http://start.spring.io/)

步骤 2: 选择 Spring Boot 版本 2.3.0.M1

步骤 3: 提供 Group 名称。我们提供了 cn.javatiku

步骤 4: 提供 Artifact Id。我们提供了 spring-boot-h2-database-example

步骤 5: 添加依赖项 Spring Web、Spring Data JPAH2 Database

步骤 6: 点击 Generate 按钮。点击生成按钮后,它会将项目打包成一个 Jar 文件并下载到本地系统。

075a1b5593c584bd824be72ab1753c4.png

步骤 7: 解压 Jar 文件并将其粘贴到 STS 工作区。

步骤 8: 将项目文件夹导入到 STS。

File -> Import -> Existing Maven Projects -> Browse -> 选择文件夹 spring-boot-h2-database-example -> 完成

导入需要一些时间。

步骤 9:src/main/java 文件夹中创建一个名为 cn.javatiku.model 的包。

步骤 10: 在包 cn.javatiku.model 中创建一个模型类。我们创建了一个名为 Student 的模型类。在 Student 类中,我们做了以下操作:

  • 定义了四个变量:id、age、nameemail
  • 生成了 Getter 和 Setter 方法 右键单击文件 -> Source -> Generate Getters and Setters
  • 使用注解 @Entity 将类标记为实体
  • 使用注解 @Table 将类标记为表名
  • 使用注解 @Column 将每个变量定义为列

Student.java

package cn.javatiku.model;  
import javax.persistence.Column;  
import javax.persistence.Entity;  
import javax.persistence.Id;  
import javax.persistence.Table;  
//mark class as an Entity   
@Entity  
//defining class name as Table name  
@Table  
public class Student   
{  
//mark id as primary key  
@Id  
//defining id as column name  
@Column  
private int id;  
//defining name as column name  
@Column  
private String name;  
//defining age as column name  
@Column  
private int age;  
//defining email as column name  
@Column  
private String email;  
public int getId()   
{  
return id;  
}  
public void setId(int 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;  
}  
public String getEmail()   
{  
return email;  
}  
public void setEmail(String email)   
{  
this.email = email;  
}  
}  

步骤 11:src/main/java 文件夹中创建一个名为 cn.javatiku.controller 的包。

步骤 12: 在包 cn.javatiku.controller 中创建一个控制器类。我们创建了一个名为 StudentController 的控制器类。在 StudentController 类中,我们做了以下操作:

  • 使用注解 @RestController 将类标记为 RestController
  • 使用注解 @Autowired 自动装配 StudentService
  • 定义了以下方法:

    • getAllStudent(): 返回所有学生的列表
    • getStudent(): 返回指定路径变量中指定的学生详细信息。我们使用注解 @PathVariable 传递了 id 参数。该注解表示方法参数应绑定到 URI 模板变量。
    • deleteStudent(): 删除指定路径变量中的特定学生
    • saveStudent(): 保存学生的详细信息。注解 @RequestBody 表示方法参数应绑定到 web 请求的主体。

StudentController.java

package cn.javatiku.controller;  
import java.util.List;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.DeleteMapping;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.PathVariable;  
import org.springframework.web.bind.annotation.PostMapping;  
import org.springframework.web.bind.annotation.RequestBody;  
import org.springframework.web.bind.annotation.RestController;  
import cn.javatiku.model.Student;  
import cn.javatiku.service.StudentService;  
//creating RestController  
@RestController  
public class StudentController   
{  
//autowired the StudentService class  
@Autowired  
StudentService studentService;  
//creating a get mapping that retrieves all the students detail from the database   
@GetMapping("/student")  
private List<Student> getAllStudent()   
{  
return studentService.getAllStudent();  
}  
//creating a get mapping that retrieves the detail of a specific student  
@GetMapping("/student/{id}")  
private Student getStudent(@PathVariable("id") int id)   
{  
return studentService.getStudentById(id);  
}  
//creating a delete mapping that deletes a specific student  
@DeleteMapping("/student/{id}")  
private void deleteStudent(@PathVariable("id") int id)   
{  
studentService.delete(id);  
}  
//creating post mapping that post the student detail in the database  
@PostMapping("/student")  
private int saveStudent(@RequestBody Student student)   
{  
studentService.saveOrUpdate(student);  
return student.getId();  
}  
}  

步骤 13:src/main/java 文件夹中创建一个名为 cn.javatiku.service 的包。

步骤 14: 在包 cn.javatiku.service 中创建一个 Service 类。我们创建了一个名为 StudentServiceService 类。在 StudentService 类中,我们做了以下操作:

  • 使用注解 @Service 将类标记为 Service
  • 自动装配 StudentRepository
  • 定义了以下方法:

    • getAllStudent(): 获取所有学生记录
    • getStudentById(): 获取特定记录
    • saveOrUpdate(): 保存或更新记录
    • delete(): 删除特定记录

StudentService.java

package cn.javatiku.service;  
import java.util.ArrayList;  
import java.util.List;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Service;  
import cn.javatiku.model.Student;  
import cn.javatiku.repository.StudentRepository;  
@Service  
public class StudentService   
{  
@Autowired  
StudentRepository studentRepository;  
//getting all student records  
public List<Student> getAllStudent()   
{  
List<Student> students = new ArrayList<Student>();  
studentRepository.findAll().forEach(student -> students.add(student));  
return students;  
}  
//getting a specific record  
public Student getStudentById(int id)   
{  
return studentRepository.findById(id).get();  
}  
public void saveOrUpdate(Student student)   
{  
studentRepository.save(student);  
}  
//deleting a specific record  
public void delete(int id)   
{  
studentRepository.deleteById(id);  
}  
}  

步骤 15:src/main/java 文件夹中创建一个名为 cn.javatiku.repository 的包。

步骤 16: 在包 cn.javatiku.repository 中创建一个 Repository 接口。我们创建了一个名为 StudentRepositoryRepository 接口。它扩展了 Crud Repository 接口。

StudentRepository.java

package cn.javatiku.repository;  
import org.springframework.data.repository.CrudRepository;  
import cn.javatiku.model.Student;  
public interface StudentRepository extends CrudRepository<Student, Integer>  
{  
}  

现在,我们将在 application.properties 文件中配置数据源的 URL、驱动程序类名称、用户名密码

步骤 17: 打开 application.properties 文件并配置以下属性。

application.properties

spring.datasource.url=jdbc:h2:mem:javatiku
spring.datasource.driverClassName=org.h2.Driver  
spring.datasource.username=sa  
spring.datasource.password=  
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect  
#enabling the H2 console  
spring.h2.console.enabled=true

在创建所有类和包后,项目目录看起来如下。

295ae0ae5469d2adc8f43f4ed4477aa.png

现在,我们将运行应用程序。

步骤 18: 打开 SpringBootH2DatabaseExampleApplication.java 文件,并将其作为 Java 应用程序运行。

SpringBootH2DatabaseExampleApplication.java

package cn.javatiku;  
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
@SpringBootApplication  
public class SpringBootH2DatabaseExampleApplication   
{  
public static void main(String[] args)   
{  
SpringApplication.run(SpringBootH2DatabaseExampleApplication.class, args);  
}  
}  

在下一步中,我们将使用 Rest 客户端 Postman 发送 POSTGET 请求。如果您的系统中尚未安装 Postman,请按照以下步骤操作:

  • https://www.getpostman.com/downloads/ 下载 Postman 或在浏览器中添加 Google Chrome 扩展 https://bit.ly/1HCOCwF
  • 启动 Postman 并进行 注册。创建用户名。我们创建了名为 javatiku 的用户并点击了 Submit

步骤 19: 打开 Postman 并执行以下操作:

  • 选择 POST
  • 调用 URL http://localhost:8080/student
  • 选择 Body
  • 选择内容类型为 JSON (application/json)
  • 在主体中插入数据。我们在主体中插入了以下数据:
{  
    "id": "001",  
    "age": "23",  
    "name": "Amit",  
    "email": "amit@yahoo.co.in"  
}   
  • 点击 Send

当请求成功执行时,它会显示 Status:200 OK。这意味着记录已成功插入数据库。

类似地,我们还插入了以下数据。

{  
    "id": "002",  
    "age": "24",  
    "name": "Vadik",  
    "email": "vadik@yahoo.co.in"  
}   
{  
    "id": "003",  
    "age": "21",  
    "name": "Prateek",  
    "email": "prateek@yahoo.co.in"  
}   
{  
    "id": "004",  
    "age": "25",  
    "name": "Harsh",  
    "email": "harsh@yahoo.co.in"  
}   
{  
    "id": "005",  
    "age": "24",  
    "name": "Swarit",  
    "email": "Swarit@yahoo.co.in"  
}   

让我们访问 H2 控制台以查看数据。

步骤 20: 打开浏览器,调用 URL http://localhost:8080/h2-console。点击 Connect 按钮,如下所示。

8c580971466b61abbd4eb30cd186ea3.png

点击 Connect 按钮后,我们在数据库中看到了 Student 表,如下所示。

81901364a4916b9e85c581a498ecdd4.png

步骤 21: 点击 Student 表,然后点击 Run 按钮。该表显示了我们在主体中插入的数据。

bb3447fea50dabc0762dadab8b7a0ff.png

步骤 22: 打开 Postman 并发送一个 GET 请求。它返回我们在数据库中插入的数据。

e8acb36b48219caaee06c7d91db31e2.png

让我们发送一个带有 URL http://localhost:8080/student/{id}GET 请求。我们调用了 URL http://localhost:8080/student/3。它返回了 id 为 3 的学生的详细信息。

25d1223db1df37470ceecf28e9593d8.png

类似地,我们也可以发送 DELETE 请求。假设我们要删除 id 为 2 的学生记录。

要删除学生记录,请发送带有 URL http://localhost:8080/student/2DELETE 请求。它会返回 Status:200 OK,这意味着记录已成功删除。

通过这个例子,您了解了如何在 Spring Boot 应用程序中使用 H2 数据库。这个示例中,我们创建了一个简单的学生信息管理系统,通过 RESTful API 来执行基本的 GET、POSTDELETE 操作。
c936cf815c7e850ecb6108bf9afa44f.png

标签: spring, Spring教程, Spring语言学习, Spring框架, Spring框架教程, Spring框架高级教程, spring boot, spring boot入门教程, spring boot学习教程, spring boot下载, spring boot框架入门, spring boot面试题, spring boot笔试题, spring boot学习指南, spring boot技术