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

       内存数据库(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 )。

 

 

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 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