1,H2数据库

H2数据库是一种轻量级的、嵌入式的关系型数据库管理系统(RDBMS),它被设计用于嵌入到Java应用程序中。H2数据库以纯Java代码的形式实现,因此它不需要外部的数据库服务器或独立的进程来运行,可以直接作为Java类库嵌入到应用程序中,或者以服务器模式在网络上提供服务。H2数据库的重要特性:

  • 嵌入式数据库H2数据库的一个主要特点是它可以嵌入到Java应用程序中,不需要额外的数据库服务器。这使得它非常适合那些需要在应用程序中本地存储数据的场景,比如桌面应用程序或移动应用。

  • 内存数据库H2数据库支持将数据存储在内存中,这可以提供快速的数据访问速度。内存数据库适用于一些需要高性能且临时存储数据的应用场景。

  • 支持多种数据类型H2数据库支持多种标准的SQL数据类型,包括整数、浮点数、日期时间、字符串等。

  • 支持ACID事务H2数据库支持ACID(原子性、一致性、隔离性、持久性)事务,确保数据在并发访问和异常情况下保持一致性和完整性。

  • 内置函数和存储过程:H2数据库内置了许多常用的SQL函数和存储过程,使开发人员可以更方便地进行数据处理和计算。

  • 支持多种索引类型H2数据库支持多种索引类型,包括B树索引和哈希索引,可以提高查询性能。

  • 支持高级特性:H2数据库还支持一些高级特性,如全文搜索、自动递增列、外键约束等。

  • 开源免费H2数据库是开源的,遵循Mozilla Public License 2.0(MPL 2.0)许可协议,可以免费使用和分发。

H2数据库的重要用途:

  • 快速原型开发 :在项目初期,可能只关心业务逻辑的实现,而不想花费过多精力在数据库的搭建和维护上。

  • 单元测试:启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态。
  • 作为中间缓存:当某些场景下数据模型必须为关系型,可以拿它充当Memcached使用,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表。

数据库连接URL:

TopicURL
嵌入式(本地)连接

jdbc:h2:[file:][<path>]<databaseName>

jdbc:h2:~/test

jdbc:h2:file:/data/sample

jdbc:h2:file:C:/data/sample (Windows only)

内存数据库(私有)jdbc:h2:mem:
内存数据库(被命名)jdbc:h2:mem:<databaseName>
jdbc:h2:mem:test
仅打开存在的数据库jdbc:h2:<url>;IFEXISTS=TRUE
jdbc:h2:file:~/sample;IFEXISTS=TRUE
用户名和密码jdbc:h2:<url>[;USER=<username>][;PASSWORD=<value>]
jdbc:h2:file:~/sample;USER=sa;PASSWORD=123

2,H2数据库原理

【常用特性】

  • 多模式兼容:H2 支持多种数据库模式,如 MySQL、PostgreSQL 等。这意味着你可以轻松地将项目从其他数据库迁移到 H2 数据库,或从
    H2 数据库迁移到其他数据库。
  • 内置 Web 控制台:H2 提供了一个内置的 Web 控制台,用于管理数据库、执行 SQL 语句等。在 application.properties文件中添加以下配置即可启用,启动项目后,访问 http://localhost:8080/h2-console 即可使用 H2 Web 控制台。
spring.h2.console.enabled=true

【注意事项】

  • 内存型数据库数据易失:内存型 H2 数据库的数据存储在内存中,当应用程序关闭后,数据会丢失。因此,在生产环境中慎用内存型

    H2 数据库。

  • 数据库版本管理:在使用 H2 数据库时,务必关注数据库版本。不同版本的 H2 数据库可能存在兼容性问题,可能导致应用程序无法正常运行。

【基本原理】

  • H2 数据库通过纯 Java 代码实现了 SQL 数据库的功能。在 Spring Boot 项目中, 我们通过添加 H2 数据库的依赖,Spring Boot 会自动检测到 H2 数据库并进行相应的自动配置。这些自动配置包括创建 DataSource Bean、自动配置 JPA 等。当我们在项目中使用 JPA 进行数据库操作时,Spring Boot 会自动使用 H2 数据库进行数据存储。
  • 为了让 H2 数据库能够与 Spring Boot 更好地集成,我们需要在 application.properties 文件中配置数据源、驱动类名等信息。这样,SpringBoot 就能够根据这些信息来自动创建相应的数据库连接池、JPA 配置等。
  • 此外,H2 数据库还提供了一些扩展特性,如内置 Web 控制台、多模式兼容等。这些特性可以帮助我们更轻松地管理和使用 H2 数据库。

3,SpringBoot整合H2数据库 

Spring Boot 整合 H2 数据库:

  • pom.xml & application.properties
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.10</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
   <modelVersion>4.0.0</modelVersion>
    <groupId>com.nudt</groupId>
    <artifactId>H2DB</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>H2DB</name>
    <description>H2DB</description>
    <properties>
        <java.version>11</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.12.RELEASE</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test
spring.datasource.username=sa
spring.datasource.password=

spring.sql.init.mode=always
spring.sql.init.schema-locations=classpath:/sql/schema.sql
spring.sql.init.data-locations=classpath:/sql/data.sql
  • data.sql & schema.sql
INSERT INTO `student` VALUES ('0', '张三', 20);
INSERT INTO `student` VALUES ('1', '少杰', 20);
INSERT INTO `student` VALUES ('10', '赵子龙', NULL);
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`
(
    `id`   int,
    `name` varchar(225) ,
    `age`  int
);
  • H2DbApplication & Student & StudentController & StudentRepository
@SpringBootApplication
public class H2DbApplication {
    public static void main(String[] args) {
        SpringApplication.run(H2DbApplication.class, args);
    }
}
@Entity
@Table(name ="STUDENT")
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Student implements Serializable {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private Integer age;
}
@RequestMapping("/student")
@Controller()
public class StudentController {

    @Resource
    StudentRepository studentRepository;

    @ResponseBody
    @RequestMapping("/")
    public String root(){
        Student student= new Student(2,"小明", 18);
        studentRepository.save(student);
        System.out.println(student);
        return student.toString();
    }

    @ResponseBody
    @RequestMapping("/delete/{id}")
    public String delete(@PathVariable Integer id){
        Optional<Student> s = studentRepository.findById(id);
        studentRepository.deleteById(id);
        return s.get().toString() + "已经被删除";
    }

    @ResponseBody
    @RequestMapping("/update/{id}/{name}")
    public String update(@PathVariable Integer id, @PathVariable String name){
        /*获取以后,再重新赋值 其实有其他更好的办法*/
        Student student = studentRepository.findById(id).get();
        student.setName(name);
        studentRepository.save(student);
        return student.toString();
    }

    @ResponseBody
    @RequestMapping("/{id}")
    public String find(@PathVariable Integer id) {
        Optional<Student> s = studentRepository.findById(id);
        return s.get().toString();
    }
    @ResponseBody
    @RequestMapping("/findAll")
    public void findAll() {
        ArrayList<Student> s = (ArrayList<Student>) studentRepository.findAll();
        for (int i =0;i<s.size();i++){
            System.out.println(s.get(i).getName());
        }
    }
}
public interface StudentRepository extends JpaRepository<Student, Integer> {}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐