h2数据库

简介

  • h2简介 ^1:内存数据库(Embedded database或in-momery database)具有配置简单、启动速度快、尤其是其可测试性等优点,使其成为开发过程中非常有用的轻量级数据库。在spring中支持HSQL、H2和Derby三种数据库
  • 官网

springboot整合

  • 添加依赖(jpa等省略)

    1
    2
    3
    4
    5
    <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
    </dependency>
  • 连接配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
spring:
datasource:
# 用户名密码会根据填写的生成(默认生成的用户名为sa, 密码为空)。url不写默认使用内存型数据库,数据库名为 minions
url: jdbc:h2:./runtime/data/minions;AUTO_SERVER=true;
# 用户名密码会根据填写的生成(默认生成的用户名为sa, 密码为空).
# 如果已经生成了数据库文件(同时也生成了密码), 那么再修改此处用户名密码将无法连接数据库
username: sa
password: sa
driver-class-name: org.h2.Driver
# h2 web console (推荐使用IDEA的数据库工具)
# # 登录配置Generic H2 (Embedded) jdbc:h2:D:/workspace/minions/runtime/data/minions;AUTO_SERVER=true sa/sa
# h2:
# console:
# # 程序开启时就会启动h2 web consloe
# enabled: true
# # 访问路径: http://localhost:${server.port}/h2-console。此时也可以远程访问,且登录时填写的path为主机路径即可
# path: /h2-console
# settings:
# # 是否允许远程访问h2 web consloe
# web-allow-others: false
  • 配置说明
    • jdbc:h2:file:~/.h2/minions;文件型存储(默认可省略file:)
    • ~ 这个符号代表的就是当前登录到操作系统的用户对应的用户目录。 minions代表数据库名(会在~/.h2目录生成minions.mv.db文件)
      • 如果在项目根目录建立数据文件则可以为jdbc:h2:./minions;AUTO_SERVER=true;(运行h2 jar的位置,idea运行则在项目根目录)
    • jdbc:h2:mem:my_db_name;内存型存储(在连接的瞬间即可创建数据库),程序关掉则内存数据丢失
    • AUTO_SERVER=true; 表示以TCP服务形式启动数据库。否则项目启动后(数据库启动),idea无法连接数据库(AUTO_SERVER_PORT=9092; 可指明端口,不指明会的话自动识别)
  • IDEA数据库工具使用 ^2
    • Url: jdbc:h2:~/.h2/minions;AUTO_SERVER=true; 如果上述spring.datasource.url中h2的路径为相对路径则在IDEA(必须加AUTO_SERVER=true;)和h2-console中都需要使用绝对路径
    • Url类型:Remote
    • 用户名/密码:sa/sa
    • 其他都不需要填写(url处可能报红可忽略)
  • 使用JPA测试(会自动创建表)
1
2
3
4
5
<!-- spring data jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 显示sql语句
spring.jpa.show-sql=true
// 只更新sql语句
spring.jpa.hibernate.ddl-auto=update

@Data
@Entity
public class DemoInfo {
@Id
@GeneratedValue
private long id;
private String title;
private String content;
}

public interface DemoInfoRepository extends CrudRepository<DemoInfo,Long>{}

// 新增/编辑数据
demoInfoRepository.save(new DemoInfo("title1", "content1"));
// 获取所有数据
demoInfoRepository.findAll();

常用SQL

日期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- 当前时间和日期(加括号也行)
select CURRENT_TIMESTAMP;
select CURRENT_DATE; -- 2022-07-16
select current_date-1; -- 2022-07-15 00:00:00.000000000

-- 1970-01-02 00:00:00
select FORMATDATETIME('1970-01-02 00:00:00', 'YYYY-MM-dd HH:mm:ss');
-- 2022-07-16 00:00:00
select FORMATDATETIME(CURRENT_DATE, 'YYYY-MM-dd HH:mm:ss');

-- 1970-01-02 00:00:00.000000000
select DATEADD('SECOND', 60*60*24, DATE '1970-01-01');

-- 时区(H2默认为UTC时区), 将本时区(+8)转成UTC时间 2008-01-01 04:00:00.000000000
CALL TIMESTAMP '2008-01-01 12:00:00+08:00';
-- UTC时间 2022-07-18 03:17:15.462774+00
select CURRENT_TIMESTAMP;
-- 中国时区 2022-07-18 11:17:29.11315+08
select CURRENT_TIMESTAMP AT TIME ZONE '8';

常见问题

时区


参考文章

ChatGPT开源小程序