`

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  
回头试试。

相关推荐

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

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

    H2DB使用文档

    其中H2, HSQLDB类似,十分适合作为嵌入式数据库使用,其它的数据库大部分都需要安装独 立的客户端和服务器端。2.H2的优势: 1、h2采用纯Java编写,因此不受平台的限制。 2、h2只有一个jar文件,十分适合作为嵌入式...

    hsqldb jdbc driver

    hsqldb jdbc driver适合于hsqldb

    spring-framework-3.0.5.RELEASE-dependencies-1

    spring-framework-3.0.5.RELEASE-dependencies 好不容易找到了,赶紧分享一下 因为不能大于20M,共分了8个包,都是独立的,我列了目录,可以只下载需要的包,这是1号包: 1号包: edu.emory.mathcs.backport edu.oswego.cs....

    数据库操作的单元测试

    3.1.1. 从“易测试的”应用程序体系结构开始。 2 3.1.2. 使用精确的断言。 2 3.1.3. 外化断言数据。 3 3.1.4. 编写全面的测试。 4 3.1.5. 创建稳定、有意义的测试数据集。 5 3.1.6. 创建专用的测试库。 6 3.1.7. ...

    嵌入式数据库H2开始服务

    NULL 博文链接:https://fuzhaohui.iteye.com/blog/1481585

    hsqldb.jar

    hsqldb.jar hsqldb.jar hsqldb.jar hsqldb.jar hsqldb.jar hsqldb.jar hsqldb.jar

    hsql数据库详细教程

    本文档是针对hSQL 数据库方面的基础学习,为了使项目组成员能够达到使用hSQL 数据库的目的。 1.2. 培训对象 开发人员 1.3. 常用词及符号说明 常用词: hsql:一种免费的跨平台的数据库系统 E:\hsqldb:表示是在dos ...

    HSQLDB数据库

    HSQLDB数据库,经典啊

    spring-petclinic-angularjs:Spring Petclinic示例应用程序的AngularJS 1和Spring Boot 2版本

    在默认配置中,Petclinic使用内存数据库(HSQLDB),该数据库在启动时会填充数据。 如果需要持久数据库配置,则为MySql提供类似的设置。 要使用MySQL数据库在本地运行petclinic,需要更改application.properties文件...

    嵌入式数据库引擎 H2.zip

    H2是一个短小精干的嵌入式数据库引擎,主要的特性包括:免费、开源、快速嵌入式的数据库服务器,支持集群提供JDBC、ODBC访问接口,提供基于浏览器的控制台管理程序Java编写,可使用GCJ和IKVM.NET编译短小精干的软件...

    spring-framework-3.0.5.RELEASE-dependencies-5

    spring-framework-3.0.5.RELEASE-dependencies 好不容易找到了,赶紧分享一下 因为不能大于20M,共分了8个包,都是独立的,我列了目录, 可以只下载需要的包,这是5号包: 1号包: edu.emory.mathcs.backport edu.oswego....

    Spring3.0.3 + ibatis-2.3.4.726简单例子

    自己学习时弄的一个测试例子,使用Spring3.0.3 + ibatis-2.3.4.726,增删查数据.只是个简单例子,高手请过. 1.先运行数据库,执行hsqldb\startServer.bat启动hsqldb数据库.已经有初始化数据. 2.打开Eclipse编译项目,前...

    hsqldb数据库软件

    hsqldb是我们进行Java开发的最常用的数据库之一,希望大家能够喜欢

    spring-framework-3.0.5.RELEASE-dependencies-8

    spring-framework-3.0.5.RELEASE-dependencies 好不容易找到了,赶紧分享一下 因为不能大于20M,共分了8个包,都是独立的,我列了目录, 可以只下载需要的包,这是8号包: 1号包: edu.emory.mathcs.backport edu.oswego.cs...

    spring-framework-3.0.5.RELEASE-dependencies-3

    spring-framework-3.0.5.RELEASE-dependencies 好不容易找到了,赶紧分享一下 因为不能大于20M,共分了8个包,都是独立的,我列了目录, 可以只下载需要的包,这是3号包: 1号包: edu.emory.mathcs.backport edu.oswego.cs...

    spring-framework-3.0.5.RELEASE-dependencies-2

    spring-framework-3.0.5.RELEASE-dependencies 好不容易找到了,赶紧分享一下 因为不能大于20M,共分了8个包,都是独立的,我列了目录, 可以只下载需要的包,这是2号包: 1号包: edu.emory.mathcs.backport edu.oswego....

    api:使用Java和Spring Boot的微服务简介

    此Api使用Java和Spring引导构建,通过简单的DAO和DTO实现向Micoroservices进行介绍。 依存关系 框架:org.springframework.boot 数据存储库:org.springframework.boot \ spring-boot-starter-data-jpa 持久层:org...

    spring-framework-3.0.5.RELEASE-dependencies-6

    spring-framework-3.0.5.RELEASE-dependencies 好不容易找到了,赶紧分享一下 因为不能大于20M,共分了8个包,都是独立的,我列了目录, 可以只下载需要的包,这是6号包: 1号包: edu.emory.mathcs.backport edu.oswego....

    hsqldb-2.5.0.jar

    hsqldb数据库下载,很好用,简易的内存数据库,特别适合初学者。

Global site tag (gtag.js) - Google Analytics