springboot H2Z

149 阅读3分钟

1. 什么是H2内存数据库

H2是一个用Java开发的嵌入式数据库,它本身是一个类库,可以直接嵌入到项目中

官网地址:H2数据库

1.1. H2用途

  • H2最大的用途在于可以同应用程序打包在一起发布,这样可以非常方便地少量结构化数据
  • 用于单元测试,启动速度块,而且可以关闭持久化功能,每一个用例执行完随机还原到初始状态
  • 作为缓存,作为NoSQL的一个补充。当某些场景下数据模型必须为关系型,可以把它当Memcached使,作为后端Mysql/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字电表、、权限表。不过这样系统架构就会比较复杂了。

1.2. H2的产品优势

  • 纯Java编写,不受平台的限制
  • 只有一个jar文件,适合作为嵌入式数据库使用
  • H2提供了一个时份翻边的web控制台用于操作和管理数据库内容
  • 功能完整,支持标准sql和jdbc
  • 支持内嵌模式、服务器模式和集群

2. Springboot集成H2

2.1. 添加H2以及相关依赖

Copy

| 1 2 3 4 5 6 7 8 9 10 11 12 13 | ``` com.h2database h2 runtime org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-web

| -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

#### [](http://xiaoyuge.work/springboot-chapter3/index.html#2-2-%E9%85%8D%E7%BD%AEH2%E7%9B%B8%E5%85%B3%E5%8F%82%E6%95%B0 "2.2. 配置H2相关参数")2.2. 配置H2相关参数

Copy

| ```
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 
``` | ```
spring:   datasource:     schema: classpath:db/schema.sql   #指定数据表结构文件所在目录     data: classpath:db/data.sql   #指定数据文件所在目录     driver-class-name: org.h2.Driver     url: jdbc:h2:mem:test   # 内存模式,数据不会持久化     #url:jdbc:h2:~/test  嵌入模式,数据文件存储在用户目录test开头的文件中     #url:jdbc:h2:tcp//localhost/〜/test 远程模式,访问远程的h2 数据库     username: sa    #用户名     password: root  #密码     platform: h2   h2:     console:       enabled: true       path: /h2           #H2控制台访问路径       settings:         web-allow-others: true   jpa:     hibernate:       ddl-auto: update     show-sql: true     open-in-view: true 
``` |
| ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

其中在`resources/db`下创建表结构schema.sql

Copy

| ```
1 2 3 4 
``` | ```
create table if not exists sys_user(     USER_ID int not null primary key auto_increment,     USER_NAME varchar(200) ); 
``` |
| ---------------- | -------------------------------------------------------------------------------------------------------------------------------- |

以及数据文件 data.sql,作为初始化数据

Copy

| ```
1 2 3 4 
``` | ```
-- 字段都是大写的 INSERT INTO SYS_USER (USER_ID, USER_NAME) VALUES (1, '小余哥'); INSERT INTO SYS_USER (USER_ID, USER_NAME) VALUES (2, '张三'); INSERT INTO SYS_USER (USER_ID, USER_NAME) VALUES (3, '李四'); 
``` |
| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

#### [](http://xiaoyuge.work/springboot-chapter3/index.html#2-3-%E5%AE%9E%E4%BD%93%E5%85%B3%E8%81%94%E8%A1%A8 "2.3. 实体关联表")2.3. 实体关联表

给User添加@Entity注解和@Table注解

Copy

| ```
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
``` | ```
@Entity @Table(name="sys_user") @Proxy(lazy = false) public class User {      @Id     private int userId;     /**      * userName 对应数据库  USER_NAME      * username 对应数据库 USERNAME      */     @Column(name = "USER_NAME")     private String userName;      //----------省略getter/setter----- } 
``` |
| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

#### [](http://xiaoyuge.work/springboot-chapter3/index.html#2-4-%E5%88%9B%E5%BB%BADao%E7%BB%A7%E6%89%BFJpaRepository "2.4. 创建Dao继承JpaRepository")2.4. 创建Dao继承JpaRepository

Copy

| ```
1 2 3 
``` | ```
@Repository public interface UserRepository extends JpaRepository<User, Integer> { } 
``` |
| -------------- | --------------------------------------------------------------------------------------------- |

#### [](http://xiaoyuge.work/springboot-chapter3/index.html#2-5-%E8%AE%BF%E9%97%AEH2%E6%8E%A7%E5%88%B6%E5%8F%B0 "2.5. 访问H2控制台")2.5. 访问H2控制台

启动应用程序,通过访问H2控制台连接`localhost:8080/h2`,进入H2控制台页面

![]()

进入控制台后,可以查看到初始化的数据表`SYS_USER`以及数据  
![]()

#### [](http://xiaoyuge.work/springboot-chapter3/index.html#2-6-%E5%88%9B%E5%BB%BA%E6%B5%8B%E8%AF%95%E7%B1%BB "2.6. 创建测试类")2.6. 创建测试类

Copy

| ```
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 
``` | ```
@RunWith(SpringRunner.class) @SpringBootTest public class AppTest {      @Autowired     private UserRepository userRepository;      @Test     public void save(){         User user = new User();         user.setUserName("王五");         userRepository.save(user);         //Hibernate: insert into sys_user (user_name, user_id) values (?, ?)     }      @Test     public void getOne(){         User user = userRepository.getOne(1);         System.out.println(user.toString());         //Hibernate: select user0_.user_id as user_id1_0_0_, user0_.user_name as user_nam2_0_0_ from sys_user user0_ where user0_.user_id=?         //User{userId=1, userName='小余哥'}     }      @Test     public void list(){         List<User> list = userRepository.findAll();         for (User user : list) {             System.out.println(user.toString());         }         //User{userId=1, userName='小余哥'}         //User{userId=2, userName='张三'}         //User{userId=3, userName='李四'}     } }
``` |
| ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------