H2数据库的简单使用
H2 是一个用 Java 开发的嵌入式数据库,它本身只是一个类库,即只有一个 jar 文件,可以直接嵌入到应用项目中。,具有以下特点:
轻量级 - h2数据库是一个非常小巧和快速的数据库,只需要一个jar包就能运行,数据库文件直接存放在文件系统中。
嵌入式 - h2数据库可以嵌入到Java应用程序中,与应用程序在同一个JVM中运行,不需要启动数据库服务器进程。
内存数据库 - h2数据库可以将数据完全存放在内存中,启动和访问速度非常快。
支持标准SQL - h2数据库支持大多数标准SQL语法,使用非常简单和直观。
支持多平台 - h2数据库可以运行在Windows、Linux、Mac OS等主流操作系统平台上。
支持客户端/服务器模式 - h2数据库还支持以客户端/服务器模式运行,可以让多个应用程序共享同一个数据库。
支持数据加密 - h2数据库提供了数据加密功能,可以对数据库文件进行加密,保证数据安全。
开源免费 - 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数据库,如下图:
其中的JDBC URL
为配置文件中spring.datasource.url
的值,输入后,点击Connect
即可访问到数据库,如下图:
导出数据库
执行以下sql即可导出数据
CALL CSVWRITE('$path', 'SELECT * FROM $table_name ');
参数说明:
$path:本地路径,例如
d:/yyzmain.csv
$table_name:要导出的表名
常见问题
数据导出csv文件乱码
再导出语句中添加编码,如下:
CALL CSVWRITE('$path', 'SELECT * FROM $table_name ','charset=UTF-8');
加载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>