الگوی طراحی 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 در پروژه های خود استفاده کنید.