Spring boot conexión H2 jdbc predeterminada (y consola H2)

107

Simplemente estoy tratando de ver el contenido de la base de datos H2 para una base de datos H2 incrustada que crea spring-boot cuando no especifico nada en mis application.properties y comienzo con mvn spring: run. Puedo ver cómo hibernate JPA crea las tablas, pero si intento acceder a la consola h2 en la URL debajo, la base de datos no tiene tablas.

http://localhost:8080/console/

Veo sugerencias como esta: Ver el contenido de la base de datos H2 incorporada iniciada por Spring

Pero no sé dónde poner el XML sugerido en spring-boot e incluso si lo hiciera, no quiero que h2console esté disponible más cuando se configura una base de datos externa, por lo que es más probable que necesite manejar esto con algún tipo de código condicional (o tal vez simplemente permitir que Spring lo maneje automáticamente en el caso más ideal donde solo incluyo H2 cuando se activa un perfil de maven).

¿Alguien tiene algún código de muestra que muestre cómo hacer que la consola H2 funcione en el arranque (y también la forma de averiguar cuál es la cadena de conexión jdbc que usa Spring)?

Aaron Zeckoski
fuente
Puedo responder en parte a mi propia pregunta agregando esto a mi 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 = Pero lo que realmente quiero saber es cómo administrar la configuración mediante programación (o al menos cómo averiguar los valores predeterminados de primavera)
Aaron Zeckoski
Consulte este stackoverflow.com/a/19961575/2504224 .
geo y
1
geoand: es lo mismo que vinculé en la pregunta real, así que me temo que no es útil.
Aaron Zeckoski
2
Dave: al agregar esa configuración, puedo acceder a la consola H2 y ver las tablas, pero no me ayuda a comprender si esa es la forma correcta de hacerlo (preferiría acceder a la configuración única en primavera cuando no tengo settings) o cómo obtener el resorte de conexión JDBC que está usando.
Aaron Zeckoski
1
Utilice la URL de JDBC: jdbc: h2: mem: testdb
Chinmoy

Respuestas:

110

Así es como conseguí que la consola H2 funcionara en spring-boot con H2. No estoy seguro de si esto es correcto, pero como nadie más ha ofrecido una solución, voy a sugerir que esta es la mejor manera de hacerlo.

En mi caso, elegí un nombre específico para la base de datos para tener algo que ingresar al iniciar la consola H2 (en este caso, "AZ"). Creo que todos estos son necesarios, aunque parece que dejar de lado la plataforma spring.jpa.database no hace daño.

En 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

En Application.java (o alguna configuración):

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

Luego, puede acceder a la consola H2 en {server} / console /. Ingrese esto como la URL de JDBC: jdbc: h2: mem: AZ

Aaron Zeckoski
fuente
1
Usar new WebServlet()dame problemas. ¿Qué clase te está importando? Para mí, está introduciendo javax.servlet.annotation.WebServlet como la única opción y es solo una interfaz.
Splaktar
5
Oh, lo tengo, org.h2.server.web.WebServlet es el que se necesita. Mi proyecto no estaba sincronizado con Gradle para incorporar las nuevas bibliotecas h2.
Splaktar
21
Las piezas de application.properties no son necesarias. Puede usar la parte Application.java que puso, luego conectarse jdbc:h2:mem:testdbcon un nombre de usuario y una contraseña en blanco. localhost: 8082 funciona con esta configuración.
Splaktar
2
@Splaktar ¡Gracias! Me estaba volviendo loco tratando de averiguar cómo conectarme y la pieza que faltaba en el rompecabezas era usar "testdb" para el nombre de la base de datos.
nerdherd
1
@Splaktar: debes hacer que tu comentario sea la respuesta. Como dijiste, el código fuente de EmbeddedDatabaseConnection muestra todos los URI de conexión de base de datos integrados predeterminados
karthik m
55

A partir de Spring Boot 1.3.0.M3, la consola H2 se puede configurar automáticamente.

Los prerrequisitos son:

  • Estás desarrollando una aplicación web
  • Las herramientas Spring Boot Dev están habilitadas
  • H2 está en el classpath

Incluso si no usa Spring Boot Dev Tools, aún puede configurar automáticamente la consola estableciendo spring.h2.console.enabledentrue

Consulte esta parte de la documentación para conocer todos los detalles.

Tenga en cuenta que al configurar de esta manera la consola es accesible en: http: // localhost: 8080 / h2-console /

geo y
fuente
O, como se explica en el documento, lo habilita con spring.h2.console.enabled = true. Con los requisitos previos se habilita automáticamente.
keiki
¿Qué significa exactamente estás desarrollando una aplicación web ?
garci560
En el contexto de Spring Boot, significa que ha agregado spring-boot-starter-webcomo dependencia
geo y
1
También creo que cuando abres localhost: 8080 / h2-console necesitas escribir jdbc: h2: mem: testdb en la url jdbc para ver tus tablas. Y en la url localhost: 8080 / h2-console después de localhost, debe especificar el puerto de la aplicación.
anujprashar
3
@anujprashar Estoy bastante seguro de que jdbc:h2:mem:testdbes para la URL de conexión, no para la URL donde se puede acceder a la consola
geo y
44

Encontré un buen tutorial sobre este tema:

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

Básicamente, la URL correcta de JDBC para mí era: jdbc:h2:mem:testdb

Krzysztof Kaczor
fuente
1
pregunta tonta, pero esta parece ser la URL JDBC predeterminada porque la configuración spring.datasource.name predeterminada es testdb. ¿Por qué si ese es el caso si cambio el nombre de la base de datos a algo como foodb, el jdbc sigue siendo el mismo y no jdbc: h2: mem: foodb
Dan Vega
2
Esta url jdbc jdbc: h2: mem: testdb es correcta. Me ayudó finalmente a conectarme a la base de datos predeterminada creada por Spring Data jpa.
Kamal Joshi
Puede establecer el nombre de la base de datos como: spring.datasource.url = jdbc: h2: mem: test; en application.properties
Aleksei Maide
23

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

Consola web H2 (H2ConsoleProperties):

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

Agregar las dos líneas anteriores a mi archivo application.properties fue suficiente para acceder a la consola web de la base de datos H2, usando el nombre de usuario (sa) y la contraseña predeterminados (vacío, como en no ingrese una contraseña cuando la interfaz de usuario se lo solicite).

mancini0
fuente
1
¿No debería ser spring.h2.console.enabled=true? False lo desactivará. Y spring.h2.console.path=/h2-consolees redundante porque /h2-consolees la ruta predeterminada de Spring Boot. Según la documentación "De forma predeterminada, la consola estará disponible en / h2-console. Puede personalizar la ruta de la consola utilizando la propiedad spring.h2.console.path". Más detalles aquí docs.spring.io/spring-boot/docs/current/reference/html/…
georger
Incluí la última propiedad para mostrar a OP dónde puede acceder a la consola. Obviamente spring.h2.console.enabled.enabled = false deshabilitará la consola, el punto es que esto se puede configurar como una propiedad. Estableceré esa propiedad en verdadero para mayor claridad.
mancini0
20

Una respuesta similar con la guía paso a paso.

  1. Agregue la dependencia de las herramientas del desarrollador a su pom.xmlobuild.gradle

Maven

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

Gradle

dependencies {
    compile("org.springframework.boot:spring-boot-devtools")
}
  1. Acceda a la base de datos desde http://localhost:8080/h2-console/
  2. Especificar jdbc:h2:mem:testdbcomo URL de JDBC
  3. Debería ver la entidad que especificó en su proyecto como una tabla.
biniam
fuente
2
agregar esto en la sección de dependencia funcionó para mí 'runtime ("com.h2database: h2")'
Raja Nagendra Kumar
17

Solo tenía las propiedades siguientes en /resources/application.properties. Después de ejecutar el arranque de primavera, usando esta URL ( http: // localhost: 8080 / h2-console / ), la tabla en la consola H2 estaba visible y se leía para ver los datos de la tabla, también puede ejecutar comandos SQL simples. Una cosa, en su código java, mientras busca datos, los nombres de las columnas están en mayúsculas, aunque schema.sql usa nombres en minúsculas :)

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
rak22
fuente
16

Para Spring Boot 2.1.1 directamente de Spring Initialzr:

  1. El valor predeterminado con devtools es http://127.0.0.1:8080/h2-console/

    • POM: spring-boot-starter, h2, spring-boot-starter-web, spring-boot-devtools
  2. Sin devtools , debe configurarlo en propiedades:spring.h2.console.enabled=true spring.h2.console.path=/h2-console

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

Una vez que llegue allí, configure la URL de JDBC: jdbc: h2: mem: testdb (la predeterminada no funcionará)

Witold Kaczurba
fuente
10

Si usa las herramientas de desarrollo de Spring Boot, viene con la Consola H2 habilitada de forma predeterminada. Se puede acceder desde /h2-console/. En la interfaz de inicio de sesión, para JDBC URLvalor de uso de entrada jdbc:h2:mem:testdb. Presta atención a la memcuerda.

Si no usa las herramientas de desarrollo de Spring Boot, puede habilitar la consola en el application.propertiesuso de spring.h2.console.enabled=true. Esto habilitará la consola debajo /h2-console. Si desea cambiar la URL, puede agregar otra entrada con spring.h2.console.path=my_console_path.

El nombre de esquema predeterminado es testdb.

Más detalles en la documentación de Spring Boot .

georger
fuente
4
¿Por qué no se jdbc:h2:mem:testdbestablece como url jdbc predeterminada? Pasé mucho tiempo reflexionando sobre dónde fallaron mis entidades
jpa
10

Compruebe las propiedades de la aplicación de primavera

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

aquí testdb es la base de datos definida Asegúrese de que la consola h2 tenga el mismo valor mientras se conecta, de lo contrario, se conectará a la base de datos predeterminada

ingrese la descripción de la imagen aquí

vaquar khan
fuente
1
respuesta impecable!
gaurav
6

Para obtener las tablas, todo lo que necesita hacer es crear 2 archivos sql schema.sql (para la creación de tablas) y data.sql (datos para las tablas creadas). Estos archivos se colocarán en la carpeta src / main / resources. Spring boot auto los detecta y se encarga del resto durante el tiempo de ejecución.

Si usa más de 2 DB en su proyecto, asegúrese de usar archivos específicos como (schema-h2.sql - para h2 DB, schema-oracle.sql - para Oracle DB). Lo mismo se seguirá para data.sql también.

También asegúrese de eliminar tablas agregando la declaración de la tabla de eliminación en su schema.sql como primera declaración. Para evitar anexar registros duplicados.

El enlace para la bota de primavera está aquí.

Mi application.properties es la siguiente.

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

Puede seguir los pasos en el siguiente enlace.

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

kemparaj565
fuente
"spring.jpa.hibernate.ddl-auto" dos veces con valores diferentes ...
Yura
3

Descubrí que con Spring Boot 2.0.2.RELEASE, configurar spring-boot-starter-data-jpa y com.h2database en el archivo POM no es suficiente para que la consola H2 funcione. Debe configurar spring-boot-devtools como se muestra a continuación. Opcionalmente, puede seguir las instrucciones de Aaron Zeckoski en esta publicación.

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
 </dependency>
Pragnesh Rana
fuente
3

Utilice jdbc: h2: mem: testdb como ruta cuando inicie sesión en la consola H2.

Obviamente, si ha alterado las propiedades de Spring Boot, su fuente de datos puede ser diferente, pero parece que tiene dificultades para encontrar la predeterminada. ¡Eso es todo al respecto! Verá su esquema después de iniciar sesión en H2.


fuente
1

Cometí un error muy estúpido cuando tuve este mismo problema. Había añadido H2 DB para el funcionamiento de unidades de prueba y por lo tanto me había propuesto el scopede testen pom.xml. Mientras ejecutaba la aplicación mvn spring:run, eliminé el scopey ahora funciona bien.

AbhishekB
fuente