Spring Boot使用内存数据库h2构建工程

步骤

新建一个maven的java 工程

命名为spring-boot-h2

添加相关依赖

在pom.xml文件添加相关依赖主要是有三个部分。

增加父工程spring-boot-starter-parent

主要作用:

  • 配置java版本和其它配置文件
  • 依赖管理器,管理依赖库的版本
  • 设置默认插件的配置
1
2
3
4
5
 <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
</parent>

增加spring boot 的web依赖和jpa依赖,及h2数据库的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

编写启动类

使用@SpringBootApplication注解把要运行的类注解。

1
2
3
4
5
6
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}

编写实体类

@Entity注解实体类,@Id@GeneratedValue指明主键与生成方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Entity
public class DemoEntity {
@Id
@GeneratedValue
private long id;
private String title;
private String content;

public DemoEntity() {
}

public DemoEntity(String title, String content) {
this.title = title;
this.content = content;
}
// get,set 方法略
}

编写持久层接口

持久层接口继承于spring的curl接口。
CrudRepository中完成了基本增删改查的定义。

1
2
3
public interface DemoRepository extends  CrudRepository<DemoEntity,Long>{

}

编写控制层类

使用@RestController注解控制层的类,指明使用rest方式,相当于给类中所有方法加了@ResponseBody注解。
@Autowired自动注入持久层的类。这里只是演示,也比较简单,就没用到服务层。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@RestController
public class DemoController {

@Autowired
private DemoRepository demoInfoRepository;

@RequestMapping("/save")
public String save() {
// 内存数据库增加操作
demoInfoRepository.save(new DemoEntity("title1", "content1"));
demoInfoRepository.save(new DemoEntity("title2", "content2"));
demoInfoRepository.save(new DemoEntity("title3", "content3"));
demoInfoRepository.save(new DemoEntity("title4", "content4"));
demoInfoRepository.save(new DemoEntity("title5", "content5"));
return "save ok";
}

@RequestMapping("/findAll")
public Iterable<DemoEntity> findAll(){
// 内存数据库查询操作
return demoInfoRepository.findAll();
}
}

运行

运行App类
依次访问:
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 此时没有数据,重启之后就释放了之前存入的数据。

打包成独立的jar包

如果要打包成独立的jar包的话,要增加spring-boot-maven-plugin插件。

1
2
3
4
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

再运行mvn package就是含依赖的能独立运行的jar包。

说明一点,在这里好像就不能用maven-assembly-plugin来打包了,反正每次打包之后的文件都不能运行。

运行spring-boot:run可直接运行springboot程序。
前提是代码中只有一个main函数。

如果什么控制器都不写,则返回这样的json数据。

{"timestamp":xxx,"status":404,"error":"Not Found","message":"No message available","path":"/"}

其它扩展

替换hsqldb

替换依赖就行

1
2
3
4
5
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>

显示sql

在resources目录下新建application.properties文件
加入

1
application.properties

数据库持久化

在application.properties中加入

1
2
3
4
5
spring.datasource.url = jdbc:h2:file:~/.h2/testdb
spring.datasource.username = sa
spring.datasource.password = sa
spring.datasource.driverClassName = org.h2.Driver
spring.jpa.hibernate.ddl-auto = update

spring-boot项目在外部tomcat环境下部署

  • 将项目的启动类App.java继承SpringBootServletInitializer并重写configure方法

    1
    2
    3
    4
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(App.class);
    }
  • 在pom.xml文件中,project下面增加package标签

1
<packaging>war</packaging>
  • 还是在pom.xml文件中,dependencies下面添加
    1
    2
    3
    4
    5
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
    </dependency>

spring-boot更加强大的一点就是:即便项目是以上配置,依然可以用内嵌的tomcat来调试,启动命令和以前没变,还是:mvn spring-boot:run

参考


工程源码地址https://github.com/finghine/spring-boot-h2-exmaple