1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Môn học lập trình hướng Đối tượng Đề tài hệ thống quản lý bán hàng

32 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Môn Học Lập Trình Hướng Đối Tượng Đề Tài Hệ Thống Quản Lý Bán Hàng
Tác giả Nguyễn Thị Ngọc Quế, Phạm Thị Thanh Phương, Lê Nguyễn Tú Quyên, Dương Thị Thu Thảo, Nguyễn Ngọc Phương Thi
Người hướng dẫn ThS. Bùi Hữu Đông
Trường học Trường Đại học Ngân Hàng TP. Hồ Chí Minh
Chuyên ngành Hệ Thống Thông Tin Quản Lý
Thể loại Đề Tài Hệ Thống Quản Lý Bán Hàng
Năm xuất bản 2025
Thành phố TP. Hồ Chí Minh
Định dạng
Số trang 32
Dung lượng 0,91 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Cấu trúc

  • PHẦN 1. SQL SERVER (9)
  • PHẦN 2. CONSOLE APPLICATION (13)
  • KẾT LUẬN (32)

Nội dung

Tạo kết nối với DATABASE Đặt class DatabaseConnection trong package util dùng để chứa các tiện ích như kết nối cơ sở dữ liệu: - Import các lớp cần thiết:  java.sql.Connection đại diện c

SQL SERVER

1 Tạo Cơ sở dữ liệu

Tạo một CSDL mới tên QL_BanHang và chuyển ngữ cảnh làm việc sang CSDL này.

2 Tạo các bảng chính và chức năng

- Quản lý nhóm sản phẩm (Ví dụ: Điện tử, Gia dụng).

- MaDanhMuc là khóa chính và tự tăng.

- IDENTITY(1,1): Cột tự tăng, bắt đầu từ 1 và tăng mỗi lần thêm 1.

- Lưu thông tin sản phẩm: tên, giá, tồn kho, và liên kết với DanhMuc.

- Giá dùng kiểu DECIMAL(18,2): Kiểu số chính xác dùng cho tiền (18 chữ số, 2 số sau dấu thập phân).

- FOREIGN KEY ( ) REFERENCES : Ràng buộc khóa ngoại, giúp đảm bảo tính toàn vẹn giữa các bảng.

- Lưu thông tin người mua hàng.

- Email và SoDienThoai không ràng buộc NOT NULL vì có thể để trống ban đầu.

- Lưu đơn hàng của khách.

- DEFAULT GETDATE(): Tự động lấy ngày hiện tại khi thêm dữ liệu.

- TrangThai lưu trạng thái như "Đã đặt", "Đã giao", "Đã hủy".

- Lưu thông tin chi tiết mỗi đơn hàng: sản phẩm nào, số lượng, giá bán, chiết khấu (%).

- ChietKhau DECIMAL(5,2) DEFAULT 0: một cột số thực có 2 chữ số sau dấu phẩy, dùng để lưu tỷ lệ chiết khấu (%), và mặc định là 0% nếu không nhập.

- Bảng NhapHang ghi nhận các lần nhập thêm hàng vào kho.

- Bảng TaiKhoan lưu thông tin tài khoản hệ thống.

- CHECK (VaiTro IN ( )): Ràng buộc chỉ cho phép nhập đúng các giá trị trong danh sách (Admin hoặc nhân viên).

Gồm 3 loại danh mục chính: Điện tử, Gia dụng, Thời trang Đây là bảng chính để phân loại các sản phẩm.

- Có 30 sản phẩm mẫu được phân theo danh mục tương ứng.

- Mỗi sản phẩm gồm tên, giá, số lượng tồn và thuộc một danh mục Thông tin này dùng để hiển thị và quản lý kho.

- Có 15 khách hàng được tạo với thông tin như tên, số điện thoại, địa chỉ và email.

- Phục vụ cho việc lập đơn hàng và lưu lịch sử giao dịch.

3.4 Thêm đơn hàng và chi tiết đơn hàng

Có 7 đơn hàng mẫu với các trạng thái khác nhau như Đã đặt, Đã giao và Đã hủy, nhằm phục vụ kiểm tra chức năng thống kê và lọc đơn hàng theo trạng thái Những đơn hàng này giúp đảm bảo hệ thống quản lý đơn hàng hoạt động chính xác và hiệu quả Việc sử dụng dữ liệu mẫu này hỗ trợ kiểm tra các chức năng như thống kê doanh số và phân loại đơn hàng dễ dàng hơn Đây là bước quan trọng trong quá trình phát triển và tối ưu hệ thống quản lý đơn hàng online.

ChiTietDonHang cung cấp thông tin chi tiết về sản phẩm trong đơn hàng, bao gồm mã sản phẩm, số lượng, đơn giá và chiết khấu Dữ liệu này giúp hiển thị đầy đủ các đơn hàng và tính toán tổng tiền chính xác, tối ưu hóa quá trình quản lý đơn hàng và trải nghiệm khách hàng.

3.5 Thêm tài khoản và nhập hàng

- Có các tài khoản mẫu gồm Admin và Nhân viên Dùng để đăng nhập và kiểm tra phân quyền trong ứng dụng Java.

Nhập Hang đã cập nhật dữ liệu cho các đợt nhập hàng của cửa hàng, bao gồm ngày nhập, số lượng và mã sản phẩm, giúp quản lý tồn kho chính xác hơn Việc này hỗ trợ kiểm tra tồn kho nhanh chóng và tiện lợi hơn, đồng thời nâng cao khả năng theo dõi lịch sử nhập kho của cửa hàng Nhờ đó, doanh nghiệp có thể quản lý nguồn hàng hiệu quả và tối ưu hóa quy trình nhập kho.

CONSOLE APPLICATION

2.1.1 Tạo kết nối với DATABASE Đặt class DatabaseConnection trong package util dùng để chứa các tiện ích như kết nối cơ sở dữ liệu:

- Import các lớp cần thiết:

 java.sql.Connection đại diện cho một kết nối tới cơ sở dữ liệu để thực thi các câu lệnh SQL.

 java.sql.DriverManager quản lý các driver JDBC và tạo kết nối tới cơ sở dữ liệu dựa trên URL, USER và PASSWORD.

 java.sql.SQLException để ném ra khi có lỗi liên quan đến cơ sở dữ liệu.

- Sử dụng từ khóa public để class có thể truy cập từ bất kỳ đâu trong project.

Trong lập trình Java, sử dụng từ khóa static final để định nghĩa các biến thuộc về lớp (class variables), giúp truy cập dễ dàng mà không cần tạo đối tượng Các biến này có giá trị cố định sau khi được khởi tạo, không thể thay đổi, đảm bảo tính bất biến và an toàn trong quá trình thực thi Điều này cực kỳ hữu ích để khai báo các hằng số chung cho toàn bộ lớp và tối ưu hóa hiệu suất hoạt động của chương trình.

- URL: là đường dẫn JBDC tới SQL Server, gồm:

 localhost:1433: SQL Server chạy trên máy cục bộ, cổng 1433 (mặc định của SQL Server).

 databaseName=QL_BanHang: Tên cơ sở dữ liệu là QL_BanHang.

 encrypt=true: Kích hoạt mã hóa kết nối giúp tăng tính bảo mật.

 trustServerCertificate=true: Bỏ qua kiểm tra chứng chỉ SSL, thường dùng trong môi trường phát triển để đơn giản hóa kết nối.

- USER: tên người dùng của cơ sở dữ liệu, ở đây là “sa” (tài khoản quản trị mặc định của SQL Server).

- PASSWORD : mật khẩu của tài khoản “sa”.

- Phương thức getConnection() : trả về một đối tượng Connection để kết nối tới cơ sở dữ liệu SQL Server:

 throws SQLException : ném ra ngoại lệ nếu có lỗi trong quá trình kết nối.

 Class.forName(): tải driver JDBC của SQL Server vào bộ nhớ.

 com.microsoft.sqlserver.jdbc.SQLServerDriver: tên đầy đủ của class driver JDBC cho SQL Server được cung cấp bởi Microsoft.

 Sử dụng DriverManager để tạo kết nối tới cơ sở dữ liệu dựa trên URL, USER và PASSWORD Nếu thành công, trả lại đối tượng Connection.

 Nếu driver không được tìm thấy, ngoại lệ ClassNotFoundException sẽ được ném ra và chuyển thành SQLException với thông báo tùy chỉnh

“Không tìm thấy JDBC Driver: “ + e.getMessage()

Trong hệ thống, tạo một lớp DanhMuc trong package model để đại diện cho các danh mục, giúp quản lý thông tin một cách rõ ràng và có cấu trúc Lớp này có hai thuộc tính chính là maDanhMuc và tenDanhMuc, dùng để lưu trữ mã danh mục và tên danh mục tương ứng Việc định nghĩa lớp DanhMuc giúp tổ chức dữ liệu danh mục một cách hợp lý, thuận tiện cho việc truy xuất và xử lý dữ liệu trong hệ thống của bạn.

- Sử dụng từ khóa private đảm bảo tính đóng gói ngăn truy cập trực tiếp vào các thuộc tính từ bên ngoài, chỉ cho phép truy cập thông qua getter và setter.

 maDanhMuc (int): đại diện cho mã danh mục phù hợp cho các giá trị số nguyên.

 tenDanhMuc(String): đại diện cho tên danh mục, sử dụng kiểu String để lưu chuỗi ký tự.

- Tạo constructor mặc định không có tham số để tạo một đối tượng DanhMuc rỗng.

- Tạo constructor có tham số nhận vào maDanhMuc và tenDanhMuc để thêm bản ghi mới vào cơ sở dữ liệu hoặc hiển thị danh mục.

- Tạo getters và setters đáp ứng nguyên tắc đóng gói, cho phép kiểm soát việc truy cập và sửa đổi thuộc tính:

 getMaDanhMuc(): Trả về giá trị của maDanhMuc.

 getTenDanhMuc(): Trả về giá trị của tenDanhMuc.

 setMaDanhMuc(int): Cập nhật giá trị cho maDanhMuc.

 setTenDanhMuc(String): Cập nhật giá trị cho tenDanhMuc.

Trong hệ thống của bạn, cần tạo một lớp `SanPham` nằm trong gói `model` để đại diện cho thông tin của một sản phẩm Lớp `SanPham` nên chứa các thuộc tính như `maSanPham`, `tenSanPham`, `gia`, `soLuongTon` và `maDanhMuc` nhằm lưu trữ đầy đủ các dữ liệu cần thiết về sản phẩm Việc định nghĩa rõ ràng các thuộc tính này giúp quản lý và xử lý thông tin sản phẩm một cách hiệu quả, đồng thời dễ dàng tích hợp với các chức năng khác của hệ thống.

- maSanPham (int): mã sản phẩm, kiểu int phù hợp để lưu trữ giá trị số nguyên duy nhất.

- tenSanPham (String): tên sản phẩm, kiểu String để lưu trữ chuỗi ký tự.

- gia (double): giá sản phẩm, sử dụng kiểu double để hỗ trợ số thực

- soLuongTon (int): số lượng sản phẩm còn trong kho, kiểu int phù hợp cho số lượng nguyên.

- maDanhMuc (int): mã danh mục, liên kết với class DanhMuc dùng xác định sản phẩm thuộc danh mục nào.

Tạo constructor mặc định không tham số tạo đối tượng SanPham rỗng, đối tượng tạm thời để xử lý logic.

Để khởi tạo đối tượng SanPham một cách chính xác, bạn nên tạo constructor có tham số nhận đầy đủ các thuộc tính cần thiết Điều này giúp dễ dàng thêm bản ghi vào cơ sở dữ liệu hoặc hiển thị sản phẩm trên giao diện người dùng một cách linh hoạt Trong quá trình xây dựng constructor, sử dụng từ khóa this để phân biệt rõ ràng giữa các thuộc tính của lớp và các tham số truyền vào, đảm bảo mã nguồn rõ ràng, dễ bảo trì và tối ưu hóa hiệu suất.

Tạo getters và setters nhằm đáp ứng tính đóng gói, cho phép kiểm soát truy cập và sửa đổi dữ liệu:

- getMaSanPham(): trả về giá trị của biến maSanPham.

- setMaSanPham(): cập nhật giá trị của maSanPham.

- getTenSanPham(): trả về tên sản phẩm.

- setTenSanPham(): đặt lại tên sản phẩm.

- getSoLuongTon(): lấy số lượng tồn.

- setSoLuongTon(): cập nhật số lượng tồn.

- getMaDanhMuc(): lấy mã danh mục.

- setMaDanhMuc(): cập nhật mã danh mục.

Tạo một class DonHang trong package model đại diện cho một đơn hàng trong hệ thống với các thuộc tính như mã đơn hàng, mã khách hàng, ngày lập, tổng tiền và trạng thái:

- Import java.util.Date: lưu trữ thông tin ngày lập đơn hàng, lưu cả ngày và giờ

 maDonHang (int): mã đơn hàng.

 maKhachHang (int): mã khách hàng dùng để xác định khách hàng đặt đơn hàng này.

 ngayLap (Date): ngày lập đơn hàng, lưu thời điểm đơn hàng được tạo.

 tongTien (double): tổng tiền của đơn hàng.

 trangThai (String): lưu trạng thái đơn hàng.

Tạo một constructor mặc định khởi tạo đối tượng DonHang rỗng với trạng thái mặc định là “ Đang xử lý”

Tạo một constructor có tham số nhận các thuộc tính để khởi tạo đối tượng DonHang với dữ liệu cụ thể, thêm bản ghi vào cơ sở dữ liệu hoặc hiển thị đơn hàng trên giao diện.

- getMaDonHang(): trả về giá trị của maDonHang.

- setMaDonHang(): cập nhật giá trị cho maDonHang.

- getMaKhachHang(): trả về giá trị của maKhachHang.

- setMaKhachHang(): cập nhật giá trị cho maKhachHang.

- getNgayLap(): trả về giá trị của ngayLap

- setNgayLap(): cập nhật giá trị cho ngayLap.

- getTongTien(): trả về giá trị của tongTien.

- setTongTien(): cập nhật giá trị cho tongTien.

- getTrangThai(): trả về giá trị của trangThai.

- setTrangThai(): cập nhật giá trị cho trangThai như từ “Đang xử lý” sang “Đã giao” hoặc “Hủy”.

Tạo một class ChiTietDonHang thuộc về package model đại diện cho một chi tiết về đơn hàng, từ khóa public cho phép class này có thể truy cập từ bất kỳ package nào khác trong cùng một dự án:

- Private: đảm bảo rằng các thuộc tính này chỉ có thể được truy cập bên trong class ChiTietDonHang, tuân thủ theo nguyên tắc đóng gói.

- maChiTiet (int): mã chi tiết của đơn hàng.

- maDonHang (int): mã đơn hàng liên kết với class DonHang.

- maSanPham (int): mã sản phẩm trong chi tiết đơn hàng này, liên kết với class

- soLuong (int): số lượng sản phẩm được mua trong đơn hàng này.

- donGia (double): đơn giá của sản phẩm tại thời điểm mua.

- chietKhau (double): tỷ lệ chiết khấu được áp dụng.

Trong lập trình, bạn có thể tạo một constructor mặc định không có tham số để dễ dàng khởi tạo đối tượng ChiTietDonHang Bên cạnh đó, việc tạo một constructor có tham số giúp bạn khởi tạo đối tượng ChiTietDonHang với các giá trị cụ thể, đảm bảo tính linh hoạt và thuận tiện khi gán giá trị cho các thuộc tính của đối tượng Các constructors này đóng vai trò quan trọng trong quá trình quản lý dữ liệu và tối ưu hóa quá trình lập trình hướng đối tượng.

- This.maDonHang = maDonHang : gán giá trị của tham số maDonHang cho thuộc tính maDonHang của đối tượng hiện tại, từ khóa this được sử dụng để phân biệt giữa tham số và thuộc tính của class.

- Không có tham số maChiTiet vì maChiTiet thường được tạo tự động bởi cơ sở dữ liệu khi một bản ghi mới được thêm vào.

Tạo getters và setters để truy cập và thay đổi giá trị của các thuộc tính private:

- getMaChiTiet(): trả về giá trị của thuộc tính maChiTiet.

- setMaChiTiet() : gán giá trị mới cho thuộc tính maChiTiet.

- getMaDonHang(): trả về giá trị của thuộc tính maDonHang.

- setMaDonHang(): gán giá trị mới cho thuộc tính maDonHang.

- getMaSanPham(): trả về giá trị của thuộc tính maSanPham.

- setMaSanPham(): gán giá trị mới cho thuộc tính maSanPham.

- getSoLuong(): trả về giá trị của thuộc tính soLuong.

- setSoLuong(): gán giá trị mới cho thuộc tính soLuong.

- getDonGia(): trả về giá trị của thuộc tính donGia.

- setDonGia(): gán giá trị mới cho thuộc tính donGia.

- getChietKhau(): trả về giá trị của thuộc tính chietKhau.

- setChietKhau(): gán giá trị mới cho thuộc tính chietKhau.

Class DanhMucDAO được đặt trong package dao Import các thư viện:

- model.DanhMuc: import class DanhMuc từ package model.

- util.DatabaseConnection: import class để kết nối database.

- java.sql.*: import tất cả các class từ SQL để sử dụng JBDC.

- java.util.ArrayList: tạo danh sách.

- java.util.List: làm việc với danh sách.

Trong bài viết này, chúng tôi giới thiệu cách khai báo lớp DanhMucDAO công khai, giúp quản lý dữ liệu danh mục hiệu quả Phương thức addDanhMuc được định nghĩa để nhận vào một đối tượng DanhMuc, từ đó thêm mới dữ liệu vào cơ sở dữ liệu Đặc biệt, phương thức này có khả năng ném ra ngoại lệ SQLException nhằm xử lý các lỗi liên quan đến database một cách rõ ràng và an toàn Điều này đảm bảo tính bảo mật và độ tin cậy cao khi thao tác với dữ liệu trong hệ thống.

- INSERT INTO DanhMuc (TenDanhMuc) VALUES (?): định nghĩa câu lệnh

SQL INSERT và dấu ? là tham số placeholder để chèn một bản ghi mới.

Using a try-with-resources block, such as `try (Connection conn = DatabaseConnection.getConnection())`, ensures automatic closing of database connections, prepared statements, and result sets This approach retrieves a connection from the `DatabaseConnection` class and guarantees that resources are released properly at the end of the block, even if an exception occurs Implementing try-with-resources helps prevent resource leaks and enhances the reliability and efficiency of database operations.

Viện sử dụng PreparedStatement thay vì Statement giúp ngăn chặn tấn công SQL Injection hiệu quả hơn PreparedStatement thực hiện tiền biên dịch câu lệnh SQL, từ đó giảm thiểu rủi ro bảo mật Bên cạnh đó, nó cho phép thiết lập giá trị tham số một cách an toàn, tránh việc dữ liệu người dùng bị chèn trực tiếp vào câu lệnh SQL Việc sử dụng PreparedStatement là biện pháp bảo vệ dữ liệu và tăng cường bảo mật cho ứng dụng của bạn.

- Stmt.setString(1, danhMuc.getTenDanhMuc()): gán giá trị tên danh mục cho tham số đầu tiên trong câu lệnh SQL.

- Stmt.excuteUpdate: thực thi câu lệnh SQL INSERT.

- stmt.setString(1, danhMuc.getTenDanhMuc()): Gán giá trị cho tham số thứ nhất.

- stmt.setInt(2, danhMuc.getMaDanhMuc()): Gán giá trị cho tham số thứ hai.

- stmt.executeUpdate(): Thực thi câu lệnh SQL UPDATE.

Khai báo phương thức deleteDanhMuc nhận vào maDanhMuc và trả về giá trị boolean để xóa danh mục có kiểm tra ràng buộc:

Câu lệnh SQL "SELECT COUNT(*) FROM SanPham WHERE MaDanhMuc = ?" giúp kiểm tra ràng buộc dữ liệu trước khi thực hiện thao tác xóa Truy vấn này đếm số lượng sản phẩm hiện có thuộc về danh mục cụ thể, đảm bảo rằng không xóa danh mục chưa hết sản phẩm liên quan, giữ gìn tính toàn vẹn của dữ liệu trong hệ thống.

 checkStmt.setInt(1, maDanhMuc): gán mã danh mục vào tham số.

 ResultSet rs = checkStmt.executeQuery(): Thực thi câu lệnh SELECT và lưu kết quả vào ResultSet.

 if (rs.next() && rs.getInt(1) > 0) : Kiểm tra nếu có sản phẩm thuộc danh mục, trả về không thể xóa giúp duy trì tính toàn vẹn dữ liệu.

 DELETE FROM DanhMuc WHERE MaDanhMuc = ? : Thực thi câu lệnh

 deleteStmt.setInt(1, maDanhMuc): Gán maDanhMuc vào tham số.

 deleteStmt.executeUpdate() > 0: Thực thi DELETE và trả về true nếu có ít nhất 1 hàng bị xóa.

Khai báo phương thức getALLDanhMuc để lấy tất cả danh mục, trả về một

- List danhMucList = new ArrayList(): Khởi tạo một ArrayList rỗng để lưu kết quả.

- SELECT * FROM DanhMuc: Câu lệnh SQL để lấy tất cả dữ liệu.

- Statement stmt = conn.createStatement(): Tạo một Statement vì câu lệnh không có tham số đầu vào.

- ResultSet rs = stmt.executeQuery(sql)): Thực thi câu lệnh và lấy ResultSet.

- Lặp qua từng dòng dữ liệu trong ResultSet:

 Trong mỗi lần lặp, code tạo một đối tượng DanhMuc mới và sử dụng hàm tạo có tham số để gán dữ liệu từ ResultSet.

 rs.getInt("MaDanhMuc"): lấy giá trị maDanhMuc theo tên cột.

 rs.getString("TenDanhMuc"): lấy giá trị tenDanhMuc theo tên cột.

- Thêm đối tượng DanhMuc vào danh sách và trả về danh sách các danh mục đã lấy được.

Ngày đăng: 27/07/2025, 10:12

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w