`

87. Spring Boot使用内存数据库H2和HSQLDB【从零开始学Spring Boot】

阅读更多

 

 

 

应广大网友的要求,写了这么一篇文章。对于已经入门了童鞋来说的话,这个自然也就很简单了,对于刚刚入门的还是有点难度的,好吧,这里就简单介绍下。

       内存数据库(Embedded databasein-momery database)具有配置简单、启动速度快、尤其是其可测试性等优点,使其成为开发过程中非常有用的轻量级数据库。在spring中支持HSQLH2Derby三种数据库。

       哪个更好呢,我也不是很清楚,这里在官网找到了一个汇总(这个总结时间,没有体现出来,所以大家在做对比的时候,要小心,在百度上的对比资料都比较早了,所以不知道现在具体的都发展到什么程度了,在stackoverflow有这么一篇文章:Which is better H2 or HSQLDB,地址:http://stackoverflow.com/questions/2746201/which-is-better-h2-or-hsqldb )。

 

 

H2

Derby

HSQLDB

MySQL

PostgreSQL

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 201695

 */

@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进行操作;

       使用HSQLDBH2代码基本一样是一样的,只是在添加依赖的时候不一样,修改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

 

 

分享到:
评论
1 楼 qwfys200 2017-07-21  
回头试试。

相关推荐

    spring-boot-reference2018最新版

    例如,如果检测到`HSQLDB`在类路径中,就会自动配置内存数据库。 4. **Actuator** Actuator是Spring Boot提供的一种监控和管理应用的工具,可以查看应用健康状态、指标、环境信息等,有助于运维和诊断。 5. **...

    Spring Boot核心技术-笔记-pdf版.pdf

    例如,如果类路径下存在HSQLDB数据库,那么Spring Boot就会自动配置一个内存数据库。 3. **嵌入式Web服务器(Embedded Web Server)** Spring Boot支持内嵌Tomcat、Jetty或Undertow等Web服务器,开发者无需单独...

    Spring Boot应用开发框架 v2.6.14.zip

    例如,如果你引入了`spring-boot-starter-data-jpa`,那么它将自动配置JPA和HSQLDB等数据库连接。 4. **Actuator**:这是一个用于生产环境的模块,提供了健康检查、指标收集、审计跟踪等功能,帮助监控和管理应用。...

    spring boot入门的第一个项目

    例如,引入了`spring-boot-starter-data-jpa`,那么Spring Boot会自动配置JPA和HSQLDB数据库支持。 **5. RESTful API** 对于Web服务,Spring Boot通过`@RestController`注解创建RESTful API。`@RequestMapping`和`@...

    spring-boot-中文参考手册

    例如,如果在类路径下发现`HSQLDB`,那么Spring Boot会自动配置一个内存数据库;如果发现了`@Controller`注解的类,它就会自动配置Spring MVC。 ### 二、起步依赖(Starter POMs) Spring Boot通过“起步依赖”概念...

    Oracle数据库移植到HsqlDB操作手册.docx

    - **下载与安装**:从官方网站获取最新版本的HsqlDB,解压缩后配置数据库路径和启动脚本。 - **启动数据库服务**:通过批处理脚本启动服务器,如`startServer.bat`,指定数据库名和实例。 - **创建表与导入数据**...

    spring-boot-1.5.3.RELEASE

    1. 数据源自动配置:支持多种数据库(如MySQL、PostgreSQL、H2等),自动配置数据源和JdbcTemplate或JPA。 2. JPA与Hibernate:Spring Boot 1.5.3.RELEASE对JPA和Hibernate的支持更加完善,包括实体管理、事务控制...

    Spring Boot核心技术-笔记-pdf版.zip

    例如,如果项目中存在`HSQLDB`的jar,Spring Boot会自动配置一个内存数据库。 3. **嵌入式Web服务器**:Spring Boot支持内嵌Tomcat、Jetty或Undertow等Web服务器,无需额外部署,简化了开发流程。 4. **Actuator**...

    Pro Spring Boot(Apress,2016)对应源码

    例如,如果项目中有HSQLDB的依赖,Spring Boot会自动配置一个内存数据库。 2. **起步依赖(Starter POMs)**:Spring Boot的起步依赖简化了Maven或Gradle的配置,开发者只需引入如`spring-boot-starter-web`、`...

    spring boot api chm

    8. **数据访问**:Spring Boot简化了与各种数据库的交互,包括JPA、Hibernate和MyBatis等,同时也支持NoSQL数据库如MongoDB。 9. **安全**:通过Spring Security,Spring Boot提供了一套强大的安全框架,用于身份...

    spring boot 学习demo

    例如,如果检测到HSQLDB库,就会自动配置内存数据库;如果发现有Tomcat,就会自动配置嵌入式Web服务器。 3. **内嵌式Web服务器** 在Spring Boot中,开发者可以选择内嵌的Tomcat、Jetty或Undertow作为Web服务器,...

    spring boot案列

    Spring Boot 是一个由 Pivotal Team 开发的...通过学习这个案例,开发者可以深入了解Spring Boot的特性和使用方式,同时掌握如何将EasyUI整合到Spring Boot应用中,创建出具备完整前端展示和后端业务逻辑的微服务系统。

    spring-boot 中文指南

    《Spring Boot 中文指南》是针对Java开发人员的一份详细教程,主要讲解如何使用Spring Boot框架构建高效、简洁的应用程序。Spring Boot是Spring生态体系的一部分,它简化了Spring应用程序的初始设置和配置,使得...

    spring boot框架

    2. **添加依赖**:在Maven或Gradle的配置文件中,添加所需的Starters,比如`spring-boot-starter-web`和`spring-boot-starter-data-jpa`等,来引入Web和数据库访问功能。 3. **编写主类**:创建一个包含`@...

    spring-boot-reference-guide-zh.pdf

    《Spring Boot官方教程》是为初学者和有一定经验的开发者准备的一份详尽指南,它深入浅出地介绍了Spring Boot框架的核心概念和技术。Spring Boot以其快速启动、简化配置的特性,已经成为Java开发领域中的热门选择,...

    demo.zip spring boot 自己做的练习项目

    例如,如果类路径下存在HSQLDB数据库的相关jar,Spring Boot会自动配置相应的数据源。 2. **起步依赖**:Spring Boot通过“起步依赖”(Starter POMs)来简化构建配置。比如,如果你想在项目中使用Thymeleaf模板...

    10个高频Spring BOOT.zip

    例如,如果在类路径下发现了HSQLDB,那么它就会自动配置一个内存数据库。 3. **嵌入式Web服务器(Embedded Web Servers)** Spring Boot支持内嵌的Tomcat、Jetty或Undertow web服务器,允许开发者无需额外部署即可...

    Spring Boot 系列实战合集.7z

    例如,如果你的类路径下有 `HSQLDB` 数据库,那么 Spring Boot 将自动配置相应的数据源。 3. **嵌入式服务器(Embedded Server)**:Spring Boot 支持嵌入式服务器,如 Tomcat 和 Jetty,无需额外安装和配置,方便...

    Spring Boot Java Demo

    例如,如果在类路径下发现 HSQLDB,Spring Boot 会自动配置内存数据库连接。 3. **内嵌Web服务器(Embedded Web Servers)** Spring Boot 支持内嵌Tomcat、Jetty或Undertow等Web服务器,这意味着你无需额外打包成...

    嵌入式数据库H2开始服务

    总的来说,"嵌入式数据库H2开始服务"这个主题涵盖了H2数据库的基本概念、特点、使用方式以及源码分析,对于理解并应用H2数据库有着重要的指导作用。在实际开发中,掌握这些知识点将有助于提升开发效率和项目质量。

Global site tag (gtag.js) - Google Analytics