应广大网友的要求,写了这么一篇文章。对于已经入门了童鞋来说的话,这个自然也就很简单了,对于刚刚入门的还是有点难度的,好吧,这里就简单介绍下。
内存数据库(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