Spring Boot默认的H2 jdbc连接(和H2控制台)


107

当我未在application.properties中指定任何内容并以mvn spring:run开头时,我只是想查看spring-boot创建的嵌入式H2数据库的H2数据库内容。我可以看到休眠的JPA正在创建表,但是如果我尝试通过数据库下面的URL访问h2控制台,则该表没有表。

http://localhost:8080/console/

我看到这样的建议: 查看Spring启动的嵌入式H2数据库的内容

但是我不知道在春季启动时将建议的XML放在哪里,即使我这样做了,我也不希望在配置外部数据库时h2console可用,因此我更有可能需要处理此问题。使用某种条件代码(或者在最理想的情况下(仅当激活Maven配置文件时我仅包含H2)才允许spring自动处理它)。

是否有人有示例代码显示如何使H2控制台在启动时工作(以及找出spring使用的jdbc连接字符串的方法)?


我可以通过将其添加到我的application.properties中来部分回答我自己的问题:spring.datasource.url = jdbc:h2:mem:AZ; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE spring.datasource.driverClassName = org.h2.Driver spring .datasource.username = sa spring.datasource.password =但是我真正想知道的是如何以编程方式管理配置(或至少如何找出spring的默认设置)
Aaron Zeckoski 2014年


1
geoand-我在实际问题中链接的是同一件事,因此恐怕这没有帮助。
亚伦·泽科斯基

2
Dave-通过添加该配置,我可以访问H2控制台并查看表格,但这并不能帮助我理解这是否是正确的方法(我更愿意在春季没有配置时在春季访问一个设置)设置)或如何获取Spring正在使用的JDBC连接。
亚伦·泽科斯基

1
使用JDBC URL:jdbc:h2:mem:testdb
Chinmoy

Answers:


110

这就是我让H2控制台在H2的春季启动中工作的方式。我不确定这是否正确,但是由于没有其他人提供解决方案,因此我建议这是最好的方法。

就我而言,我为数据库选择了一个特定的名称,以便在启动H2控制台时可以输入一些内容(在本例中为“ AZ”)。我认为所有这些都是必需的,尽管似乎忽略了spring.jpa.database-platform并没有任何伤害。

在application.properties中:

spring.datasource.url=jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

在Application.java(或某些配置)中:

@Bean
public ServletRegistrationBean h2servletRegistration() {
    ServletRegistrationBean registration = new ServletRegistrationBean(new WebServlet());
    registration.addUrlMappings("/console/*");
    return registration;
}

然后,您可以通过{server} / console /访问H2控制台。输入此作为JDBC URL:jdbc:h2:mem:AZ


1
使用new WebServlet()给我问题。您要导入哪个班级?作为我的唯一选择,它引入了javax.servlet.annotation.WebServlet,它只是一个接口。
Splaktar 2014年

5
哦,我明白了,org.h2.server.web.WebServlet是需要的那个。我的项目与Gradle同步以引入新的h2库。
Splaktar 2014年

21
不需要application.properties部分。您可以只使用放置的Application.java部分,然后jdbc:h2:mem:testdb使用空白的用户名和密码连接。localhost:8082使用此设置。
Splaktar 2014年

2
@Splaktar谢谢!我很努力地试图弄清楚如何连接,而难题中缺少的是使用“ testdb”作为数据库名称。
2015年

1
@Splaktar-您应该将您的评论作为答案。就像您说的那样,EmbeddedDatabaseConnection的源代码显示了所有默认的嵌入式DB连接URI
karthik m

55

从Spring Boot开始1.3.0.M3,可以自动配置H2控制台。

前提条件是:

  • 您正在开发网络应用
  • 启用了Spring Boot开发工具
  • H2在类路径上

即使您不使用Spring Boot Dev Tools,您仍然可以通过设置spring.h2.console.enabledtrue

查看文档的部分以获取所有详细信息。

请注意,以这种方式进行配置时,可以从以下位置访问控制台:http:// localhost:8080 / h2-console /


或者按照文档中的说明,使用spring.h2.console.enabled = true启用它。具有先决条件后,它将自动启用。
凯基

什么是你正在开发一个web应用程序究竟是什么意思?
garci560

在春季启动的背景下,就意味着你已经添加spring-boot-starter-web作为一个依赖
geoand

1
我还认为,当您打开localhost:8080 / h2-console时,需要在jdbc url中编写jdbc:h2:mem:testdb才能查看表。并且在localhost之后的url localhost:8080 / h2-console中,您需要指定应用程序端口。
anujprashar

3
@anujprashar我很确定jdbc:h2:mem:testdb是用于连接URL,而不是用于可访问控制台的URL
geoand

44

我找到了关于这个主题的不错的教程:

https://springframework.guru/using-the-h2-database-console-in-spring-boot-with-spring-security/

基本上,对我来说正确的JDBC URL是: jdbc:h2:mem:testdb


1
愚蠢的问题,但这似乎是默认的JDBC URL,因为设置spring.datasource.name默认为testdb。如果是这样的话,如果我将数据库名称更改为foodb之类的话,jdbc还是一样,而不是jdbc:h2:mem:foodb
Dan Vega

2
这个jdbc网址jdbc:h2:mem:testdb是正确的。它最终帮助我连接到spring数据jpa创建的默认数据库。
卡马尔·乔希

您可以将数据库名称设置为以下任何形式:spring.datasource.url = jdbc:h2:mem:test; 在application.properties
Aleksei Maide '18

23

来自http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

H2 Web控制台(H2ConsoleProperties):

spring.h2.console.enabled=true //Enable the console.
spring.h2.console.path=/h2-console //Path at which the console will be available.

将以上两行添加到我的application.properties文件中,足以使用默认的用户名(sa)和密码(空,因为ui提示您时不输入密码)来访问H2数据库Web控制台。


1
不应该spring.h2.console.enabled=true吗?False将禁用它。并且spring.h2.console.path=/h2-console是多余的,因为这/h2-console是Spring Boot的默认路径。按照文档“默认情况下,控制台将在/ h2-console上可用。您可以使用spring.h2.console.path属性来自定义控制台的路径。” 此处有更多详细信息docs.spring.io/spring-boot/docs/current/reference/html/…–
georger

我包括了后一个属性,以向OP显示他可以访问控制台的位置。显然spring.h2.console.enabled.enabled = false将禁用控制台,其关键是可以将其配置为属性。为了清楚起见,我将该属性设置为true。
mancini0

20

与逐步指南类似的答案。

  1. 开发人员工具依赖项添加到您的pom.xmlbuild.gradle

马文

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

摇篮

dependencies {
    compile("org.springframework.boot:spring-boot-devtools")
}
  1. 从访问数据库 http://localhost:8080/h2-console/
  2. 指定jdbc:h2:mem:testdb为JDBC URL
  3. 您应该将在项目中指定的实体视为表格。

2
在依赖项部分添加此代码对我有用'runtime(“ com.h2database:h2”)'
Raja Nagendra Kumar

17

我在/resources/application.properties中只有以下属性。运行spring boot之后,使用此URL(http:// localhost:8080 / h2-console /),可以看到H2控制台中的表,并可以读取该表以查看表数据,还可以运行简单的SQL命令。一件事,在您的Java代码中,即使在schema.sql使用小写名称的情况下,在获取数据时,列名称也是大写的:)

spring.datasource.initialize=true
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=- 1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true

16

对于直接从Spring Initialzr开始的Spring Boot 2.1.1

  1. devtools的默认值为http://127.0.0.1:8080/h2-console/

    • POM:spring-boot-starter,h2,spring-boot-starter-web,spring-boot-devtools
  2. 没有devtools-您需要在属性中进行设置:spring.h2.console.enabled=true spring.h2.console.path=/h2-console

    • POM:spring-boot-starter,h2,spring-boot-starter-web

到达那里后-设置JDBC URL:jdbc:h2:mem:testdb(默认设置不起作用)


10

如果您使用Spring Boot的开发人员工具,则默认情况下会启用H2控制台。可以从/h2-console/ 访问。在登录界面上,用于输入JDBC URLuse value jdbc:h2:mem:testdb。注意mem字符串。

如果你不使用Spring Boot的开发者工具,可以使控制台application.properties使用spring.h2.console.enabled=true。这将启用控制台/h2-console。如果要更改URL,则可以使用添加另一个条目spring.h2.console.path=my_console_path

默认架构名称为testdb

Spring Boot文档中的更多细节。


4
为什么未jdbc:h2:mem:testdb设置为默认的JDBC URL?我花了很多时间思考我的jpa实体出了什么问题
Sudip Bhandari

10

检查spring application.properties

spring.datasource.url = jdbc:h2:mem:testdb; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE

这里的testdb是数据库定义的确保其他连接时h2控制台具有相同的值,否则它将连接到默认数据库

在此处输入图片说明


1
完美的答案!
gaurav

6

为了获取表,您需要做的就是创建2个sql文件schema.sql(用于创建表)和data.sql(用于创建表的数据)。这些文件将放在src / main / resources文件夹中。Spring Boot自动检测到它们,并在运行时负责其余的工作。

如果您在项目中使用两个以上的数据库,请确保使用特定的文件,例如(schema-h2.sql-用于h2 DB,schema-oracle.sql-用于oracle DB)。data.sql也要遵循相同的要求。

还可以通过在schema.sql中添加drop table语句作为第一条语句来确保删除表。为了避免附加重复的记录。

弹簧靴的链接在这里。

我的application.properties如下。

spring.datasource.url=jdbc:h2:~/file/Shiva;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.platform=h2
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
spring.datasource.initialize=true 
spring.error.whitelabel.enabled=true
spring.h2.console.path=/console
spring.datasource.continue-on-error=true
spring.jpa.hibernate.ddl-auto=create
spring.hibernate.hbm2ddl.auto=update
spring.hibernate.show_sql=true

您可以按照以下链接中的步骤进行操作。

https://springframework.guru/using-the-h2-database-console-in-spring-boot-with-spring-security/


“ spring.jpa.hibernate.ddl-auto”两次使用不同的值...
Yura

3

我发现使用Spring Boot 2.0.2.RELEASE,在POM文件中配置spring-boot-starter-data-jpa和com.h2database不足以使H2控制台正常工作。您必须如下配置spring-boot-devtools。(可选)您可以按照此帖子中Aaron Zeckoski的说明进行操作

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
 </dependency>

3

登录到H2控制台时,请使用jdbc:h2:mem:testdb作为路径。

显然,如果您更改了Spring Boot属性,则您的数据源可能会有所不同,但似乎您正在努力寻找默认值。这里的所有都是它的!登录到H2后,您将看到您的架构。


1

当我遇到同样的问题时,我犯了一个非常愚蠢的错误。我添加了H2 DB来运行单元测试用例,因此将设置scopetestin pom.xml。使用来运行应用程序时,mvn spring:run我删除了scope,现在可以正常使用了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.