Spring Data JDBC | اسپرینگ دیتا جی دی بی سی
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
- Spring Data
پروژه بزرگ و جامع اسپرینگ که زیرپروژههای متعددی را برای ذخیرهسازی دادهها (Persistence) در انواع دیتابیسهای رابطهای و غیررابطهای (مانند JDBC، JPA، MongoDB، Neo4j) مدیریت میکند و هدف اصلی آن سادهسازی تعامل با پایگاه داده است.
- Spring Data JDBC
ماژولی از Spring Data که هدف آن فراهم کردن یک لایه انتزاعی بسیار ساده برای کار با پایگاههای داده رابطهای از طریق JDBC است، بدون آنکه پیچیدگیهای سنگین ORMهای کامل مانند Hibernate را داشته باشد.
- CrudRepository
یک اینترفیس پایه ارائه شده توسط Spring Data که متدهای استاندارد برای عملیات ایجاد، خواندن، بهروزرسانی و حذف (CRUD) را به صورت پیشفرض تعریف کرده است. با ارثبری ریپازیتوریهای پروژه از این اینترفیس، نیازی به پیادهسازی دستی متدها نخواهید داشت.
- Annotations
انوتیشنها نقش حیاتی در نگاشت کلاسهای دامنه (Domain Classes) به جداول دیتابیس دارند. انوتیشن @Table برای مشخص کردن نام جدول (در صورت عدم تطابق با نام کلاس)، @Id برای تعیین کلید اصلی موجودیت، و @Column برای نگاشت اختصاصی ویژگیهای کلاس به ستونهای دیتابیس استفاده میشوند.
- Automatic Implementation
قابلیت کلیدی Spring Data که در زمان اجرا (Run time)، پیادهسازی لازم برای اینترفیسهای ریپازیتوری شما را به صورت خودکار تولید میکند. این ویژگی باعث حذف کدهای تکراری (Boilerplate Code) و کلاسهای پیادهسازی دستی (مانند JdbcIngredientRepository) میشود.
موارد مصاحبه ای
- تفاوت اصلی استفاده از
JdbcTemplateدر برابرSpring Data JDBCچیست؟
JdbcTemplate یک سطح پایینتر است و برنامهنویس باید دستورات SQL و نگاشت دادهها (Mapping) را به صورت دستی مدیریت کند؛ اما Spring Data JDBC با ارثبری از CrudRepository و استفاده از Proxyها، پیادهسازیهای مورد نیاز را در زمان اجرا تولید کرده و کدهای تکراری را به حداقل میرساند.
- چگونه
Spring Dataمتوجه میشود که باید پیادهسازی یک اینترفیس را تولید کند؟
کافی است اینترفیسهای ریپازیتوری شما از یکی از اینترفیسهای پایه Spring Data (مانند Repository یا CrudRepository) ارثبری کنند. اسپرینگ در زمان بوت شدن اپلیکیشن، این اینترفیسها را شناسایی و کلاسهای پیادهسازی آنها را به صورت پویا تولید میکند.
- آیا استفاده از
@Tableدر کلاسهای دامنه الزامی است؟
خیر؛ به صورت پیشفرض Spring Data نام کلاس را به نام جدول متناظر نگاشت میکند. استفاده از @Table فقط زمانی ضروری است که بخواهید نام جدول در دیتابیس متفاوت از نام کلاس باشد (مثلاً نگاشت TacoOrder به Taco_Cloud_Order).
- چرا با مهاجرت به
Spring Data JDBCمیتوان کلاسهای پیادهسازی دستی مانندJdbcOrderRepositoryرا حذف کرد؟
چون Spring Data تمام متدهای استاندارد تعریف شده در CrudRepository را به صورت خودکار پیادهسازی میکند. شما فقط نیاز به تعریف اینترفیس دارید و نیازی به نوشتن کلاسهای Jdbc... که حاوی کدهای خستهکننده SQL بودند نیست.
سناریو کاربردی
- مهاجرت از کدهای سنتی
JdbcTemplateبهSpring Data JDBC
این سناریو شامل چهار گام اساسی برای کاهش کدهای پایگاه داده در یک پروژه اسپرینگ است:
۱. بهروزرسانی وابستگیها (Dependencies): ابتدا باید spring-boot-starter-jdbc را از فایل pom.xml حذف کرده و spring-boot-starter-data-jdbc را جایگزین کنید (وابستگی H2 باید باقی بماند).
۲. تغییر اینترفیسهای ریپازیتوری: اینترفیسهای موجود (مانند IngredientRepository) را طوری تغییر دهید که از CrudRepository ارثبری کنند. این کار باعث میشود متدهایی مانند findAll() و findById() بدون پیادهسازی دستی در دسترس باشند.
۳. افزودن انوتیشن به موجودیتها (Domain Classes): کلاسهای مدل خود را با @Id (برای مشخص کردن کلید اصلی) و در صورت نیاز با @Table و @Column جهت نگاشت دقیق نامها به جداول و ستونهای دیتابیس نشانه گذاری کنید.
۴. حذف کلاسهای پیادهسازی: تمامی کلاسهای دستی که پیشتر با JdbcTemplate پیاده کرده بودید (مانند JdbcIngredientRepository و JdbcOrderRepository) را با خیال راحت حذف کنید، چرا که پیادهسازی آنها اکنون به عهده فریمورک است.
بیشتر بدانید
- مدیریت نامگذاری ستونها
اگر نام ویژگی کلاس شما با نام ستون دیتابیس متفاوت است (مثلاً deliveryName در جاوا و customer_name در دیتابیس)، از انوتیشن @Column("customer_name") بر روی فیلد مربوطه در کلاس دامنه استفاده کنید تا اسپرینگ نگاشت صحیح را انجام دهد.
- ترکیب وابستگیها
دقت کنید که Spring Data JDBC یک Starter جدید است و نباید با Spring JDBC قدیمی در یک پروژه ترکیب شود؛ زیرا این کار باعث تداخل در مدیریت تراکنشها و پیادهسازیها میشود.
- اشیاء بدون کلید اصلی
کلاسهایی که صرفاً برای ارتباط بین دو موجودیت هستند (مانند IngredientRef) و ستون شناسهی خاصی ندارند، نیازی به انوتیشن @Id ندارند؛ Spring Data به راحتی آنها را به عنوان جداول واسط مدیریت میکند.
