connexion jdbc H2 par défaut de spring boot (et console H2)

108

J'essaie simplement de voir le contenu de la base de données H2 pour une base de données H2 intégrée créée par spring-boot lorsque je ne spécifie rien dans mon application.properties et que je commence par mvn spring: run. Je peux voir Hibernate JPA créer les tables, mais si j'essaye d'accéder à la console h2 à l'URL ci-dessous, la base de données n'a pas de tables.

http://localhost:8080/console/

Je vois des suggestions comme celle-ci: Afficher le contenu de la base de données H2 intégrée démarrée par Spring

Mais je ne sais pas où mettre le XML suggéré dans spring-boot et même si je l'ai fait, je ne veux plus que la h2console soit disponible lorsqu'une base de données externe est configurée, il est donc plus probable que je doive gérer cela avec une sorte de code conditionnel (ou peut-être juste permettre à spring de le gérer automatiquement dans le cas le plus idéal où je n'inclue H2 que lorsqu'un profil maven est activé).

Quelqu'un a-t-il un exemple de code montrant comment faire fonctionner la console H2 au démarrage (et aussi le moyen de savoir quelle est la chaîne de connexion jdbc utilisée par Spring)?

Aaron Zeckoski
la source
Je peux en partie répondre à ma propre question en ajoutant ceci à mon 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 = Mais ce que je veux vraiment savoir, c'est comment gérer la configuration par programme (ou du moins comment trouver les valeurs par défaut du printemps)
Aaron Zeckoski
Consultez ce stackoverflow.com/a/19961575/2504224 .
geoand
1
geoand - C'est la même chose que j'ai liée dans la question réelle, donc j'ai bien peur que ce ne soit pas utile.
Aaron Zeckoski
2
Dave - En ajoutant cette configuration, je suis capable d'accéder à la console H2 et de voir les tables mais cela ne m'aide pas à comprendre si c'est la bonne façon de le faire (je préférerais accéder à la configuration unique au printemps quand je n'ai pas settings) ou comment obtenir le ressort de connexion JDBC utilise.
Aaron Zeckoski
1
Utilisez l'URL JDBC: jdbc: h2: mem: testdb
Chinmoy

Réponses:

110

C'est ainsi que j'ai fait fonctionner la console H2 en mode spring-boot avec H2. Je ne sais pas si c'est juste, mais puisque personne d'autre n'a proposé de solution, je vais suggérer que c'est la meilleure façon de le faire.

Dans mon cas, j'ai choisi un nom spécifique pour la base de données afin d'avoir quelque chose à saisir lors du démarrage de la console H2 (dans ce cas, "AZ"). Je pense que tout cela est nécessaire bien qu'il semble que le fait d'omettre la plate-forme spring.jpa.database ne fasse aucun mal.

Dans 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

Dans Application.java (ou une configuration):

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

Ensuite, vous pouvez accéder à la console H2 à l'adresse {server} / console /. Entrez ceci comme URL JDBC: jdbc: h2: mem: AZ

Aaron Zeckoski
la source
1
L'utilisation new WebServlet()me donne des problèmes. Quelle classe est-ce important pour vous? Il utilise javax.servlet.annotation.WebServlet pour moi comme la seule option et ce n'est qu'une interface.
Splaktar
5
Oh je l'ai, org.h2.server.web.WebServlet est celui qui est nécessaire. Mon projet n'était pas synchronisé avec Gradle pour intégrer les nouvelles bibliothèques h2.
Splaktar
21
Les éléments application.properties ne sont pas nécessaires. Vous pouvez simplement utiliser la partie Application.java que vous avez mise, puis vous connecter jdbc:h2:mem:testdbavec un nom d'utilisateur et un mot de passe vides. localhost: 8082 fonctionne avec cette configuration.
Splaktar
2
@Splaktar Merci! Je devenais fou d'essayer de comprendre comment me connecter et la pièce manquante du puzzle était d'utiliser "testdb" pour le nom de la base de données.
nerdherd
1
@Splaktar - vous devriez faire de votre commentaire la réponse. Comme vous l'avez dit, le code source d' EmbeddedDatabaseConnection affiche tous les URI de connexion DB intégrée par défaut
karthik m
55

À partir de Spring Boot 1.3.0.M3, la console H2 peut être configurée automatiquement.

Les prérequis sont:

  • Vous développez une application web
  • Les outils de développement Spring Boot sont activés
  • H2 est sur le chemin des classes

Même si vous n'utilisez pas Spring Boot Dev Tools, vous pouvez toujours configurer automatiquement la console en définissant spring.h2.console.enabledsurtrue

Consultez cette partie de la documentation pour tous les détails.

Notez que lors de la configuration de cette manière, la console est accessible à l' adresse: http: // localhost: 8080 / h2-console /

geoand
la source
Ou comme expliqué dans la documentation, vous l'activez avec spring.h2.console.enabled = true. Avec les conditions préalables, il est activé automatiquement.
keiki
Que signifie exactement Vous développez une application Web ?
garci560
Dans le contexte de Spring Boot, cela signifie que vous avez ajouté en spring-boot-starter-webtant que dépendance
geo et
1
Aussi, je pense que lorsque vous ouvrez localhost: 8080 / h2-console, vous devez écrire jdbc: h2: mem: testdb dans l'url jdbc pour voir vos tables. Et dans l'url localhost: 8080 / h2-console après localhost, vous devez spécifier le port de l'application.
anujprashar
3
@anujprashar Je suis presque sûr que jdbc:h2:mem:testdbc'est pour l'URL de connexion, pas pour l'URL où la console est accessible
geoand
44

J'ai trouvé un joli tutoriel sur ce sujet:

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

En gros, l'URL JDBC correcte pour moi était: jdbc:h2:mem:testdb

Krzysztof Kaczor
la source
1
question idiote mais cela semble être l'URL JDBC par défaut car le paramètre spring.datasource.name par défaut est testdb. Pourquoi si c'est le cas si je change le nom de la base de données en quelque chose comme foodb est le jdbc toujours le même et non jdbc: h2: mem: foodb
Dan Vega
2
Cette URL jdbc jdbc: h2: mem: testdb est correcte. Cela m'a aidé enfin à me connecter à la base de données par défaut créée par spring data jpa.
Kamal Joshi
Vous pouvez définir le nom de la base de données comme suit: spring.datasource.url = jdbc: h2: mem: test; in application.properties
Aleksei Maide
23

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

Console 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.

L'ajout des deux lignes ci-dessus à mon fichier application.properties était suffisant pour accéder à la console Web de la base de données H2, en utilisant le nom d'utilisateur (sa) et le mot de passe par défaut (vides, comme dans n'entrez pas de mot de passe lorsque l'interface utilisateur vous le demande).

mancini0
la source
1
Ne devrait pas l'être spring.h2.console.enabled=true? False le désactivera. Et spring.h2.console.path=/h2-consoleest redondant car /h2-consolec'est le chemin par défaut de Spring Boot. Selon la documentation "Par défaut, la console sera disponible dans / h2-console. Vous pouvez personnaliser le chemin de la console en utilisant la propriété spring.h2.console.path." Plus de détails ici docs.spring.io/spring-boot/docs/current/reference/html/…
georger
J'ai inclus cette dernière propriété pour montrer OP où il peut accéder à la console. Évidemment, spring.h2.console.enabled.enabled = false désactivera la console, le fait est que cela est configurable en tant que propriété. Je vais définir cette propriété sur true pour plus de clarté.
mancini0
20

Une réponse similaire avec le guide étape par étape.

  1. Ajoutez la dépendance des outils de développement à votre pom.xmloubuild.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. Accédez à la base de données depuis http://localhost:8080/h2-console/
  2. Spécifier jdbc:h2:mem:testdbcomme URL JDBC
  3. Vous devriez voir l'entité que vous avez spécifiée dans votre projet sous forme de tableau.
biniam
la source
2
l'ajout de ceci dans la section des dépendances a fonctionné pour moi 'runtime ("com.h2database: h2")'
Raja Nagendra Kumar
17

Je n'avais que les propriétés ci-dessous dans /resources/application.properties. Après avoir exécuté Spring Boot, en utilisant cette URL ( http: // localhost: 8080 / h2-console / ), la table dans la console H2 était visible et lue pour afficher les données de la table, vous pouvez également exécuter des commandes SQL simples. Une chose, dans votre code java, lors de la récupération des données, les noms de colonnes sont en majuscules, même si schema.sql utilise des noms en minuscules :)

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
la source
16

Pour Spring Boot 2.1.1 directement à partir de Spring Initialzr:

  1. La valeur par défaut avec devtools est http://127.0.0.1:8080/h2-console/

    • POM: spring-boot-starter, h2, spring-boot-starter-web, spring-boot-devtools
  2. Sans devtools - vous devez le définir dans les propriétés:spring.h2.console.enabled=true spring.h2.console.path=/h2-console

    • POM: ressort-démarrage-démarreur, h2, ressort-démarrage-démarreur-web

Une fois que vous y êtes - définissez l'URL JDBC: jdbc: h2: mem: testdb (celle par défaut ne fonctionnera pas)

Witold Kaczurba
la source
10

Si vous utilisez les outils de développement de Spring Boot, il est livré avec H2 Console activé par défaut. Il est accessible depuis /h2-console/. Sur l'interface de connexion, pour la JDBC URLvaleur d'utilisation d' entrée jdbc:h2:mem:testdb. Faites attention à la memchaîne.

Si vous n'utilisez pas les outils de développement de Spring Boot, vous pouvez activer la console en application.propertiesutilisant spring.h2.console.enabled=true. Cela activera la console sous /h2-console. Si vous souhaitez modifier l'URL, vous pouvez ajouter une autre entrée avec spring.h2.console.path=my_console_path.

Le nom du schéma par défaut est testdb.

Plus de détails dans la documentation de Spring Boot .

georger
la source
4
Pourquoi n'est pas jdbc:h2:mem:testdbdéfini comme URL jdbc par défaut? J'ai passé beaucoup de temps à me demander où mes entités jpa ont mal tourné
Sudip Bhandari
10

Vérifiez l'application de ressort.properties

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

ici testdb est défini par la base de données Assurez-vous que la console h2 a la même valeur tout en se connectant autrement, elle se connectera à la base de données par défaut

entrez la description de l'image ici

vaquar khan
la source
1
réponse impeccable!
gaurav le
6

Pour obtenir les tables, il vous suffit de créer 2 fichiers sql schema.sql (pour la création de table) et data.sql (données pour les tables créées). Ces fichiers doivent être placés dans le dossier src / main / resources. Spring boot les détecte automatiquement et s'occupe du reste pendant l'exécution.

Si vous utilisez plus de 2 DB dans votre projet, assurez-vous d'utiliser des fichiers spécifiques tels que (schema-h2.sql - pour h2 DB, schema-oracle.sql - pour oracle DB). La même chose à suivre pour data.sql aussi.

Assurez-vous également de supprimer les tables en ajoutant l'instruction drop table dans votre schema.sql en tant que première instruction. Pour éviter d'ajouter des enregistrements en double.

Le lien pour la botte à ressort est ici.

Mon application.properties est la suivante.

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

Vous pouvez suivre les étapes dans le lien ci-dessous.

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

kemparaj565
la source
"spring.jpa.hibernate.ddl-auto" deux fois avec des valeurs différentes ...
Yura
3

J'ai trouvé qu'avec spring boot 2.0.2.RELEASE, la configuration de spring-boot-starter-data-jpa et com.h2database dans le fichier POM n'est pas seulement suffisante pour que la console H2 fonctionne. Vous devez configurer spring-boot-devtools comme ci-dessous. Vous pouvez éventuellement suivre les instructions d'Aaron Zeckoski dans cet article

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

Utilisez jdbc: h2: mem: testdb comme chemin lors de la connexion à la console H2.

Évidemment, si vous avez modifié les propriétés de Spring Boot, votre source de données peut être différente, mais il semble que vous ayez du mal à trouver la valeur par défaut. C'est tout ce qu'on peut en dire! Vous verrez votre schéma après vous être connecté à H2.


la source
1

J'avais fait une erreur très stupide quand j'avais ce même problème. J'avais ajouté H2 DB pour l' exécution de cas de tests unitaires et donc j'avais mis l' scopeà testen pom.xml. Lors de l'exécution de l'application, mvn spring:runj'ai supprimé le scopeet cela fonctionne bien maintenant.

AbhishekB
la source
0

Pour Spring Boot 2.3.3.RELEASE directement à partir de Spring Initialzr:

POM: données jpa, h2, web

propriétés de l'application: spring.h2.console.enabled=true

Lorsque vous exécutez l'application, recherchez la ligne comme ci-dessous dans la console d'exécution:

2020-08-18 21:12:32.664  INFO 63256 --- [           main] o.s.b.a.h2.H2ConsoleAutoConfiguration    : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:eaa9d6da-aa2e-4ad3-9e5b-2b60eb2fcbc5'

Maintenant, utilisez l'URL JDBC ci-dessus pour h2-console et cliquez sur Connect.

RahulDeep Attri
la source