spring boot koneksi jdbc H2 default (dan konsol H2)

108

Saya hanya mencoba untuk melihat konten database H2 untuk database H2 tertanam yang dibuat oleh spring-boot ketika saya tidak menentukan apa pun di application.properties saya dan mulai dengan mvn spring: run. Saya dapat melihat JPA hibernasi membuat tabel tetapi jika saya mencoba mengakses konsol h2 di URL di bawah database tidak memiliki tabel.

http://localhost:8080/console/

Saya melihat saran seperti ini: Lihat konten database H2 tertanam yang dimulai oleh Spring

Tapi saya tidak tahu di mana harus meletakkan XML yang disarankan di musim semi-boot dan bahkan jika saya melakukannya, saya tidak ingin h2console tersedia lagi ketika database eksternal dikonfigurasi sehingga kemungkinan besar saya perlu menangani ini dengan beberapa jenis kode bersyarat (atau mungkin hanya mengizinkan pegas untuk secara otomatis menanganinya dalam kasus yang paling ideal di mana saya hanya menyertakan H2 ketika profil maven diaktifkan).

Apakah ada yang punya beberapa contoh kode yang menunjukkan bagaimana untuk mendapatkan konsol H2 bekerja di boot (dan juga cara untuk mengetahui apa yang menggunakan string koneksi jdbc musim semi)?

Aaron Zeckoski
sumber
Saya dapat menjawab sebagian pertanyaan saya sendiri dengan menambahkan ini ke application.properties saya: 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 = Tapi yang benar-benar ingin saya ketahui adalah bagaimana mengelola konfigurasi secara terprogram (atau setidaknya cara mengetahui default pegas)
Aaron Zeckoski
1
geoand - Itu adalah hal yang sama yang saya tautkan dalam pertanyaan sebenarnya jadi saya khawatir itu tidak membantu.
Aaron Zeckoski
2
Dave - Dengan menambahkan konfigurasi itu saya dapat mengakses konsol H2 dan melihat tabel tetapi tidak membantu saya memahami apakah itu cara yang benar untuk melakukannya (saya lebih suka mengakses satu pengaturan pada musim semi ketika saya tidak memilikinya pengaturan) atau cara mendapatkan pegas koneksi JDBC menggunakan.
Aaron Zeckoski
1
Gunakan URL JDBC: jdbc: h2: mem: testdb
Chinmoy

Jawaban:

110

Ini adalah bagaimana saya membuat konsol H2 bekerja di boot musim semi dengan H2. Saya tidak yakin apakah ini benar tetapi karena tidak ada orang lain yang menawarkan solusi maka saya akan menyarankan ini adalah cara terbaik untuk melakukannya.

Dalam kasus saya, saya memilih nama spesifik untuk database sehingga saya memiliki sesuatu untuk dimasukkan saat memulai konsol H2 (dalam hal ini, "AZ"). Saya pikir semua ini diperlukan meskipun sepertinya meninggalkan platform spring.jpa.database tidak merugikan apa pun.

Dalam 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

Di Application.java (atau beberapa konfigurasi):

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

Kemudian Anda dapat mengakses konsol H2 di {server} / console /. Masukkan ini sebagai URL JDBC: jdbc: h2: mem: AZ

Aaron Zeckoski
sumber
1
Menggunakan new WebServlet()beri saya masalah. Kelas mana yang diimpor ini untuk Anda? Ini menarik javax.servlet.annotation.WebServlet bagi saya sebagai satu-satunya pilihan dan itu hanya sebuah antarmuka.
Splaktar
5
Oh saya mengerti, org.h2.server.web.WebServlet adalah yang dibutuhkan. Proyek saya tidak sinkron dengan Gradle untuk menarik perpustakaan h2 baru.
Splaktar
21
Potongan application.properties tidak diperlukan. Anda cukup menggunakan bagian Application.java yang Anda masukkan, lalu sambungkan jdbc:h2:mem:testdbdengan nama pengguna kosong dan kata sandi kosong. localhost: 8082 bekerja dengan pengaturan ini.
Splaktar
2
@Splaktar Terima kasih! Saya menjadi gila mencoba mencari cara untuk menghubungkan dan bagian yang hilang dari teka-teki adalah menggunakan "testdb" untuk nama database.
nerdherd
1
@Splaktar - Anda harus memberi jawaban pada komentar Anda. Seperti yang Anda katakan, kode sumber untuk EmbeddedDatabaseConnection menunjukkan semua URI Koneksi DB Tersemat default
karthik m
55

Sejak Spring Boot 1.3.0.M3, konsol H2 dapat dikonfigurasi secara otomatis.

Prasyaratnya adalah:

  • Anda sedang mengembangkan aplikasi web
  • Alat Pengembang Spring Boot diaktifkan
  • H2 ada di jalur kelas

Meskipun Anda tidak menggunakan Spring Boot Dev Tools, Anda masih dapat mengkonfigurasi konsol secara otomatis dengan mengatur spring.h2.console.enabledketrue

Periksa ini bagian dari dokumentasi untuk semua rincian.

Perhatikan bahwa ketika mengonfigurasi dengan cara ini, konsol dapat diakses di: http: // localhost: 8080 / h2-console /

geoand
sumber
Atau seperti yang dijelaskan di dokumen Anda mengaktifkannya dengan spring.h2.console.enabled = true. Dengan prasyarat itu diaktifkan secara otomatis.
keiki
Apa sebenarnya maksud Anda mengembangkan aplikasi web ?
garci560
Dalam konteks Spring Boot, itu berarti Anda telah menambahkan spring-boot-starter-websebagai dependensi
geo dan
1
Juga saya pikir ketika Anda membuka localhost: 8080 / h2-console Anda perlu menulis jdbc: h2: mem: testdb di url jdbc untuk melihat tabel Anda. Dan di url localhost: 8080 / h2-console setelah localhost Anda perlu menentukan port aplikasi.
anujprashar
3
@anujprashar Saya cukup yakin jdbc:h2:mem:testdbini untuk URL koneksi, bukan untuk URL yang konsolnya dapat diakses
geoand
44

Saya telah menemukan tutorial bagus tentang topik ini:

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

Pada dasarnya, URL JDBC yang benar untuk saya adalah: jdbc:h2:mem:testdb

Krzysztof Kaczor
sumber
1
pertanyaan bodoh tetapi ini tampaknya menjadi URL JDBC default karena pengaturan spring.datasource.name default ke testdb. Mengapa jika demikian jika saya mengubah nama db menjadi sesuatu seperti foodb adalah jdbc masih sama dan tidak jdbc: h2: mem: foodb
Dan Vega
2
Url jdbc ini jdbc: h2: mem: testdb benar. Itu membantu saya akhirnya terhubung ke database default yang dibuat oleh data musim semi jpa.
Kamal Joshi
Anda dapat mengatur nama db seperti: spring.datasource.url = jdbc: h2: mem: test; di application.properties
Aleksei Maide
23

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

H2 Web Console (H2ConsoleProperties):

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

Menambahkan dua baris di atas ke file application.properties saya sudah cukup untuk mengakses konsol web database H2, menggunakan nama pengguna default (sa) dan kata sandi (kosong, seperti di jangan masukkan kata sandi ketika ui meminta Anda).

mancini0
sumber
1
Tidak seharusnya spring.h2.console.enabled=true? False akan menonaktifkannya. Dan spring.h2.console.path=/h2-consolemubazir karena /h2-consolemerupakan jalur default dari Spring Boot. Sesuai dokumentasi "Secara default, konsol akan tersedia di / h2-console. Anda dapat menyesuaikan jalur konsol menggunakan properti spring.h2.console.path." Detail selengkapnya di sini docs.spring.io/spring-boot/docs/current/reference/html/…
georger
Saya menyertakan properti terakhir untuk menunjukkan OP di mana dia dapat mengakses konsol. Jelas spring.h2.console.enabled.enabled = false akan menonaktifkan konsol, intinya adalah ini dapat dikonfigurasi sebagai properti. Saya akan menyetel properti itu ke true untuk kejelasan.
mancini0
20

Jawaban serupa dengan panduan Langkah demi Langkah.

  1. Tambahkan ketergantungan alat Pengembang ke pom.xmlataubuild.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. Akses db dari http://localhost:8080/h2-console/
  2. Tentukan jdbc:h2:mem:testdbsebagai URL JDBC
  3. Anda akan melihat entitas yang Anda tentukan dalam proyek Anda sebagai tabel.
biniam
sumber
2
menambahkan ini di bagian ketergantungan berhasil untuk saya 'runtime ("com.h2database: h2")'
Raja Nagendra Kumar
17

Saya hanya memiliki properti di bawah ini di /resources/application.properties. Setelah menjalankan boot musim semi, menggunakan URL ini ( http: // localhost: 8080 / h2-console / ), tabel di konsol H2 terlihat dan dibaca untuk melihat data tabel, Anda juga dapat menjalankan perintah SQL sederhana. Satu hal, dalam kode java Anda, saat mengambil data, nama kolom menggunakan huruf besar, meskipun schema.sql menggunakan nama huruf kecil :)

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
sumber
16

Untuk Spring Boot 2.1.1 langsung dari Spring Initialzr:

  1. Default dengan devtools adalah http://127.0.0.1:8080/h2-console/

    • POM: spring-boot-starter, h2, spring-boot-starter-web, spring-boot-devtools
  2. Tanpa alat pengembang - Anda perlu menyetelnya di properti:spring.h2.console.enabled=true spring.h2.console.path=/h2-console

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

Setelah Anda sampai di sana - setel URL JDBC: jdbc: h2: mem: testdb (yang default tidak akan berfungsi)

Witold Kaczurba
sumber
10

Jika Anda menggunakan alat pengembang Spring Boot, itu datang dengan H2 Console diaktifkan secara default. Ini dapat diakses dari /h2-console/. Pada antarmuka login, untuk JDBC URLnilai pakai input jdbc:h2:mem:testdb. Perhatikan memsenar.

Jika Anda tidak menggunakan alat pengembang Spring Boot, Anda dapat mengaktifkan konsol dalam application.propertiesmenggunakan spring.h2.console.enabled=true. Ini akan mengaktifkan konsol di bawah /h2-console. Jika Anda ingin mengubah URL, Anda dapat menambahkan entri lain dengan spring.h2.console.path=my_console_path.

Nama skema default adalah testdb.

Detail selengkapnya di Dokumentasi Spring Boot .

georger
sumber
4
Mengapa jdbc:h2:mem:testdburl jdbc tidak disetel sebagai default? Saya menghabiskan banyak waktu untuk memikirkan di mana kesalahan entitas jpa saya
Sudip Bhandari
10

Periksa properti aplikasi musim semi

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

di sini testdb adalah database yang ditentukan Pastikan konsol h2 memiliki nilai yang sama saat menghubungkan jika tidak maka akan terhubung ke db default

masukkan deskripsi gambar di sini

vaquar khan
sumber
1
jawaban yang sempurna!
gaurav
6

Untuk mendapatkan tabel yang perlu Anda lakukan adalah membuat 2 file sql schema.sql (untuk pembuatan tabel) dan data.sql (data untuk tabel yang dibuat). File-file ini akan ditempatkan di folder src / main / resources. Spring boot otomatis mendeteksi mereka dan menangani sisanya selama runtime.

Jika Anda menggunakan lebih dari 2 DB dalam proyek Anda, pastikan untuk menggunakan file tertentu seperti (schema-h2.sql - untuk h2 DB, schema-oracle.sql - untuk oracle DB). Hal yang sama juga harus diikuti untuk data.sql.

Juga pastikan bahwa Anda menghapus tabel dengan menambahkan pernyataan drop table di schema.sql Anda sebagai pernyataan pertama. Untuk menghindari penambahan catatan duplikat.

Tautan untuk sepatu bot musim semi ada di sini.

Application.properties saya adalah sebagai berikut.

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

Anda dapat mengikuti langkah-langkah di tautan di bawah ini.

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

kemparaj565
sumber
"spring.jpa.hibernate.ddl-auto" dua kali dengan nilai yang berbeda ...
Yura
3

Saya menemukan bahwa dengan boot musim semi 2.0.2.RELEASE, mengkonfigurasi spring-boot-starter-data-jpa dan com.h2database di file POM tidak hanya cukup untuk menjalankan konsol H2. Anda harus mengkonfigurasi spring-boot-devtools seperti di bawah ini. Opsional Anda bisa mengikuti instruksi dari Aaron Zeckoski di posting ini

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

Gunakan jdbc: h2: mem: testdb sebagai jalur Anda saat masuk ke konsol H2.

Jelas jika Anda telah mengubah properti Spring Boot, sumber data Anda mungkin berbeda, tetapi sepertinya Anda kesulitan menemukan defaultnya. Hanya itu yang ada untuk itu! Anda akan melihat skema Anda setelah masuk ke H2.


sumber
1

Saya telah membuat kesalahan yang sangat bodoh ketika saya mengalami masalah yang sama. Saya telah menambahkan H2 DB untuk menjalankan uji kasus unit dan karenanya saya telah menetapkan scopeuntuk testdi pom.xml. Saat menjalankan aplikasi menggunakan mvn spring:runsaya menghapus scopedan berfungsi dengan baik sekarang.

AbhishekB
sumber
0

Untuk Spring Boot 2.3.3. LEPASKAN langsung dari Spring Initialzr:

POM: data jpa, h2, web

properti aplikasi: spring.h2.console.enabled=true

Ketika Anda menjalankan aplikasi, cari baris seperti di bawah ini di konsol run:

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'

Sekarang gunakan URL JDBC di atas untuk h2-console dan klik Connect.

RahulDeep Attri
sumber