『 BangMaple's Blog 』

BangMaple's Blog. Nơi sẻ chia kiến thức!

Lập trình ứng dụng Java sử dụng JPA truy cập cơ sở dữ liệu SQL Server

Không có nhận xét nào


Xin chào các bạn.

Trong bài viết này, mình sẽ hướng dẫn các bạn truy cập cơ sở dữ liệu bằng cách lập trình ứng dụng Java sử dụng công nghệ JPA.

Tại sao sử dụng JPA?

- Từ xưa giờ, chúng ta muốn truy cập cơ sở dữ liệu thì dùng JDBC (Java DataBase Connectivity) và việc thực hiện các phương thức đóng-mở kết nối, sử dụng nhiều class và sẽ làm cho code của chúng ta cồng kềnh và khó bảo trì sau này.

- Việc triển khai và bảo trì code Java và SQL đã phải gặp rất nhiều khó khăn trong việc chuyển giao giữa các Database, công việc bảo trì code cũng cần phải kiểm tra lại ứng dụng -> Tốn rất nhiều công sức và chi phí.
Nguồn: gpcoder
- JPA (Java Persistence API) được phát triển trên ORM (Object-Relational Mapping) giúp chúng ta bỏ đi những rào cản trên và làm cho code dễ bảo trì và kiểm tra hơn!

Cụ thể ở đây là một ứng dụng Java Console cơ bản truy cập đến cơ sở dữ liệu SQL Server bằng việc sử dụng công nghệ EclipseLink JPA trên công cụ lập trình NetBeans IDE.

Chức năng CRUD (Create - Read - Update - Delete) sẽ được bao quát trong bài viết này!

- Những thứ cần chuẩn bị:

  • Java JDK 8 trở lên.
  • NetBeans IDE 8.0 trở lên.
  • Thư viện kết nối cơ sở dữ liệu (sqljdbc4-4.0.jar).
  • SQL Server 2008 trở lên đã được cài đặt sẵn.
Đầu tiên, khởi chạy công cụ NetBeans IDE.
(Hình 1) Tạo một project mới sử dụng Java with Ant với Java Application
(Hình 2) Mình đặt tên cho project là DemoJPA (bạn có để đặt tuỳ ý)
Nhấn Finish để tạo project Java Application trong công cụ NetBeans IDE.
(Hình 3) Trên cửa sổ Projects, chuột phải vào Libraries chọn "Add JAR/Folder" để thêm thư viện
Mình sẽ cần phải thêm thư viện sqljdbc4-4.0.jar (nếu bạn không có, bạn có thể tìm kiếm và tải xuống trên Google).

Vậy mục đích thêm thư viện đó để làm gì? Thư viện đó sẽ đóng vai trò là cầu nối giúp kết nối cơ sở dữ liệu với ứng dụng Java của chúng ta.
(Hình 4) Đây sẽ là cửa sổ sau khi thêm thư viện hoàn tất
Để có thể thực hiện các chức năng CRUD thì đương nhiên việc đầu tiên của chúng ta là kết nối đến cơ sở dữ liệu, tạo một Database và thêm một Table.

Để làm được điều này, bạn cần chọn tab Services. Sau đó nhấn chuột phải vào dòng Database và chọn New Connection...

(Hình 5) Tạo một kết nối mới đến cơ sở dữ liệu
Trong cửa sổ New Connection Wizard ở trong dòng Driver thì các bạn chọn dòng New Driver...
(Hình 6) Khởi tạo kết nối sử dụng driver (thư viện)
Chúng ta sẽ nhận thấy có thông báo Driver File is missing. Việc cần làm là thêm thư viện sqljdbc4-4.0.jar cho nó bằng cách chọn nút Add và thêm vào.
(Hình 7) Thêm tập tin thư viện đã tải về
Sau đó mình sẽ đặt tên cho kết nối này là Microsoft SQL Server 4.0 và nhấn OK sau đó nhấn Next trong cửa sổ kế.

(Hình 8) Đặt tên cho kết nối
Để có thể thực hiện như hình 9, bạn cần phải tìm hiểu "Mở port 1433 cho MS SQL Server" và "Bật mixed authentication SQL Server".

Trong mục host bạn hãy gõ địa chỉ IP của SQL Server bạn muốn kết nối tới, nếu bạn cài đặt MSSQL Server ngay trên máy bạn thì bạn chỉ cần gõ localhost, mình kết nối thông qua máy khác nên mình sẽ gõ IP khác.

Hãy để mục Port là 1433. Đặt tên cho mục Database là master.
Phần User Name thì bạn đặt là sa có nghĩa là system admin.
Phần Password đặt theo như cách bạn đặt từ trước theo tài khoản sa.

Sau khi hoàn tất, hãy nhấn nút Test Connection để xác thực kết nối, nếu thành công thì cửa sổ sẽ hiện Connection Succeeded và nhấn nút Next.
(Hình 9) Kết nối thử nghiệm thành công đến cơ sở dữ liệu
Trong mục Select schema hãy chọn dbo và nhấn nút Finish.
(Hình 10) Lựa chọn schema phù hợp
Nếu cuối cùng cửa sổ hiện như thế này là bạn đã tạo một kết nối thành công đến cơ sở dữ liệu!
(Hình 11) Một kết nối đến CSDL đã được tạo thành công
Chúng ta cần phải tạo một cơ sở dữ liệu riêng và sau đó sẽ tạo một bảng (Table) bằng cách sử dụng các lệnh SQL (bạn có thể Google để học thêm lệnh SQL).

(Hình 12) Execute Command.
Chọn Execute Command để thực thi các lệnh SQL.

(Hình 13) Tạo một cơ sở dữ liệu có tên là Schools
Sau khi cửa sổ truy vấn lệnh SQL được xuất hiện, mình sẽ tạo một cơ sở dữ liệu mới có tên là Schools bằng lệnh CREATE DATABASE Schools và sau đó nhấn biểu tượng Run SQL để thực thi truy vấn này!
(Hình 13) Thực thi truy vấn
Cơ sở dữ liệu chúng ta mong muốn đã được tạo, để sử dụng thường xuyên cơ sở dữ liệu này. Bạn cần phải chuột phải vào cơ sở dữ liệu muốn đánh dấu là quan trọng và sau đó chọn Mark as important là cơ sở dữ liệu của bạn sẽ được đưa lên đầu.
(Hình 14) Đánh dấu quan trọng cho cơ sở dữ liệu
Sau đó quay lại bảng gõ lệnh truy vấn, gõ lệnh USE Schools và nhấn nút Run selection bên cạnh nút Run SQL và gõ tiếp lệnh tạo một bảng Students như hình dưới và sau đó thực thi.
(Hình 15) Thực thi lệnh SQL để tạo bảng Students
Để kiểm chứng cơ sở dữ liệu chúng ta có hoạt động bình thường hay không thì hãy thử thêm một dữ liệu đúng đắn vào bảng.
(Hình 16) Thử thêm dữ liệu cho bảng Students
Nếu đã thành công thì hãy quay lại tab Projects và chuột phải vào Project DemoJPA đã tạo trước đó và chọn New > Other...
(Hình 17) Thêm mới một class định sẵn
Sau đó chọn mục Persistence và chọn kiểu tệp tin là Entity Classes from Database và nhấn nút Next.
(Hình 18) Tạo một class
Chúng ta cần phải tạo một đối tượng tương ứng với bảng trong cơ sở dữ liệu, nên chúng ta phải ánh xạ nó thông qua kết nối database. Chọn New Database Connection... và thực hiện thao tác kết nối đến cơ sở dữ liệu Schools mà đã tạo trước đó theo hình 7-8-9-10.
(Hình 19) Ánh xạ bảng với đối tượng cần tạo
Kết nối đến cơ sở dữ liệu thành công, chúng ta cần phải thêm bảng Students từ bên trái qua nên chúng ta chọn nút Add > để thêm và nhấn Next!
(Hình 20) Chọn một bảng có sẵn trong CSDL
Ở cửa sổ kế tiếp, hãy nhấn Next. Nếu bạn muốn tìm hiểu sâu hơn thì hãy Google với những từ khoá trong hình.
(Hình 21) Thiết lập Entity Class
Hãy để mặc định đối với lựa chọn ánh xạ và nhấn Finish để hoàn tất tạo một Entity Class.
(Hình 22) Thiết lập tuỳ chọn ánh xạ cho Entity Class
Chúng ta sẽ thấy có thêm các tệp tin persistence.xml, Students.java và các thư viện EclipseLink JPA được thêm vào Project. Nhấp đôi vào class Students để xem cấu trúc của nó.
(Hình 23) Cấu trúc của một Project sau khi generate JPA Entity Classes
Đừng sợ nếu bạn gặp nhiều cái lạ, nếu bạn đã học lập trình hướng đối tượng với Java thì đây chính là một đối tượng thông thường không hơn không kém. Hãy để ý đến @NamedQueries, nó sẽ giúp chúng ta nhiều việc rất nhẹ nhàng!
(Hình 24) Cấu trúc của đối tượng Students
Để có thể thực hiện các thao tác CRUD thì chúng ta cần một class để quản lí các Students, hãy tạo một class mới! Tạo một Java Class thông thường với tên là StudentsManager và nhấn Finish.
(Hình 25) Tạo một Java Class
(Hình 26) Tạo một Java Class - 2
Áp dụng interface Serializable vào class của chúng ta và chuột phải chọn mục Insert Code sau đó chọn Use Entity Manager để tạo những phương thức quản lí Entity của chúng ta.
(Hình 27) Use Entity Manager
Một phương thức thêm đã được tạo, để có thể sử dụng sửa/xoá/tìm kiếm thì chúng ta cần phải đẩy EntityManagerFactory làm biến dùng chung.
(Hình 28) Phương thức persist được sinh ra
(Hình 29) Biến emf được đặt làm thuộc tính của class StudentsManager
Mình sẽ làm thêm phương thức tìm Students dựa trên ID như hình 30. Tham số thứ 2 mà phương thức find của biến EntityManager nhận vào là khoá chính của một bảng trong cơ sở dữ liệu và chúng ta sẽ có một Students có đầy đủ các thuộc tính.

(Hình 30) Phương thức tìm kiếm dựa trên ID
Đã tìm kiếm dựa trên ID thì chúng ta làm luôn tìm kiếm tất cả và trả về một danh sách các Students.
(Hình 31) Xây dựng phương thức trả về danh sách các Students
(Hình 32) Xây dựng phương thức xoá Students dựa trên ID

(Hình 33) Xây dựng phương thức cập nhật tuổi Students dựa trên ID
Ở hình 34, mình có sử dụng biến tham số partName để đặt giá trị cho biến đấy, cùng với hình 31 hãy tham khảo trong class Students ở phần @NamedQueries nếu bạn muốn tìm hiểu thêm.
(Hình 34) Xây dựng phương thức trả về danh sách các Students có trùng phần tên/tên

Mình đã hoàn tất tạo phương thức CRUD hữu dùng nhất cho các bạn, các bạn có thể tuỳ biến theo ý thích và không giới hạn tư duy!

Mình sẽ thử nghiệm các phương thức này trong class có chứa phương thức main của mình.

(Hình 35) Thử nghiệm các phương thức vừa tạo trong main
Kết quả thu được trong output hoàn toàn đúng như những gì chúng ta đã lập trình!

(Hình 36) Output
Đừng giới hạn bản thân mình với những phương thức mình cho sẵn, hãy tạo thêm những phương thức tuyệt vời khác nữa.

Bạn hãy nên ngâm cứu thêm và JDBC (Java DataBase Connectivity), JPA (Java Persistence API) nếu muốn tìm hiểu nhiều cái mới hơn.

Từ đó có thể nghiên cứu thêm về ORM Framework khác như là Hibernate thay vì EclipseLink JPA.


Chúc các bạn học tốt!

Sự khác nhau giữa "include" và "import" keyword

Không có nhận xét nào
Xin chào các bạn.

Có thể các bạn không để ý hoặc là không biết. Nếu các bạn đã từng lập trình căn bản với ngôn ngữ lập trình C và ngôn ngữ lập trình Java, các bạn sẽ để ý thấy có 2 keyword chính là include và import.

Mục đích của bài viết này có ý nghĩa gì?
- Tóm gọn vấn đề chính của 2 keyword include import.
- Cải thiện kĩ năng lập trình.

Vậy trước khi đi vào định nghĩa thì hãy đi vào thực hành trước nhỉ, mình sẽ demo trên NetBeans IDE.
Đầu tiên là sử dụng keyword import đối với một chương trình Java đơn giản.
(Hình 1)

Sau đó chúng ta cần biên dịch từ tệp tin .java sang tệp tin .class!
(Hình 2)

Hãy để ý đến dung lượng của tệp tin trước và sau biên dịch!

Tiếp theo là sử dụng keyword include đối với một chương trình C đơn giản.
(Hình 3)

Hãy cùng biên dịch chương trình này!
(Hình 4)

Mặc định là sau khi build một chương trình trên NetBeans IDE thì chương trình đích (có thể thực thi) sẽ nằm trong thư mục dist nhưng mình cố ý để chung trong một thư mục project hiện tại để các bạn có thể dễ dàng so sánh!

Tại đây, mình đã cho chạy thử chương trình C cơ bản và hoạt động rất bình thường. Nhưng có một điều khá là lạ lẫm là tệp tin sau khi biên dịch của chương trình C có dung lượng lớn hơn chục lần so với tệp tin tiền biên dịch.

Mình viết đến đây thì các bạn cũng hình dung được một chút về 2 keyword đó rồi nhỉ..

Để rõ hơn, chúng ta hãy cùng dịch ngược mã nguồn của 2 tệp tin hậu biên dịch từ chương trình Java và C!
Các bạn có thể dễ dàng tìm cho mình một trình dịch ngược trực tuyến trên mạng, đối với ngôn ngữ lập trình Java thì mình sẽ dùng trang: javadecompilers.com 

Đây là kết quả sau khi dịch ngược tệp tin JavaConsoleApp.class mà mình đã biên dịch trước đó.
(Hình 5)
Kết quả được hiện hữu trực tiếp cho chúng ta thấy là tệp tin sau khi dịch ngược và tệp tin tiền biên dịch của chương trình Java tương đồng với nhau.

Hãy cùng tiếp tục dịch ngược đối với chương trình C khả nghi của chúng ta!
(Hình 6)
Ngôn ngữ lập trình C không có một trình dịch ngược nào hoàn chỉnh giống như tệp tin tiền biên dịch ở hình 3. Ở đây, mình sử dụng phần mềm Snowman Decompiler để các bạn có thể dễ hình dung nhất.

Đối với hàm printf nó sẽ phải lệ thuộc vào thư viện stdio.h, vậy chúng ta cần phải include nó vào là điều hiển nhiên. Ở đây chúng ta chỉ sử dụng một hàm printf để in ra số 0 nhưng nào ngờ nó lại chèn tất cả source code của tệp tin stdio.h vào trong chương trình của chúng ta.
(Hình 7: Source code tệp tin stdio.h)
Chúng ta thấy không chỉ hàm printf mà còn có rất nhiều hàm chúng ta không dùng đến.

Quay lại về ngôn ngữ Java, chúng ta có một slogan mà đã được học trong môn lập trình Java cơ bản, tạm dịch: Viết một lần, chạy bất kì nơi nào.
(Hình 8 -  Nguồn: Google Search)
Điều này chỉ đúng nếu như thiết bị của bạn đã cài đặt môi trường máy ảo Java và phần phụ trợ của nó, có thể nói là JRE (Java Runtime Environment).
Hầu hết các hệ điều hành hiện tại đều có thể cài đặt và sử dụng JRE một cách bình thường.

Vậy cái keyword import của ngôn ngữ lập trình Java muốn nói với chúng ta điều gì?
(Hình 9: Cấu trúc thư mục của Java JRE)
Java JRE đã giấu cụ thể thư viện java.util.Arrays đang hiện hữu ở đâu, nhưng chúng ta có thể dễ dàng nhận ra nó không thể nằm đâu ngoài thư mục lib (libraries) được. 

Cùng với hình 8, dễ dàng hiểu được là chúng ta không cần phải chèn thư viện của Java trong khi biên dịch thành tệp tin .class mà chỉ cần reference (đối chiếu/xem/tham khảo) đến thư viện có sẵn của máy ảo Java để từ đó chạy chương trình một cách bình thường và cũng được lợi thế là tệp tin sau biên dịch có dung lượng tối thiểu!

Ngược lại đối với ngôn ngữ lập trình C không có một máy ảo thực thụ và cũng không có tính chất Write once, run anywhere. Chúng ta đã biên dịch ra một chương trình C từ tệp tin tiền biên dịch nhưng chưa chắc tệp tin có đã có thể chạy trên hệ điều hành Windows được.

Buộc nó phải đính kèm luôn mã nguồn của thư viện trong khi biên dịch một chương trình C, từ đó làm chương trình C của chúng ta lớn lên là vậy.

Nói cho dễ hiểu, giống như việc bạn luôn thuê nhà ở gần một siêu thị tiện lợi và việc bạn sống xa siêu thị tiện lợi nên bạn phải mua tất cả những đồ dùng bạn cần về một lần để khỏi tốn sức và mất công lần sau đi mua nữa!

Tóm gọn

  • include sẽ nói với compiler vào bên trong thư viện chuẩn của nó để copy tệp tin thư viện (headers) và đính kèm vào chương trình từ đó làm tăng kích cỡ chương trình tương ứng với số thư viện bạn khai báo!
  • import sẽ nói với compiler khi nào gọi đến method có tên nó thì hãy vào thư viện có sẵn trong Java JRE và reference đến những thư viện có liên quan đến nó nhất, không cần phải đính kèm toàn bộ source code trong quá trình biên dịch.

Hi vọng bài viết này sẽ giúp các bạn phân biệt được 2 keyword được đề cập đến bài nhiều nhất!
Có thể trong quá trình phỏng vấn bạn sẽ gặp phải vấn đề phân biệt chúng, bạn sẽ tự tin trong việc lập trình hơn đấy!

Chúc các bạn học tốt!