Center
of Excellence
Bài
4 (tiếp theo)
Thức
ăn cho vật nuôi (Pet Food)
Đây
là bài đầu tiên phát triển một application có truy xuất
đến cơ sở dữ liệu quan hệ (relational
database, viết tắt là DB). Sẽ có thêm khá nhiều chi tiết
mới. Bạn cần đọc và thực hành nhiều lần cho đến
khi tự mình phát triển giải pháp mà không cần nhìn vào
bài.
I.
Bài toán
Một
cửa hàng bày bán các loại thức ăn cho vật nuôi như
sau:
Loại
(grade)
|
Giá
(cents/lb.)
|
A
|
30
|
B
|
20
|
C
|
10
|
Giả
sử rằng thông tin ở bảng trên được lưu vào một DB,
hãy phát triển một web application để xác định giá của
một loại thức ăn cho trước, dựa trên thông tin đã
được lưu vào DB. Dưới đây là một UI mẫu.
Hình
1
II.
Giải pháp
Project:
PetFoodJSF_DB
Đầu
tiên ta thiết kế một DB và lưu thông tin vào đó, kế
đến sẽ tạo một class gọi là entity, sau đó là
stateless session bean, và từ đó về sau, mọi thao tác liên
quan đến data trong DB đều được thực hiện qua stateless
session bean này. Kiến trúc tổng thể của hệ thống sẽ
như sau
Hình
2
1.
Thiết kế DB
1.1.
Tạo mới một DB
Click
Services tab ở bên
trái để truy xuất dịch vụ DB. (Nếu không thấy tab này
thì click Window
menu, rồi chọn Services.)
Hình
3
Mở
rộng Databases node, ta thấy có sẵn một hệ quản
trị cơ sở dữ liệu (database management system, viết tắt
là DBMS) tên là Java DB, và trong Java DB đã có
sẵn một DB là sample.
Hình
4
Ta
tạo mới một DB lấy tên là petfood bằng cách
right-click Java DB, rồi chọn Create Database... để
chuyển sang Create Java DB Database window.
Hình
5
Nhập
petfood vào ô Database Name:, và cho dễ nhớ, ta
đều nhập petfood vào các ô còn lại. (Dĩ nhiên
trong thực tế, ta cần chọn lựa cẩn thận nội dung của
các ô User Name: và Password:).
Hình
6
Sau
khi click OK, Services window sẽ xuất hiện
petfood DB. Để kết nối với DB này, right-click vào
đó, rồi chọn Connect...
Hình
7
1.2.
Tạo bảng (table) và lưu giá trị vào table
Ta
tạo table bằng cách right-click PETFOOD rồi chọn
Execute Command...
Hình
8
Dựa
vào thông tin do bài toán cung cấp, ta dùng câu lệnh create
table trong ngôn ngữ SQL (Structured Query Language) để tạo
petfood table. Table này có hai cột (columns).
- Column thứ nhất là grade với data type là một ký tự, character(1), không được chứa giá trị null (not null), đồng thời column này được dùng làm khóa chính (primary key). Một đặc trưng của primary key là tính duy nhất (không được phép trùng lặp).
- Column thứ hai là price với data type là integer, và không chứa giá trị null.Sau khi tạo xong table, ta tiến hành nhập ba cặp giá trị (grade, price) vào table bằng câu lệnh insert. Mỗi cặp giá trị được gọi là một dòng (row) trong table. Để thực thi các câu lệnh SQL, click Run SQL icon.
Hình
9
Để
kiểm tra data lưu trong table, ta right-click PETFOOD table
rồi chọn View Data...
Hình
10
Khi
làm việc với DB, ta phải dùng các khái niệm như table,
row, và column. Chúng hoàn toàn xa lạ với phong cách OOP, ở
đó ta dùng các khái niệm như class, object, và field. Để
có thể nhìn DB theo quan điểm OO, ta cần ánh xạ (map)
table vào một class chuyên biệt gọi là entity (thực thể).
Entity chẳng qua là một class thông thường với vài
annotations và getter/setter cho fields.
Sau
đây ta tạo PetFood entity đối ứng với PETFOOD
table trong DB.
Hình
11
Right-click
Source Packages, chọn New, rồi chọn Entity
Classes From Database... để chuyển sang New Entity
Classes From Database window.
Hình
12
Đến
đây ta cần cung cấp thông tin về DB mà application sẽ làm
việc với. Chọn New Data Source... trong mục Data
Source: để chuyển sang Create Data Source window.
Hình
13
Nhập
jdbc/petfood vào ô JNDI Name: (ta thường đặt
tên theo qui ước, bắt đầu bằng jdbc/, tiếp sau là
tên DB), chọn petfood trong mục Database Connection:,
rồi click OK để trở về New Entity Classes From
Database window.
Hình
14
Chọn
PETFOOD ở mục Available Tables: bên trái, click
Add button để chuyển table đó sang mục Selected
Tables: bên phải, rồi click Next để chuyển sang
mục Entity Classes.
Hình
15
Nhập
data.entity vào ô Package: rồi click Next để
chuyển sang mục Mapping Options.
Hình
16
Click
Finish để hoàn tất.
Hình
17
Hình
18
Để
ý rằng Petfood entity đã có sẵn một số câu truy
vấn (query) DB thông dụng. Sau này ta sẽ dùng câu query
“Petfood.findAllGrades” để cung cấp cho UI screen
(thông qua managed bean) danh mục tất cả các grades có
trong DB.
Đến
đây ta đã hoàn tất việc ánh xạ (mapping) một DB Table
vào một entity để có thể làm việc với table theo phong
cách OO. Với một entity/table, ta có tối thiểu bốn thao
tác cơ bản, gọi tắt là CRUD: Create (lưu
objects/rows vào entity/table), Read (truy xuất
objects/rows trong entity/table), Update (thay đổi nội
dung của objects/rows), và Delete (xóa objects/rows ra
khỏi entity/table). Ngoài CRUD, application còn cần quan tâm
đến vấn đề quản lý giao tác (transaction), an ninh
(security), đồng hành (concurrency), và nhiều chi tiết phức
tạp khác. May thay, ta có thể khai báo một class chuyên
biệt, gọi là session bean, nhằm giúp xử lý tất cả các
chi tiết trên. Ở bài này, ta sẽ dùng một stateless
session bean (session bean phi trạng thái) đặt tên là
PetFoodFacade.
Hình
19
Right-click
Source Packages, chọn New, rồi chọn tiếp
Other... để chuyển sang New File window.
Hình
20
Chọn
Enterprise JavaBeans ở mục Categories: bên trái,
chọn tiếp Session Beans For Entity Classes ở mục File
Types: bên phải, rồi click Next để chuyển sang
New Session Beans For Entity Classes window.
Hình
21
Chọn
data.entity.PetFood ở mục Available Entity Classes:
bên trái, click Add button để chuyển entity đó sang
mục Selected Entity Classes: bên phải, rồi click Next
để chuyển sang màn hình Generated Session Beans.
Hình
22
Nhập
data.facade vào ô Package: rồi click Finish.
Khi đó NetBeans sẽ tạo hai classes: AbstractFacade và
PetFoodFacade. Từ nay về sau, khi thao tác trên PETFOOD
table, ta sẽ dùng PetFoodFacade.
Hình
23
4.
Truy xuất data qua session bean
4.1.
Truy xuất grades qua session bean
Đến
đây, ta đã thiết kế DB, tạo entity, và tạo session bean.
Để managed bean có thể cung cấp danh mục tất cả các
grades trong DB, ta
cần nhờ đến session bean thông qua việc tạo thêm
findAllGrades() trong
đó.
Hình
24
Hình
25
Bây
giờ, từ managed bean, ta có thể sử dụng session bean như
sau: Right-click bên trong managed bean, chọn Insert
Code...
Hình
26
Chọn
tiếp Call
Enterprise Bean...
để chuyển sang Call
Enterprise Bean
window.
Hình
27
Chọn
PetFoodFacade
rồi click OK.
Khi đó NetBeans sẽ chèn PetFoodFacade
vào trong managed bean.
Hình
28
Hình
29
Lúc
này ta có thể dùng PetFoodFacade
để xác định grades.
Hình
30
4.2.
Truy xuất price qua session bean
Để
xác định price
ứng với một grade
đã cho, từ managed bean, ta làm như sau.
Hình
31
Trước
khi thi hành application để kiểm tra kết quả, ta bổ sung
thêm clear()
method.
Hình
32
III.
Tổng kết
Bài
viết đã trình bày cách vận dụng các khái niệm về DB,
entity, stateless session bean, và một số khái niệm khác để
phát triển giải pháp nhằm giải quyết bài toán xác định
giá của các loại thức ăn cho vật nuôi, trong đó thông
tin về loại thức ăn và giá tương ứng đã được lưu
vào một DB.
IV.
Tài liệu tham khảo
- Gaddis T. (2010) Starting Out with Java: From Control Structures Through Objects, 4th edition, Pearson Education, Boston. Chương 3.
- NetBeans E-commerce Tutorial. http://netbeans.org/kb/docs/javaee/ecommerce/intro.html
- Antonio Goncalves (2010) Beginning Java EE 6 Platform with GlassFish 3, 2nd edition, Apress.
Thanks bạn,
Trả lờiXóaBài viết rất hay và bổ ích. Bạn có thể chia sẻ cho mình là bạn đã dùng tool gì để vẽ cái Kiến trúc tổng thể của hệ thống trên vậy ?
Nhận xét này đã bị quản trị viên blog xóa.
Trả lờiXóa