TiiL Tutorials
@TinhocTiiL

Bài 11. [Demo] – Quản lý bán hàng với Spring boot – 1. Tổ chức dự án

Bài này hướng dẫn cách tổ chức dự án theo một khuôn mẫu hay dùng

Hướng Dẫn Tổ Chức Dự Án Spring Boot với Các Tầng Controller, Service, Repository và Models

Spring Boot là một framework phổ biến trong phát triển ứng dụng Java, cho phép chúng ta nhanh chóng xây dựng các ứng dụng Java Enterprise. Tuy nhiên, để dự án của bạn dễ bảo trì và mở rộng, việc tổ chức mã nguồn một cách cẩn thận là rất quan trọng. Trong bài viết này, chúng ta sẽ tìm hiểu cách tổ chức một dự án Spring Boot hiệu quả bằng cách sử dụng các tầng Controller, Service, Repository và Models.

Dưới đây là demo cơ bản các bước thực hiện. Xem full code tại github SOT383-Web2CLC/JPAdemoQLBH at main · maicuongtho/SOT383-Web2CLC (github.com)

00. Cơ sở dữ liệu demo

CREATE TABLE `customer` (
  `id` int(11) NOT NULL,
  `name` varchar(45) NOT NULL,
  `address` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

01. Cấu hình application.properties

 

spring.application.name=JPAdemoQLBH
## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/csdl_demo?useSSL=false
spring.datasource.username=root
spring.datasource.password=
## password de trong, neu pass la null
## ==============JPA / HIBERNATE=================
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect

 

1. Models/Entity

Models là nơi chứa các đối tượng dữ liệu của ứng dụng của bạn. Chúng thường tương ứng với các bảng trong cơ sở dữ liệu hoặc các đối tượng tham gia trong quá trình xử lý. Ví dụ, nếu bạn có một ứng dụng quản lý người dùng, bạn có thể có một model như sau:

package thomc.JPAdemoQLBH.models;
import jakarta.persistence.*;
@Entity						// đánh dấu rằng đây là một entity
@Table(name = "customer")	// chỉ định tên của bảng trong cơ sở dữ liệu.
public class Customer {		// Tên lớp ta viết hoa chữ cái đầu
	//----cho cột id-----------------------------------------------------------
    @Id						// đánh dấu trường id là khóa chính.
    @GeneratedValue(strategy = GenerationType.IDENTITY)
                 //xác định cách khóa chính được sinh ra (ở đây là tự động tăng).
    @Column(name = "id")	// ánh xạ cột id của Bảng và thuộc tính id của Entiy
    private int id;
    
    //----cho cột name-----------------------------------------------------------
    @Column(name = "name")  // cột của Bảng customer
    private String name;	//thuộc tính của Entity Customer   
  //----cho cột address-----------------------------------------------------------
    @Column(name = "address")
    private String address;

    // Constructors, getters, and setters
    // Constructors
    public Customer() {}

    public Customer(String name, String address) {
        this.name = name;
        this.address = address;
    }

    // Getters and setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    // toString method (optional)
    @Override
    public String toString() {
        return "Customer{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

2. Repository

Repository là lớp trung gian giữa ứng dụng của bạn và cơ sở dữ liệu. Nó cung cấp các phương thức để tương tác với cơ sở dữ liệu, như thêm, xóa, cập nhật hoặc truy vấn dữ liệu. Spring Boot thường sử dụng Spring Data JPA để tạo repository. Ví dụ:

package thomc.JPAdemoQLBH.repositories;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import thomc.JPAdemoQLBH.models.Customer;
@Repository
public interface CustomerRepository extends JpaRepository<Customer, Integer>  {
}

3. Service

Service là tầng logic của ứng dụng. Nó chứa các phương thức để thực hiện các nghiệp vụ cụ thể của ứng dụng và thực hiện các thao tác với Repository. Ví dụ:

package thomc.JPAdemoQLBH.services;
import java.util.List;
import org.springframework.stereotype.Service;
import thomc.JPAdemoQLBH.models.Customer;
@Service
public interface CustomerService {
	List<Customer> findAllCustomer();
	Customer findCustomerByID(int id);
    void addCustomer(Customer customer);
    void deleteCustomer(int id);
}
package thomc.JPAdemoQLBH.services;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import thomc.JPAdemoQLBH.models.Customer;
import thomc.JPAdemoQLBH.repositories.CustomerRepository;
@Service
public class CustomerServiceImpl implements CustomerService{
	@Autowired CustomerRepository customerRepository;
	@Override
	public List<Customer> findAllCustomer() {
		return customerRepository.findAll();
	}

	@Override
	public Customer findCustomerByID(int id) {
		Optional<Customer> opt =customerRepository.findById( id);
		if (opt.isPresent()) return opt.get();
		else return null;
	}

	@Override
	public void addCustomer(Customer customer) {
		customerRepository.save(customer);
	}
	
	@Override
	public void deleteCustomer(int id) {
		customerRepository.deleteById(id);
	}
 }

4. Controller

Controller là tầng giao diện với người dùng. Nó nhận yêu cầu từ người dùng thông qua các endpoint và chuyển tiếp chúng đến các phương thức tương ứng trong Service. Ví dụ:

package thomc.JPAdemoQLBH.controllers;
 
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import thomc.JPAdemoQLBH.services.CustomerService;
import thomc.JPAdemoQLBH.models.Customer;
@Controller
@RequestMapping("/customer")
public class CustomerController {
	@Autowired CustomerService customerService;
	@GetMapping("/all")
	public String getAll(Model model) {
		List<Customer> dsKH = customerService.findAllCustomer();
		model.addAttribute("dsKhachHang", dsKH);
		return "danhsachKH";
	}
}

7. View

file: danhsachKH.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Danh sách Khách hàng</title>
</head>
<body>
	<h1>Danh sách khách h</h1>
	<table border="1">
		<thead>
			<tr>
				<th>Mã KH</th>
				<th>Tên KH </th>
				<th>Địa chỉ </th>
			</tr>
		</thead>
		<tbody>
			<tr th:each="kh : ${dsKhachHang}">
				<td th:text="${kh.id}" />
				<td th:text="${kh.name}" />
				<td th:text="${kh.address}" />
			</tr>
		</tbody>
	</table>
</body>
</html>

 Kết Luận

Tổ chức dự án Spring Boot với các tầng Controller, Service, Repository và Models giúp mã nguồn của bạn trở nên dễ bảo trì, mở rộng và tái sử dụng. Bằng cách này, bạn có thể phát triển ứng dụng của mình một cách hiệu quả và dễ dàng duy trì vào tương lai.

Web quản lý bán hàng với Java Spring boot – Tổ chức dự án

 

Xem hướng dẫn tiếp theo, tạo cơ sở dữ liệu

 

Avatar
https://khoacntt.ntu.edu.vn/giang-vien/mai-cuong-tho

một GV Đại học. TiiL đã phụ trách một số môn học như: Lập trình Java, Phát triển web với Java, Lập trình thiết bị di động, Lập trình hệ thống nhúng và IoT.

Comments are closed.