H2:SpringBoot整合内存数据库
H2数据库是一种轻量级的、嵌入式的关系型数据库管理系统(RDBMS),它被设计用于嵌入到Java应用程序中。H2数据库以纯Java代码的形式实现,因此它不需要外部的数据库服务器或独立的进程来运行,可以直接作为Java类库嵌入到应用程序中,或者以服务器模式在网络上提供服务。
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:
Topic URL 嵌入式(本地)连接 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> {}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)