H2数据库的简单使用

H2 是一个用 Java 开发的嵌入式数据库,它本身只是一个类库,即只有一个 jar 文件,可以直接嵌入到应用项目中。,具有以下特点:

  1. 轻量级 - h2数据库是一个非常小巧和快速的数据库,只需要一个jar包就能运行,数据库文件直接存放在文件系统中。

  2. 嵌入式 - h2数据库可以嵌入到Java应用程序中,与应用程序在同一个JVM中运行,不需要启动数据库服务器进程。

  3. 内存数据库 - h2数据库可以将数据完全存放在内存中,启动和访问速度非常快。

  4. 支持标准SQL - h2数据库支持大多数标准SQL语法,使用非常简单和直观。

  5. 支持多平台 - h2数据库可以运行在Windows、Linux、Mac OS等主流操作系统平台上。

  6. 支持客户端/服务器模式 - h2数据库还支持以客户端/服务器模式运行,可以让多个应用程序共享同一个数据库。

  7. 支持数据加密 - h2数据库提供了数据加密功能,可以对数据库文件进行加密,保证数据安全。

  8. 开源免费 - h2数据库采用MPL 2.0开源许可证,可以免费使用和修改源代码。

新增maven依赖

<!--数据库-->
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

新增H2的配置信息

​
spring:
  datasource:
    #  驱动
    driver-class-name: org.h2.Driver
    # h2 内存数据库 内存模式连接配置 库名: main
    #url: jdbc:h2:mem:main
    # h2  嵌入模式连接  存储路径: E:/H2/yyzmain
    url: jdbc:h2:file:E:/H2/yyzmain
    # 初始化数据表
    schema: classpath:sql/init.sql
  h2:
    console:
      #开启console 访问 默认false
      enabled: true
      settings:
        # 开启h2 console 跟踪 方便调试  默认 false
        trace: true
        # 允许console 远程访问 默认false
        web-allow-others: true
      # h2 访问路径上下文
      path: /h2-yyzmain

其中jdbc:h2:mem:main配置为内存模式连接,内存模式就是数据库文件存在于内存中,没有持久化,当应用进程关闭时数据库与数据表会消失。可以改成嵌入模式连接,这样可以保留数据到文件中,文件存在于应用当前的硬盘内,进行了持久化,当应用进程关闭时数据库与数据表不会消失。

访问H2数据库

可以直接/h2-yyzmain访问到H2数据库,如下图:

1

其中的JDBC URL为配置文件中spring.datasource.url 的值,输入后,点击Connect即可访问到数据库,如下图:

1

导出数据库

执行以下sql即可导出数据

CALL CSVWRITE('$path', 'SELECT * FROM $table_name ');

参数说明:

  • $path:本地路径,例如d:/yyzmain.csv

  • $table_name:要导出的表名

常见问题

  1. 数据导出csv文件乱码

    再导出语句中添加编码,如下:

    CALL CSVWRITE('$path', 'SELECT * FROM $table_name ','charset=UTF-8');

  2. 加载h2数据文件.mv.db文件失败,报错信息如下:

    2023-08-07 09:46:45.480 ERROR 14728 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.
    ​
    org.h2.jdbc.JdbcSQLNonTransientConnectionException: File corrupted while reading record: null. Possible solution: use the recovery tool [90030-200]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.message.DbException.get(DbException.java:194) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.mvstore.db.MVTableEngine$Store.convertIllegalStateException(MVTableEngine.java:222) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.mvstore.db.MVTableEngine$Store.open(MVTableEngine.java:182) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:103) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.engine.Database.getPageStore(Database.java:2659) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.engine.Database.open(Database.java:675) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.engine.Database.openDatabase(Database.java:307) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.engine.Database.<init>(Database.java:301) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.engine.Engine.openSession(Engine.java:74) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.engine.Engine.openSession(Engine.java:192) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.engine.Engine.createSession(Engine.java:166) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.engine.Engine.createSession(Engine.java:29) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:173) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:152) ~[h2-1.4.200.jar:1.4.200]
        at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.200.jar:1.4.200]
        at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.5.jar:na]
        at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[HikariCP-3.4.5.jar:na]
        at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar:na]
        at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) [HikariCP-3.4.5.jar:na]
        at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) [HikariCP-3.4.5.jar:na]
        at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) [HikariCP-3.4.5.jar:na]
        at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) [HikariCP-3.4.5.jar:na]
        at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.lambda$h2Console$0(H2ConsoleAutoConfiguration.java:73) [spring-boot-autoconfigure-2.3.4.RELEASE.jar:2.3.4.RELEASE]
        at org.springframework.beans.factory.ObjectProvider.ifAvailable(ObjectProvider.java:93) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.h2Console(H2ConsoleAutoConfiguration.java:72) [spring-boot-autoconfigure-2.3.4.RELEASE.jar:2.3.4.RELEASE]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_211]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_211]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_211]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_211]
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:650) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:635) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1176) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireC

    可能原因:依赖包版本过低,升级依赖即可,如下:

     <dependency>
         <groupId>com.h2database</groupId>
         <artifactId>h2</artifactId>
         <version>2.1.212</version>
     </dependency>

最后

源码地址:https://github.com/yyzmain/main-study