JdbcTemplate & SQL Scripts(data | schema.sql) | تنظیم دیتابیس و SQL در اسپرینگ
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
spring-boot-starter-jdbc
استارتر اختصاصی اسپرینگ بوت جهت اتصال به پایگاه داده با استفاده از JDBC که وابستگیهای ضروری شامل JdbcTemplate و مدیریت اتصال پیشفرض (HikariCP) را به صورت خودکار به Classpath اضافه میکند.
- Embedded Database
پایگاه داده سبک درونحافظهای (In-Memory) نظیر H2 که درون چرخه حیات خود نرمافزار اجرا میشود و دادههای موقت را در حافظه اصلی ذخیره میکند؛ گزینهای سریع و مناسب برای محیطهای توسعه و تست بدون نیاز به راهاندازی سرور مستقل پایگاه داده.
- H2 Console
یک ابزار مبتنی بر وب برای مشاهده، پیمایش جداول و اجرای مستقیم دستورات SQL روی دیتابیس H2 که با حضور ماژول spring-boot-devtools در آدرس پیشفرض /h2-console در دسترس قرار میگیرد.
- Fixed Datasource Name
پیکربندی عمدی نام دیتابیس با غیرفعالسازی ویژگی تولید نام تصادفی در تنظیمات نرمافزار (spring.datasource.generate-unique-name=false) برای ایجاد یک JDBC URL پایدار و مشخص مانند jdbc:h2:mem:tacocloud جهت اتصال دستی آسان از طریق ابزارهای گرافیکی و کنسول وب.
schema.sql
فایل استاندارد اسکریپت SQL که در مسیر ریشه Classpath (شاخه src/main/resources) قرار داده میشود و اسپرینگ بوت دستورات ایجاد جداول و ساختار دادهها (DDL) موجود در آن را در لحظه راهاندازی نرمافزار به صورت خودکار روی پایگاه داده اجرا میکند.
data.sql
فایل استاندارد اسکریپت SQL در مسیر Classpath برای بارگذاری و درج دادههای اولیه (DML یا Seed Data) که پس از ایجاد ساختار جداول به صورت خودکار توسط اسپرینگ بوت در زمان اجرای برنامه اعمال میشود.
- YAML Configuration
قالب ساختاریافته، سلسلهمراتبی و با خوانایی بالا جهت نگارش فایلهای تنظیمات در اسپرینگ بوت (application.yml) به عنوان جایگزینی برای ساختار سنتی کلید-مقدار در فایلهای application.properties.
موارد مصاحبه ای
- مکانیزم مقداردهی اولیه خودکار ساختار پایگاه داده در Spring Boot چیست؟
اسپرینگ بوت به طور خودکار فایلهای schema.sql را برای ایجاد و تغییر ساختار جداول و بلافاصله پس از آن فایل data.sql را برای بارگذاری دادههای پایه در هنگام بارگذاری کانتکست و اتصال به دیتابیس اجرا میکند.
- چرا نام دیتابیس H2 به طور پیشفرض در Spring Boot به صورت تصادفی تولید میشود و راه تثبیت آن چیست؟
به صورت پیشفرض اسپرینگ بوت برای جلوگیری از تداخل کانکشنها نامهای رندوم میسازد؛ اما برای داشتن یک JDBC URL ثابت جهت اتصال کنسول وب، باید ویژگی spring.datasource.generate-unique-name را روی false تنظیم کرده و نام مشخصی با spring.datasource.name معین نمود.
- تفاوت اصلی فایلهای schema.sql و data.sql در چرخه اجرای پایگاه داده چیست؟
فایل schema.sql حاوی دستورات تعریف داده (DDL) نظیر CREATE TABLE است و ساختار دیتابیس را پیریزی میکند؛ در حالی که data.sql حاوی دستورات دستکاری داده (DML) مانند INSERT است و پس از اجرای فایل شمای پایگاه داده، رکوردهای پیشفرض را تزریق مینماید.
- مزیت استفاده از فرمت YAML در مقایسه با properties چیست؟
فرمت YAML با استفاده از ساختار درختی و تورفتگی (Indentation) از تکرار پیشوندهای طولانی جلوگیری میکند، خوانایی بالاتری در پیکربندیهای چندسطحی دارد و به صورت ذاتی خوانایی بصری بهتری برای تنظیمات پیچیده فراهم میسازد.
- آیا دیتابیس درونحافظهای H2 برای محیط عملیاتی (Production) مناسب است؟
خیر؛ زیرا ماهیت Embedded و In-Memory آن موجب میشود با هر بار خاموش شدن یا ریاستارت برنامه، کل دادهها به طور کامل از بین بروند و همچنین ظرفیت و کارایی مورد نیاز برای بارهای پردازشی سنگین سازمانی را ندارد.
سناریو کاربردی
- راهاندازی پایگاه داده درونحافظهای همراه با ساختار خودکار و اتصال از طریق کنسول H2
در این سناریو، یک دیتابیس درونحافظهای با نام ثابت کانفیگ شده و ساختار جداول به همراه رکوردهای پیشفرض در هنگام بوت برنامه مقداردهی میشوند:
۱. پیکربندی نام پایگاه داده در فایل application.yml:
spring:
datasource:
generate-unique-name: false
name: tacocloud
h2:
console:
enabled: true
۲. تعریف جداول دیتابیس در فایل src/main/resources/schema.sql:
create table if not exists Ingredient (
id varchar(4) not null primary key,
name varchar(25) not null,
type varchar(10) not null
);
۳. درج دادههای پایه در فایل src/main/resources/data.sql:
insert into Ingredient (id, name, type)
values ('FLTO', 'Flour Tortilla', 'WRAP');
insert into Ingredient (id, name, type)
values ('COTO', 'Corn Tortilla', 'WRAP');
insert into Ingredient (id, name, type)
values ('GRBF', 'Ground Beef', 'PROTEIN');
با اجرای برنامه، اسپرینگ ابتدا ساختار جدول Ingredient را برپا کرده و سپس دادههای اولیه را در آن درج میکند. توسعهدهنده میتواند با مراجعه به آدرس مرورگر http://localhost:8080/h2-console و درج آدرس اتصال jdbc:h2:mem:tacocloud دادهها را مشاهده و بررسی کند.
بیشتر بدانید
- آدرس مستقیم ورود به دیتابیس در H2 Console
هنگام اتصال به کنسول H2 در مرورگر، فیلد JDBC URL باید دقیقاً مقدار تطبیق دادهشده با نام کانفیگ، یعنی jdbc:h2:mem:<database_name> باشد و نام کاربری پیشفرض معمولاً sa بدون رمز عبور است.
- تنظیم دامنه وابستگی H2 در بیلد ابزارها
توصیه میشود تگ <scope>runtime</scope> برای وابستگی H2 در فایل pom.xml تنظیم شود تا کدهای پروژه در زمان کامپایل به کتابخانههای داخلی دیتابیس وابسته نشوند و صرفاً در زمان اجرای برنامه حضور داشته باشند.
