Xây dựng ứng dụng với EJB 3 trên Entity với khóa chính - primary key có nhiều hơn một thuộc tính
Mục đích: Chủ đề của bài này hướng dẫn thao tác xây dựng ứng dụng với table có chưa khóa chính chứa nhiều một thuộc tính. Bên cạnh đó, bài cũng đề cập đến cách thao tác dữ liệu kiểu data time và kiểu big int từ cơ sở dữ liệu đến java và ngược lại. Ở đây, chúng tôi sẽ thực hiện 03 chức năng tìm kiếm những dữ liệu lớn hơn tháng nhập vào từ giao diện, insert một dòng dữ liệu vào DB, và xóa đi một dòng được lựa chọn trên lưới. Ngoài ra, trong bài này chúng tôi cũng giới thiệu luôn cách mapping các hằng số động trong quá trình xử lý như tên trang chuyển, resource chuyển đổi, các giá trị mapping để người phát triển ứng dụng có thể thay đổi mà không cần chỉnh sửa code hay build lại ứng dụng
Yêu cầu
- Nắm vững về EJB3 từ session đến entity (tham khảo tại địa chỉ http://www.kieutrongkhanh.net/2016/08/entity-bean-trong-ejb-30.html ) và các nội dung cơ bản có liên quan đến EJB
- Nắm vững về ngôn ngữ lập trình Java, lập trình thao tác hướng đối tượng
- Nắm vững các khái niệm về MVC và cách áp dụng mô hình này để xây dựng ứng dụng với JavaEE 5 (tham khảo tại địa chỉ http://www.kieutrongkhanh.net/2016/08/mvc-pattern-tren-web-mo-hinh-thiet-ke.html )
- Nắm vững các thành phần xây dựng ứng dụng web từ Servlet đến JSP (tham khảo tại địa chỉ http://www.kieutrongkhanh.net/search/label/Servlet%26JSP )
- Nắm vững khái niệm về DataSource
- Nắm vững khái niệm về POJO hay JavaBeans và các luật cài đặt cho nó
Xây dựng ứng dụng
- Cấu trúc table, chúng ta thao tác có dạng như sau
- Chúng ta nhận thấy PK của bảng này chứa 02 thuộc tính là itemID và dateS
- EJB 3 yêu cầu khóa chính phải có kiểu dữ liệu là kiểu wrapper class – kiểu object để có thể nhúng trong kiểu dữ liệu của object khác và tuân thủ luật của Java Beans và thành phần object cơ bản để có thể so sánh và lấy dữ liệu theo khái niệm của OOP
- Bên cạnh đó, có 02 kiểu dữ liệu chúng ta cần quan tâm là kiểu
- Datetime: kiểu này dưới table sẽ được chuyển mapping tương ứng thành kiểu java.util.Date. Vấn đề gặp phải của kiểu dữ liệu này là khi chúng ta tìm kiếm hay thực hiện các thao tác có liên quan thì gặp phải vấn đề là cấu trúc của kiểu này là năm – tháng – ngày – giờ - phút – giây
- Bản chất của kiểu DateTime chính là con số trong máy tính và có thể mapping tương ứng với kiểu TimeStamp.
- Bigint: là kiểu dữ liệu table được mapping tương ứng thành kiểu BigInt trên java. Tuy nhiên, chúng ta cần mapping với kiểu long để dễ thao tác
- Yêu cầu
- Nắm vững các kiến thức đã nêu trên cùng với các nội dung về JavaEE, MVC2, JPA, 2 tiers và 3 tiers, EJB 2.x và EJB 3
- Tools sử dụng ở đây là Netbeans 8.1, 7.4
- JDK 8 update 66 hay JDK 7 update 51 – khuyến cáo sử dụng JDK 7 là ổn định nhất
- Server: JBoss 6.1.0 Final
- DBMS: SQL Server 2005, 2008, 2012, 2014
- Thư viện hỗ trợ: JSTL 1.1, 1.2.1, 1.2.2; Driver kết nối database SQLServer (sqljdbc4.jar)
- Các bước thực hiện
- Phát sinh entity bean từ DB với cấu trúc table ở trên
- Chúng ta nhận thấy, 02 class được phát sinh, class Tbl2AttKeyDatePK là kiểu dữ liệu của khóa chính, chứa 02 thành phần thuộc tính bên trong tương ứng DB và tuân thủ luật của Java Beans
- Class Tbl2AttKeyDate có chứa EmbeddedId là kiểu dữ liệu của class PK và các câu truy vấn của nó được viết theo dạng của EL theo ngữ nghĩa objectEntity.PK.Attr
- Chúng ta cũng thay đổi tương ứng kiểu BigInt của thuộc tính amt thành kiểu long và cập nhật hàm get và set tương ứng
- Phát sinh Session Bean tương ứng và bổ sung Remote
- Bổ sung phần entity manager, xây dựng các hàm search dữ liệu của tháng lớn hơn được nhập vào, insert và delete dữ liệu dưới DB
- Mapping poji trong tập tin jboss.xml
- Thực hiện xử lý bên ứng dụng web
- Tạo trang menu với 02 chức năng search và insert
- Để hỗ trợ việc mapping động trong quá trình xây dựng ứng dụng và thay đổi linh hoạt trong quá trình deploy, chúng ta sẽ xây dựng việc mapping ứng dụng trong tập tin properties.
- Tập tin này chứa các phần tử có cấu trúc key=value
- Tâp tin này được đặt tại thư mục classes, không nằm trong package nào cả.
- Đối ứng dụng web chúng ta sẽ truy cập resource này thông qua phương thức getResourceAsStream của classLoader để có thể truy vấn các value được mapping thông qua các key trong tập tin này
- Tạo tập tin properties với các giá trị mapping như sau
- Tạo Servlet Trung tâm CenterServlet để đón nhận xử lý
- Chúng ta nhìn thấy các giá trị đang được mapping qua các key và sẽ dễ dàng thay đổi thông qua tập tin properties mà không cần build lại ứng dụng
- Chúng ta xử lý giao diện cho chức năng insert trước
- Trang xử lý lỗi cho quá trình insert cùng với thể hiện kết quả
- Tạo InsertServlet để xử lý Insert
- Lần nữa chúng ta lại mapping tất cả các hằng số thông qua file properties
- Thực hiện clean and build, deploy và test thử insert
- Click chọn Insert New Record và nhập dữ liệu đúng
- Click Insert
- Dữ liệu trong DB
- Nhấn dấu ! trên thanh toolbar hay mở lại bảng, chúng ta có kết quả
- Thực hiện với dữ liệu sai, chúng ta sẽ có kết quả
- Tiếp tục xây dựng ứng dụng với chức năng Search và Delete
- Tạo giao diện và phần xử lý cho Search (Lưu ý cần import JSTL)
- Tạo SearchServlet để xử lý
- Tạo DeleteServlet để xử lý delete
- Tạo trang lỗi khi chức năng delete có lỗi
- Cấu trúc project hiện nay như sau
- Thực hiện clean and build, deploy và test thử
- Test với chức năng Search
- Nhập sai
- Nhập đúng
- Click Delete, chúng ta refresh lại DB
Chúc mừng các quí vị đã việc cài đặt ứng dụng với EJB3 sử dụng Entity có khóa chính chứa nhiều hơn một thuộc tính
Bên cạnh đó chúng ta có thêm kinh nghiệm trong việc xử lý ngày tháng và kiểu Big Int
Hơn thế nữa, chúng ta đã có thêm kiến thức trong việc mapping các trang, các resource thông qua việc cấu hình động trong file properties để có thể chỉnh sửa và thay thế mà không cần build lại ứng dụng
Rất mong sự góp ý chân thành và chia sẻ của quí vị về vấn đề này. Hẹn gặp lại quý vị ở chủ đề khác
Không có nhận xét nào:
Đăng nhận xét