برنامه نویسی

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

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا