درس اليوم رح نشوف كيف نعمل Integration للـ Database مع تطبيقنا. رح ننتقل من حفظ البيانات بالـ Memory لحفظها فعلياً بقاعدة البيانات.
أول خطوة هي تنزيل وتشغيل PostgreSQL. ابحث عن "PostgreSQL download" واختار نظام تشغيلك. الـ Installer رح ينزل أكثر من شيء، أهمه pgAdmin 4 اللي هو Client لعرض ومحاولة البيانات.
بعد التثبيت، افتح pgAdmin وأنشئ Database جديدة:
employee_systempostgresبالـ pom.xml لازم نضيف dependency اثنين:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
spring.datasource.url=jdbc:postgresql://localhost:5432/employee_system
spring.datasource.username=postgres
# spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
datasource.url - عنوان الـ Databaseاشترك في النشرة البريدية
دروس جديدة، مقالات، وأدوات مباشرة لبريدك.
ddl-auto=create - Hibernate ينشئ الجداول تلقائياً من الـ Entities عند كل Run (استخدم none في الـ Production)show-sql=true - يظهر الـ SQL Queries بالـ Consoleخيارات الـ ddl-auto:
| الخيار | المعنى |
|---|---|
create | يحذف الجداول القديمة وينشئ جديدة |
create-drop | ينشئ عند البدء ويحذف عند الإيقاف |
update | يعدل الجداول بدون حذف البيانات |
none | لا يفعل شي (للـ Production) |
@Entity
@Table(name = "employee")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
@Id
@GeneratedValue
@UuidGenerator
private UUID id;
@Column(name = "first_name", nullable = false, length = 100)
private String firstName;
@Column(name = "last_name", nullable = false, length = 100)
private String lastName;
@Column(name = "email", nullable = false, unique = true)
private String email;
@Column(name = "phone_number", length = 25)
private String phoneNumber;
@Column(name = "hire_date", nullable = false)
private LocalDate hireDate;
@Column(name = "position", nullable = false, length = 100)
private String position;
@Column(name = "department_id")
private UUID departmentId;
}الـ Annotations المهمة:
@Entity - يخبر Hibernate إنو هذا الكلاس هو جدول بالـ Database@Table(name = "employee") - يحدد اسم الجدول@Id - يحدد الـ Primary Key@GeneratedValue + @UuidGenerator - Hibernate ينشئ الـ UUID تلقائياً@Column - يضبط تفاصيل العمود (الاسم، nullable، unique، length)@NoArgsConstructor - Hibernate يحتاج Constructor بدون Parametersالـ Repository هي طبقة للتواصل مع الـ Database:
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, UUID> {
}JpaRepository<Employee, UUID> - Generic بياخذ نوع الـ Entity ونوع الـ Primary Keysave(), findAll(), findById(), deleteById() وكثير غيرهابنضيف الـ Repository بالـ Service ونستخدمه بدل الـ ArrayList:
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
@Override
public List<Employee> findAll() {
return employeeRepository.findAll();
}
@Override
public Employee findOne(UUID employeeId) {
return employeeRepository.findById(employeeId)
.orElseThrow(() -> CustomResponseException.resourceNotFound(
"Employee with ID " + employeeId + " not found"
));
}
@Override
public Employee create(EmployeeCreate dto) {
Employee employee = new Employee();
employee.setFirstName(dto.firstName());
// ... باقي الخصائص
return employeeRepository.save(employee);
}
@Override
public Employee updateOne(UUID employeeId, EmployeeUpdate dto) {
Employee existing = findOne(employeeId);
existing.setFirstName(dto.firstName());
// ... باقي الخصائص
return employeeRepository.save(existing);
}
@Override
public void deleteOne(UUID employeeId) {
Employee employee = findOne(employeeId);
employeeRepository.deleteById(employee.getId());
}
}لاحظ في الـ updateOne: الـ save() بتعرف تلقائياً إنو هذا Update مش Insert لأن الـ ID موجود. ما تنسى تعمل save() بعد التعديل وإلا ما رح تنحفظ التغييرات.
بعد تشغيل التطبيق، افتح pgAdmin وتحقق من الجداول:
Schemas > public > Tablesemployee تم إنشاؤهView/Edit Data > All Rows لتشوف البياناتالبيانات اللي بتضيفها عبر API رح تظهر مباشرة بالجدول.
بالدرس الجاي رح نبني الـ Department Entity ونربطها مع الـ Employee.