الگوی طراحی DAO در جاوا / بوت بهار

الگوی طراحی DAO (Data Access Object) یک روش محبوب برای جداسازی لایه پایداری از بقیه برنامه شما است. این روشی برای انتزاع کردن جزئیات عملیات پایگاه داده فراهم می کند و به بهبود قابلیت نگهداری و آزمایش پذیری کد شما کمک می کند.
در این پست وبلاگ، الگوی DAO را در Java/Spring Boot بررسی میکنیم و نمونههایی از کدها را برای توضیح نحوه عملکرد آن ارائه میکنیم.
راه اندازی پروژه
برای شروع کار با الگوی DAO در Java/Spring Boot، باید یک پروژه Spring Boot جدید ایجاد کنید و وابستگی های لازم را در آن لحاظ کنید. در اینجا یک مثال است pom.xml فایل:
<dependencies>
<!-- Spring Boot dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- H2 database for testing -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
در این مثال، ما را گنجانده ایم spring-boot-starter-web و spring-boot-starter-data-jpa وابستگی ها، که مؤلفه های لازم برای ساخت یک برنامه وب با دسترسی به پایگاه داده را فراهم می کند. ما همچنین شامل h2 وابستگی پایگاه داده برای اهداف آزمایشی
تعریف موجودیت ها
در الگوی DAO، موجودیت ها POJO هایی هستند که به جداول در یک پایگاه داده رابطه ای نگاشت می شوند. برای تعریف یک موجودیت در Spring Boot، باید یک کلاس با حاشیه نویسی مناسب ایجاد کنید، مانند @Entity، @Table، و @Id. در اینجا یک مثال است:
@Entity
@Table(name = "customers")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
// getters and setters
}
در این مثال، a را تعریف کرده ایم Customer موجودی که به a نگاشت می شود customers جدول در پایگاه داده ما استفاده کرده ایم @Id و @GeneratedValue حاشیه نویسی برای مشخص کردن کلید اصلی و گنجانده شده است firstName و lastName زمینه های.
تعریف رابط های DAO
هنگامی که موجودیت های خود را تعریف کردید، می توانید واسط های DAO ایجاد کنید که عملیات قابل انجام در پایگاه داده را تعریف می کند. در اینجا یک مثال رابط DAO برای این است Customer وجود، موجودیت:
public interface CustomerDao {
List<Customer> getAll();
Optional<Customer> getById(Long id);
Customer save(Customer customer);
void delete(Customer customer);
}
در این مثال، a را تعریف کرده ایم CustomerDao رابطی که شامل روش هایی برای به دست آوردن همه مشتریان، دریافت مشتری با شناسه، ذخیره مشتری و حذف مشتری است.
پیاده سازی رابط های DAO
برای پیاده سازی یک رابط DAO، باید کلاسی ایجاد کنید که پیاده سازی واقعی متدها را ارائه دهد. در اینجا یک نمونه از پیاده سازی است CustomerDao رابط:
@Repository
public class CustomerDaoImpl implements CustomerDao {
@Autowired
private EntityManager entityManager;
@Override
public List<Customer> getAll() {
return entityManager.createQuery("SELECT c FROM Customer c", Customer.class).getResultList();
}
@Override
public Optional<Customer> getById(Long id) {
return Optional.ofNullable(entityManager.find(Customer.class, id));
}
@Override
public Customer save(Customer customer) {
return entityManager.merge(customer);
}
@Override
public void delete(Customer customer) {
entityManager.remove(customer);
}
}
در این مثال، ما را پیاده سازی کرده ایم CustomerDao رابط با استفاده از EntityManager توسط اجرای JPA Spring Boot ارائه شده است. ما استفاده کرده ایم @Repository حاشیه نویسی نشان می دهد که این کلاس باید به عنوان یک جزء مخزن توسط Spring Boot در نظر گرفته شود.
این getAll() روش استفاده می کند createQuery() روش از EntityManager برای بازیابی همه Customer موجودیت ها از پایگاه داده این getById() روش استفاده می کند find() روش از EntityManager برای بازیابی a Customer نهاد با شناسه این save() روش استفاده می کند merge() روش از EntityManager برای ذخیره یک جدید یا به روز شده Customer موجودیت در پایگاه داده این delete() روش استفاده می کند remove() روش از EntityManager برای حذف a Customer موجودیت از پایگاه داده
استفاده از رابط های DAO
اکنون که رابط DAO خود را تعریف و پیاده سازی کرده ایم، می توانیم از آن در برنامه خود برای انجام عملیات پایگاه داده استفاده کنیم. در اینجا مثالی از نحوه استفاده از آن آورده شده است CustomerDao رابط در کلاس کنترلر:
@RestController
@RequestMapping("/customers")
public class CustomerController {
@Autowired
private CustomerDao customerDao;
@GetMapping
public List<Customer> getAllCustomers() {
return customerDao.getAll();
}
@GetMapping("/{id}")
public ResponseEntity<Customer> getCustomerById(@PathVariable Long id) {
Optional<Customer> customer = customerDao.getById(id);
if (customer.isPresent()) {
return ResponseEntity.ok(customer.get());
} else {
return ResponseEntity.notFound().build();
}
}
@PostMapping
public ResponseEntity<Customer> createCustomer(@RequestBody Customer customer) {
Customer savedCustomer = customerDao.save(customer);
return ResponseEntity.created(URI.create("/customers/" + savedCustomer.getId())).body(savedCustomer);
}
@PutMapping("/{id}")
public ResponseEntity<Customer> updateCustomer(@PathVariable Long id, @RequestBody Customer customer) {
Optional<Customer> existingCustomer = customerDao.getById(id);
if (existingCustomer.isPresent()) {
customer.setId(id);
Customer savedCustomer = customerDao.save(customer);
return ResponseEntity.ok(savedCustomer);
} else {
return ResponseEntity.notFound().build();
}
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteCustomer(@PathVariable Long id) {
Optional<Customer> customer = customerDao.getById(id);
if (customer.isPresent()) {
customerDao.delete(customer.get());
return ResponseEntity.noContent().build();
} else {
return ResponseEntity.notFound().build();
}
}
}
در این مثال، ما یک را ایجاد کرده ایم CustomerController کلاسی که از CustomerDao رابط برای انجام عملیات CRUD (ایجاد، خواندن، به روز رسانی، حذف) بر روی Customer** وجود، موجودیت. ما استفاده کرده ایم @Autowired حاشیه نویسی برای تزریق یک نمونه از CustomerDao رابط به کنترلر
این getAllCustomers() متد لیستی از همه مشتریان را برمی گرداند. این getCustomerById() روش یک مشتری را با شناسه بازیابی می کند. این createCustomer() روش یک مشتری جدید را نجات می دهد. این updateCustomer() روش یک مشتری موجود را به روز می کند. این deleteCustomer() روش یک مشتری را حذف می کند
نتیجه
الگوی DAO یک راه قدرتمند برای انتزاع کردن جزئیات عملیات پایگاه داده و بهبود قابلیت نگهداری و آزمایش پذیری کد شما است. امیدوارم این مفید بوده باشد و اکنون بتوانید از الگوی DAO در پروژه های خود استفاده کنید.



