انتقل إلى المحتوى الرئيسي

TP2.2 - قاعدة بيانات H2

الأهداف​

  • فهم الفرق بين قاعدة البيانات في الذاكرة والدائمة
  • إنشاء كيان JPA ومستودع
  • استخدام الطرق الأربعة الأساسية لـ CRUD (save, findById, findAll, deleteById)
  • الوصول إلى وحدة تحكم H2

الجزء 1: H2 في الذاكرة (بيانات مؤقتة)​

1.1 إنشاء المشروع​

اذهب إلى: https://start.spring.io/

التكوين:

  • Project: Maven
  • Language: Java
  • Spring Boot: 3.2.0+
  • Group: com.example
  • Artifact: h2-memoire
  • Java: 17

التبعيات:

  • Spring Web
  • H2 Database
  • Spring Data JPA

توليد وفك الضغط في مساحة العمل الخاصة بك.


1.2 إنشاء الكيان Employee​

الملف: src/main/java/com/example/h2memoire/model/Employee.java

package com.example.h2memoire.model;

import jakarta.persistence.*;

@Entity
@Table(name = "tbl_employees")
public class Employee {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String firstName;
private String lastName;
private String email;

// Constructeurs
public Employee() {
}

public Employee(String firstName, String lastName, String email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}

// Getters et Setters
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }

public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }

public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }

public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}

1.3 إنشاء المستودع​

الملف: src/main/java/com/example/h2memoire/repository/EmployeeRepository.java

package com.example.h2memoire.repository;

import com.example.h2memoire.model.Employee;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
// Méthodes héritées: save(), findById(), findAll(), deleteById()
}

1.4 التكوين​

الملف: src/main/resources/application.properties

# Console H2
spring.h2.console.enabled=true

# Base de données en MÉMOIRE
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

# Hibernate
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true

1.5 تشغيل التطبيق​

mvn clean install -DskipTests spring-boot:run

1.6 وحدة تحكم H2​

URL: http://localhost:8080/h2-console/

الاتصال:

  • JDBC URL: jdbc:h2:mem:testdb
  • Username: sa
  • Password: (فارغ)

1.7 اختبار CRUD​

CREATE - إدراج:

INSERT INTO TBL_EMPLOYEES (FIRST_NAME, LAST_NAME, EMAIL) 
VALUES ('Jean', 'Tremblay', 'jean@example.com');

INSERT INTO TBL_EMPLOYEES (FIRST_NAME, LAST_NAME, EMAIL)
VALUES ('Marie', 'Gagnon', 'marie@example.com');

READ - استعلام:

SELECT * FROM TBL_EMPLOYEES;

UPDATE - تعديل:

UPDATE TBL_EMPLOYEES 
SET EMAIL = 'nouveau@example.com'
WHERE FIRST_NAME = 'Jean';

DELETE - حذف:

DELETE FROM TBL_EMPLOYEES WHERE ID = 1;

1.8 اختبار الاستمرارية​

اختبار 1: قطع الاتصال/إعادة الاتصال

  • قطع الاتصال بـ H2
  • لا توقف التطبيق
  • إعادة الاتصال
  • النتيجة: ✅ البيانات لا تزال موجودة

اختبار 2: إيقاف/إعادة تشغيل

  • أوقف التطبيق (Ctrl + C)
  • أعد التشغيل: mvn clean install -DskipTests spring-boot:run
  • إعادة الاتصال
  • النتيجة: ❌ الجدول فارغ (البيانات مفقودة)

لماذا؟ وضع الذاكرة + ddl-auto=create-drop


الجزء 2: H2 دائمة (بيانات على القرص)​

2.1 مشروع جديد​

الخيار 1: نسخ مشروع h2-memoire وإعادة تسميته إلى h2-persistance

الخيار 2: إنشاء مشروع جديد من Spring Initializr


2.2 نسخ الكيان والمستودع​

انسخ نفس الملفات Employee.java و EmployeeRepository.java من الجزء 1.


2.3 التكوين المعدل​

الملف: src/main/resources/application.properties

# Console H2
spring.h2.console.enabled=true

# Base de données sur DISQUE (différence clé)
spring.datasource.url=jdbc:h2:file:C:/temp/test;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

# Hibernate
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

التغييرات الرئيسية:

  • jdbc:h2:mem: → jdbc:h2:file:C:/temp/test
  • ddl-auto=create-drop → ddl-auto=update

2.4 تشغيل التطبيق​

mvn clean install -DskipTests spring-boot:run

2.5 وحدة تحكم H2​

URL: http://localhost:8080/h2-console/

الاتصال:

  • JDBC URL: jdbc:h2:file:C:/temp/test
  • Username: sa
  • Password: (فارغ)

2.6 اختبار CRUD​

INSERT INTO TBL_EMPLOYEES (FIRST_NAME, LAST_NAME, EMAIL) 
VALUES ('Pierre', 'Roy', 'pierre@example.com');

SELECT * FROM TBL_EMPLOYEES;

2.7 اختبار الاستمرارية​

اختبار: إيقاف/إعادة تشغيل

  1. أدخل البيانات
  2. أوقف التطبيق (Ctrl + C)
  3. أعد التشغيل: mvn clean install -DskipTests spring-boot:run
  4. إعادة الاتصال
  5. النتيجة: ✅ البيانات لا تزال موجودة!

التحقق من الملف:

  • اذهب إلى C:\temp\
  • تم إنشاء ملف test.mv.db (قاعدة البيانات الخاصة بك)

مقارنة: الذاكرة مقابل الملف​

الجانبوضع الذاكرةوضع الملف
URLjdbc:h2:mem:testdbjdbc:h2:file:C:/temp/test
ddl-autocreate-dropupdate
الاستمرارية❌ لا✅ نعم
ملف .mv.dbلم يتم إنشاؤهتم إنشاؤه على القرص
الاستخداماختبارات، تطويرتطوير مع البيانات

ملخص​

النقاط الرئيسية​

  • كيان JPA مع @Entity و @Table - Hibernate ينشئ الجدول تلقائيًا
  • المستودع مع JpaRepository - 4 طرق CRUD مجانية
  • H2 في الذاكرة - سريع ولكن مؤقت
  • H2 في الملف - استمرارية البيانات على القرص
  • وحدة تحكم H2 - واجهة لاختبار CRUD

4 طرق CRUD الأساسية​

الطريقةالإجراء
save(entity)CREATE / UPDATE
findById(id)READ واحد
findAll()READ الكل
deleteById(id)DELETE

تمرين​

أنشئ كيانًا جديدًا Product:

  • id, name, price, quantity
  • ProductRepository
  • اختبر في وضع الذاكرة
  • اختبر في وضع الملف

العودة إلى الوحدة 2