应广大网友的要求,写了这么一篇文章。对于已经入门了童鞋来说的话,这个自然也就很简单了,对于刚刚入门的还是有点难度的,好吧,这里就简单介绍下。
内存数据库(Embedded database或in-momery database)具有配置简单、启动速度快、尤其是其可测试性等优点,使其成为开发过程中非常有用的轻量级数据库。在spring中支持HSQL、H2和Derby三种数据库。
哪个更好呢,我也不是很清楚,这里在官网找到了一个汇总(这个总结时间,没有体现出来,所以大家在做对比的时候,要小心,在百度上的对比资料都比较早了,所以不知道现在具体的都发展到什么程度了,在stackoverflow有这么一篇文章:Which is better H2 or HSQLDB,地址:http://stackoverflow.com/questions/2746201/which-is-better-h2-or-hsqldb )。
Pure Java (纯Java编写) |
Yes |
Yes |
Yes |
No |
No |
Memory Mode (支持内存模式) |
Yes |
Yes |
Yes |
No |
No |
Encrypted Database (支持数据库加密) |
Yes |
Yes |
Yes |
No |
No |
ODBC Driver (支持ODBC驱动) |
Yes |
No |
No |
Yes |
Yes |
Fulltext Search (支持全文搜索) |
Yes |
No |
No |
Yes |
Yes |
Multi Version Concurrency (支持多版本并发控制) |
Yes |
No |
Yes |
Yes |
Yes |
Footprint (jar/dll size) (体积) |
~1 MB |
~2 MB |
~1 MB |
~4 MB |
~6 MB |
具体地址:http://www.h2database.com/html/main.html
总的感觉H2很厉害的样子,既然是这样的话,我们先介绍H2的使用,然后在介绍HSQLDB的使用。
那么本节的大体思路是:
(1)新建一个maven java project;
(2)添加相关依赖;
(3)编写启动类;
(4)编写测试类;
(5)使用HSQLDB进行操作;
(6)显示SQL语句;
(7)实现h2数据库本地化;
接下来我们看下每个步骤具体的实现。
(1)新建一个maven java project;
新建一个spring-boot-h2工程。
(2)添加相关依赖;
在pom.xml文件添加相关依赖,核心的就是com.h2database,另外就是编码需要用到的spring-boot-starter-web(编写rest), spring-boot-starter-data-jpa(主要是使用@Entity管理实体类),具体的pom.xml文件如下:
<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>com.kfit</groupId>
<artifactId>spring-boot-h2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-boot-h2</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- jdk版本号,Angel在这里使用1.8,大家修改为大家本地配置的jdk版本号即可 -->
<java.version>1.8</java.version>
</properties>
<!--
spring boot 父节点依赖,
引入这个之后相关的引入就不需要添加version配置,
spring boot会自动选择最合适的版本进行添加。
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!-- spring boot web支持:mvc,aop... -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring data jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 内存数据库h2-->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
(3)编写启动类;
启动类代码我们已经写了不下100遍了,这里就不过多介绍,直接看源码:
package com.kfit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
*
* @author Angel --守护天使
* @version v.0.1
* @date 2016年9月5日
*/
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
(4)编写测试类;
以上可以说都是准备工作,到这里才是到了本节核心的地方,在具体提供源代码之前,先说一下具体的一个思路:我们这里要使用repository保存数据到h2数据库,我们需要提供一个实体类DemoInfo,其次就是具体的保存数据类DemoInfoRepository,再者就是DemoInfoController进行编码测试。你会发现我们这里根本没有配置jpa,h2配置文件之类的,这个就是spring boot强大之处,已经提供了很多默认的配置,让开发者能够快速编写一个hello例子。那么我们每个具体的代码:
实体类:com.kfit.demo.bean.DemoInfo:
package com.kfit.demo.bean;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class DemoInfo {
@Id@GeneratedValue
private long id;
private String title;
private String content;
public DemoInfo() {
}
public DemoInfo(String title, String content) {
this.title = title;
this.content = content;
}
public long getId() {
return id;
}
public void setId(longid) {
this.id = id;
}
public String getTitle() {
return title;
}
publicvoid setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
publicvoid setContent(String content) {
this.content = content;
}
}
DemoInfo的持久类:com.kfit.demo.repository.DemoInfoRepository
package com.kfit.demo.repository;
import org.springframework.data.repository.CrudRepository;
import com.kfit.demo.bean.DemoInfo;
public interface DemoInfoRepository extends CrudRepository<DemoInfo,Long>{
}
访问控制类:com.kfit.demo.web.DemoInfoController:
package com.kfit.demo.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.kfit.demo.bean.DemoInfo;
import com.kfit.demo.repository.DemoInfoRepository;
@RestController
public class DemoInfoController {
@Autowired
private DemoInfoRepository demoInfoRepository;
/**
* 保存数据.
* @return
*/
@RequestMapping("/save")
public String save(){
// 内存数据库操作
demoInfoRepository.save(new DemoInfo("title1", "content1"));
demoInfoRepository.save(new DemoInfo("title2", "content2"));
demoInfoRepository.save(new DemoInfo("title3", "content3"));
demoInfoRepository.save(new DemoInfo("title4", "content4"));
demoInfoRepository.save(new DemoInfo("title5", "content5"));
return "save ok";
}
/**
* 获取所有数据.
* @return
*/
@RequestMapping("/findAll")
public Iterable<DemoInfo> findAll(){
// 内存数据库操作
return demoInfoRepository.findAll();
}
}
这里提供两个访问方法/save,/findAll。
到这里基本的一个例子就编写完毕了,我们就可以启动App.java进行测试。
依次访问:
http://127.0.0.1:8080/findAll 此时没有数据;
http://127.0.0.1:8080/save 保存测试数据;
http://127.0.0.1:8080/findAll 会看到save进入的数据;
重新启动App.java,在访问:
http://127.0.0.1:8080/findAll 此时没有数据,说明了数据只保存在内存中,重启之后就释放了之前存入的数据。
(5)使用HSQLDB进行操作;
使用HSQLDB和H2代码基本一样是一样的,只是在添加依赖的时候不一样,修改pom.xml文件,去掉或者注释掉h2的依赖,引入hsqldb的依赖:
<!-- 内存数据库hsqldb -->
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>
运行程序,然后按照刚才的测试步骤进行测试即可看到效果。
有人肯定会有疑问,我们怎么确认spring boot确实使用了hsqldb呢?
最简单的方式就是观察控制台信息,你会看到如下相应信息:
H2对应信息:org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect;
HSQL对应信息:org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.HSQLDialect;
(6)显示SQL语句;
我们进行了save操作,但是没有看到相应的SQL打印,心里还是没有底的,那么怎么进行查看呢?很简单,只需要在src/main/resources/application.propeties文件中添加一个属性:
#显示SQL语句
spring.jpa.show-sql = true
当然这是JPA中的知识了,还有其它的一些配置,具体请看JPA对应的文章,这里就不在重复介绍了,关键也不是本节的重点啦。
(7)实现h2数据库本地化;
我们会发现程序一重新启动,数据就都不见了,有些时候,我们还是希望数据能一直存在的,那么问题就是h2如何实现本地化呢?
很简单需要配置下application.properties文件即可:
#指定一个绝对的路径;
#spring.datasource.url = jdbc:h2:file:D:\\test\\db\\testdb
#使用~标明位置;
spring.datasource.url = jdbc:h2:file:~/.h2/testdb
spring.datasource.username = sa
spring.datasource.password = sa
spring.datasource.driverClassName = org.h2.Driver
这里说明下,h2的路径中~的意思,"~"这个符号代表的就是当前登录到操作系统的用户对应的用户目录,我们具体的路径就是:C:\Users\Administrator.angel-PC\,所以在文件目录C:\Users\Administrator.angel-PC\.h2中就可以看到testdb.mv.db文件了。
到这里正常启动之后,启动程序,程序也能够正常运行,testdb.mv.db也会生成,但是重新启动之后直接访问findAll就是没有数据,难道是我们的本地化配置有问题嘛,其实不是这个主要是由于jpa导致的,jpa有一个表的生成省略,默认是启动的时候不管三七二十一就删除原来的表结构重新生成,所以我们需要调整下就是只进行更新,具体操作是在application.properties添加:
spring.jpa.hibernate.ddl-auto = update
à悟空学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
Spring Cloud视频:http://t.cn/A6ZagxSR
SpringBoot Shiro视频:http://t.cn/A6Zag7IV
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringData和JPA视频:http://t.cn/A6Zad1OH
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
Sharding-JDBC分库分表实战:http://t.cn/A6ZarrqS
分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr
相关推荐
例如,如果检测到`HSQLDB`在类路径中,就会自动配置内存数据库。 4. **Actuator** Actuator是Spring Boot提供的一种监控和管理应用的工具,可以查看应用健康状态、指标、环境信息等,有助于运维和诊断。 5. **...
例如,如果类路径下存在HSQLDB数据库,那么Spring Boot就会自动配置一个内存数据库。 3. **嵌入式Web服务器(Embedded Web Server)** Spring Boot支持内嵌Tomcat、Jetty或Undertow等Web服务器,开发者无需单独...
例如,如果你引入了`spring-boot-starter-data-jpa`,那么它将自动配置JPA和HSQLDB等数据库连接。 4. **Actuator**:这是一个用于生产环境的模块,提供了健康检查、指标收集、审计跟踪等功能,帮助监控和管理应用。...
例如,引入了`spring-boot-starter-data-jpa`,那么Spring Boot会自动配置JPA和HSQLDB数据库支持。 **5. RESTful API** 对于Web服务,Spring Boot通过`@RestController`注解创建RESTful API。`@RequestMapping`和`@...
例如,如果在类路径下发现`HSQLDB`,那么Spring Boot会自动配置一个内存数据库;如果发现了`@Controller`注解的类,它就会自动配置Spring MVC。 ### 二、起步依赖(Starter POMs) Spring Boot通过“起步依赖”概念...
- **下载与安装**:从官方网站获取最新版本的HsqlDB,解压缩后配置数据库路径和启动脚本。 - **启动数据库服务**:通过批处理脚本启动服务器,如`startServer.bat`,指定数据库名和实例。 - **创建表与导入数据**...
1. 数据源自动配置:支持多种数据库(如MySQL、PostgreSQL、H2等),自动配置数据源和JdbcTemplate或JPA。 2. JPA与Hibernate:Spring Boot 1.5.3.RELEASE对JPA和Hibernate的支持更加完善,包括实体管理、事务控制...
例如,如果项目中存在`HSQLDB`的jar,Spring Boot会自动配置一个内存数据库。 3. **嵌入式Web服务器**:Spring Boot支持内嵌Tomcat、Jetty或Undertow等Web服务器,无需额外部署,简化了开发流程。 4. **Actuator**...
例如,如果项目中有HSQLDB的依赖,Spring Boot会自动配置一个内存数据库。 2. **起步依赖(Starter POMs)**:Spring Boot的起步依赖简化了Maven或Gradle的配置,开发者只需引入如`spring-boot-starter-web`、`...
8. **数据访问**:Spring Boot简化了与各种数据库的交互,包括JPA、Hibernate和MyBatis等,同时也支持NoSQL数据库如MongoDB。 9. **安全**:通过Spring Security,Spring Boot提供了一套强大的安全框架,用于身份...
例如,如果检测到HSQLDB库,就会自动配置内存数据库;如果发现有Tomcat,就会自动配置嵌入式Web服务器。 3. **内嵌式Web服务器** 在Spring Boot中,开发者可以选择内嵌的Tomcat、Jetty或Undertow作为Web服务器,...
Spring Boot 是一个由 Pivotal Team 开发的...通过学习这个案例,开发者可以深入了解Spring Boot的特性和使用方式,同时掌握如何将EasyUI整合到Spring Boot应用中,创建出具备完整前端展示和后端业务逻辑的微服务系统。
《Spring Boot 中文指南》是针对Java开发人员的一份详细教程,主要讲解如何使用Spring Boot框架构建高效、简洁的应用程序。Spring Boot是Spring生态体系的一部分,它简化了Spring应用程序的初始设置和配置,使得...
2. **添加依赖**:在Maven或Gradle的配置文件中,添加所需的Starters,比如`spring-boot-starter-web`和`spring-boot-starter-data-jpa`等,来引入Web和数据库访问功能。 3. **编写主类**:创建一个包含`@...
《Spring Boot官方教程》是为初学者和有一定经验的开发者准备的一份详尽指南,它深入浅出地介绍了Spring Boot框架的核心概念和技术。Spring Boot以其快速启动、简化配置的特性,已经成为Java开发领域中的热门选择,...
例如,如果类路径下存在HSQLDB数据库的相关jar,Spring Boot会自动配置相应的数据源。 2. **起步依赖**:Spring Boot通过“起步依赖”(Starter POMs)来简化构建配置。比如,如果你想在项目中使用Thymeleaf模板...
例如,如果在类路径下发现了HSQLDB,那么它就会自动配置一个内存数据库。 3. **嵌入式Web服务器(Embedded Web Servers)** Spring Boot支持内嵌的Tomcat、Jetty或Undertow web服务器,允许开发者无需额外部署即可...
例如,如果你的类路径下有 `HSQLDB` 数据库,那么 Spring Boot 将自动配置相应的数据源。 3. **嵌入式服务器(Embedded Server)**:Spring Boot 支持嵌入式服务器,如 Tomcat 和 Jetty,无需额外安装和配置,方便...
例如,如果在类路径下发现 HSQLDB,Spring Boot 会自动配置内存数据库连接。 3. **内嵌Web服务器(Embedded Web Servers)** Spring Boot 支持内嵌Tomcat、Jetty或Undertow等Web服务器,这意味着你无需额外打包成...
总的来说,"嵌入式数据库H2开始服务"这个主题涵盖了H2数据库的基本概念、特点、使用方式以及源码分析,对于理解并应用H2数据库有着重要的指导作用。在实际开发中,掌握这些知识点将有助于提升开发效率和项目质量。