SpringBoot + H2内置数据库
一、配置运行
1、配置
1.1、pox.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
DataSourceInitializationConfiguration 是初始化脚本的自动配置类,配置条件之一是@ConditionalOnClass(DatabasePopulator.class) ,该类存在于spring-jdbc ,spring-boot-starter-jdbc 传递依赖spring-jdbc
1.2、application.properties
# 可执行程序的当前路径
spring.datasource.url = jdbc:h2:file:./dbh2/dbc2m;AUTO_SERVER=TRUE
# 数据库连接设置
spring.datasource.type = com.zaxxer.hikari.HikariDataSource
spring.datasource.driverClassName = org.h2.Driver
spring.datasource.username = root
spring.datasource.password = 123
# 进行该配置后,每次启动程序,程序都会运行初始化脚本文件文件,对数据库的结构进行操作
spring.sql.init.mode = always
# 初始化脚本
spring.sql.init.schema-locations = classpath:db/schema.sql
spring.sql.init.data-locations = classpath:db/data.sql
# 表明使用的数据库平台是H2
spring.sql.init.platform = H2
# 进行该配置后,H2 Web Consloe就可以在远程访问了,否则只能在本机访问
spring.h2.console.settings.web-allow-others = true
# 进行该配置,你就可以通过YOUR_URL/h2访问H2 Web Consloe,YOUR_URL是你程序的访问URl
spring.h2.console.path = /h2
# 进行该配置,程序开启时就会启动H2 Web Consloe,默认值false
spring.h2.console.enabled = true
spring.sql.init.mode 属性的值embedded 只对:h2:mem 格式的URL有效(其他数据库见EmbeddedDatabaseConnection ),也就是说只有内存数据库才会在embedded模式下运行初始化脚本(原理:AbstractScriptDatabaseInitializer类106行向下debug)
1.3、schema.sql
CREATE TABLE USER_INF(id INTEGER PRIMARY KEY,name VARCHAR(100),sex VARCHAR(2));
1.4、data.sql
INSERT INTO USER_INF VALUES(1, 'tom', '男');
INSERT INTO USER_INF VALUES(2, 'jack', '女');
INSERT INTO USER_INF VALUES(3, 'marry', '男');
INSERT INTO USER_INF VALUES(4, 'lucy', '男');
如果在application.properties 中没有配置数据库连接池,还需要配置数据库连接池,见参考资料SpringBoot + H2 内置数据库
2、启动
启动 SpringApplication,会在当前目录下创建H2数据库,如下:
登录 H2 Web Console http://localhost:8080/h2 ,按照 application.properties 中的配置来填写访问参数,如下:
登录后,可以对 H2 数据库进行操作:
二、常见问题
1、数据库不存在
在Web Console连接时报错mem:test 或者mem:YOUR_DBNAME 数据库不存在,H2数据库因为安全原因,不允许在Web Console连接时自动创建不存在的数据库(可以配置成自动创建,自行百度),但也说明在应用程序中配置的数据库没有在应用程序启动时自动创建,这种情况下检查数据库连接池是否配置正确,查看IOC中是否有DataSource相关的Bean(IDEA的Run窗口—>Actuator—>Beans)
2、数据库未初始化
查看spring.sql.init.mode 和spring.datasource.url 是否对应上,embedded 模式下只能使用包含:h2:mem 的URL才会初始化
3、Database may be already in use
H2数据库在内嵌模式下运行时只能有一个客户端连接,在连接之后,数据库会加锁,可以在application.properties 的URL后加AUTO_SERVER=TRUE 启动混合模式(注意分号隔开),允许开启多个连接,但该参数不支持在内存中运行模式
4、IDEA连接查看数据库
在应用开发时,可能想使用IDEA的Database窗口查看数据库,但在内嵌模式下,同一时刻只能有应用程序和Database窗口之一连接
-
使用上述方法配置AUTO_SERVER=TRUE 启动混合模式 -
Connection type选择Embedded
- Path选择数据库文件
- 输入用户名密码,点击Test Connection
IDEA的Database窗口连接时使用的是内嵌方式连接(严格来说也不是内嵌),而不是TCP/IP远程连接,网上好多TCP/IP远程连接,试了没成功,启动混合模式时,其他应用连接时使用的URL和配置文件中一样,只不过要改绝对路径
三、其他资料
SpringBoot + H2 内置数据库
H2数据库入门
Java嵌入式数据库H2学习总结(一)——H2数据库入门
Java嵌入式数据库H2学习总结(二)——在Web应用程序中使用H2数据库
u/article/details/51858086)
Java嵌入式数据库H2学习总结(二)——在Web应用程序中使用H2数据库
Java嵌入式数据库H2学习总结(三)——在Web应用中嵌入H2数据库
|