Bài viết này hướng dẫn về cách lập trình kết nối từ Java vào Cơ sở dữ liệu MySQL được demo trên môi trường phát triển NetBeans...
Giả sử tôi có hai bảng sau:
- Bảng "Viec" gồm các trường : MS, Noi dung (Ms là khoá chính). Hiện tại bảng "Viec" có 2 record sau:
MS Noi dung
1 ABC
2 DEC
- Bảng "Nguoi" gồm các trường: MS_nguoi, MS_vuviec, ho, ten, nam sinh (MS_nguoi là khóa chính, MS_vuviec là khóa ngoại).
Quan hệ: Main kết nối One-Many với bảng "Nguoi" qua khóa ngoại nguoi.MS_vuviec = Viec.MS (tức là trong 1 việc có thể có nhiều người tham gia, một người chỉ tham gia 1 việc).
Hiện tại bảng "Nguoi" có 5 record sau:
Tôi dùng lệnh SQL
SELECT DISTINCT viec.*, Nguoi.*
FROM viec INNER JOIN Nguoi ON viec.MS = Nguoi.MS_Viec;
thì được kết quả sau:
Bây giờ tôi muốn chỉ xuất ra như sau
MS Noi dung MS_nguoi MS_Viec Ho Ten Nam sinh
1 ABC 1 1 A B 1925
2 DEC 3 2 E F 1981
Tức là giá trị field MS chỉ xuất ra 1 lần không lặp lại như kết quả trên.
Bài viết sẽ trình diễn (demo) chi tiết về lập trình Java giải quyết yêu cầu trên bằng một chương trình java đơn giản dùng môi trường NetBeans (phân phối free bởi hãng SUN).
Nếu lập trình truy xuất database bằng ngôn ngữ Java, bạn có thể dùng các đối tượng trong package java.sql như Connection, Statement, ResultSet, ResultSetMetaData,... Ngoài ra, để truy xuất được database do MySQL server quản lý, bạn cần có JDBC driver tương ứng. Có nhiều JDBC driver có thể truy xuất được database của MySQL server, trong đó "MySQL Connector/J" là driver cho chính hãng SUN phân phối dạng "free-ware". Bạn có thể download driver này ở địa chỉ này, bung nó từ dạng nén thành dạng rõ, copy file "mysql-connector-java-5.1.13-bin.jar" sang thư mục xác định để chuẩn bị dùng nó lâu dài trong các ứng dụng Java mà bạn sắp viết.
Lệnh truy vấn SQL có tên là SELECT được dùng chủ yếu mỗi khi ta cần truy vấn và rút trích thông tin trên database theo một yêu cầu nào đó. Mặc dù lệnh SQL khá gần gũi với suy nghĩ bình thường của con người, nhưng vì nó có rất nhiều tham số (hoặc bắt buộc hoặc nhiệm ý) nên để nắm vững đầy đủ mọi khả năng của lệnh này, bạn cần nhiều thời gian thực hành sử dụng nó. Thí dụ câu lệnh mà bạn viết:
"SELECT DISTINCT viec.*, Nguoi.* FROM viec INNER JOIN Nguoi ON viec.MS = Nguoi.MS_vuviec;"
sẽ mở rộng field MS_vuviec (khóa ngoại) của tất cả record trong bảng Nguoi thành các field đầy đủ của record có field MS (khóa chính tương ứng) trong bảng Viec. Kết quả là bạn có 5 record = 5 record trong bảng Nguoi, nhưng thông tin đầy đủ hơn. Lưu ý từ khóa DISTINCT trong lệnh SELECT là giữ lại kết quả các record hoàn toàn khác nhau, nếu có nhiều record giống nhau thì chỉ giữ lại một. Tuy nhiên 2 record được gọi là giống nhau nếu chúng có tất cả các field giống nhau (chứ không phải chỉ có 1 field khóa ngoại giống nhau như bạn nghĩ).
|
Nếu muốn kết quả chứa các record mà field MS không được lặp lại (hay 1 kết quả nào đó đặc thù riêng của bạn), bạn cần viết đoạn code Java thực hiện điều này. Để demo chi tiết về lập trình Java giải quyết yêu cầu của bạn, chúng tôi đã thử viết 1 chương trình java đơn giản bằng môi trường NetBeans (phân phối free bởi hãng SUN) theo qui trình điển hình như sau:
1. Download JDK và môi trường NetBeans từ Internet và cài đặt vào máy.
2. Download MySQL server từ Internet và cài đặt vào máy, cấu hình thông số làm việc cho nó. Dùng tiện ích "MySQL Query Browser" kèm theo MySQL Server để tạo mới database có tên là test, trong database test tạo mới 2 bảng Viec và Nguoi, thêm các record dữ liệu vào từng bảng theo sự miêu tả của bạn.
3. Chạy NetBeans, nếu thấy NetBeans hiển thị Project nào đó (của lần cuối cùng trước đó), ấn phải chuột trên phần tử gốc của cây Project để hiển thị menu các chức năng rồi chọn option Close để đóng Project tương ứng lại.
4. Tạo Project mới bằng cách vào menu File.New Project. Khi cửa sổ New Project hiển thị, chọn mục Java trong listbox "Categories", chọn mục "Java Application" trong listbox "Projects" rồi ấn button Next để hiển thị cửa sổ Wizard kế tiếp.
5. Dùng button Browse để duyệt và xác định thư mục chứa Project, nhập tên Project vào mục "Project name" (thí dụ tên là NBMySQL), rồi ấn button Finish để hoàn tất qui trình đặc tả các thông số cấu hình Project. Cửa sổ hiển thị mã nguồn class Main miêu tả ứng dụng đã được tạo ra và đang được hiển thị, hãy viết thân của tác vụ main miêu tả ứng dụng như sau:
//chương trình Java đơn giản demo việc rút trích dữ liệu trong database
public static void main(String[] args) {
//định nghĩa các biến cần dùng
Connection con;
Statement stmt = null;
ResultSet rs = null;
ResultSetMetaData rsmd = null;
Object ms;
int fi, i;
//xây dựng chuỗi ConnectionString truy xuất database
String conStr = "jdbc:mysql://hiepcomp/test";
//lệnh truy vấn
String newSQL = "SELECT DISTINCT viec.*, Nguoi.* FROM viec INNER JOIN Nguoi ON viec.MS = Nguoi.MS_Vuviec order by viec.MS";
try {
//kết nối database
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(conStr, "root", "luonghoa");
//thực thi lệnh truy vấn, kết quả chứa trong rs
stmt = con.createStatement();
rs = stmt.executeQuery(newSQL);
rsmd = rs.getMetaData();
//xác định số field dữ liệu
int colnum = rsmd.getColumnCount();
//nếu có dữ liệu thì xuất hàng tiêu đề kết quả
if (rs != null && rs.next()) {
//xuất hàng tiêu đề
for (fi = 1; fi <= colnum;fi++)
System.out.print(rsmd.getColumnName(fi)+ "\t");
System.out.println();
//xuất hàng dữ liệu đầu tiên
for (fi = 1; fi <= colnum;fi++)
System.out.print(rs.getObject(fi)+ "\t");
System.out.println();
//lặp xuất từng hàng kết quả còn lại
while (rs.next()) {
//xuất 1 hàng dữ liệu
for (fi = 1; fi <= colnum;fi++)
System.out.print(rs.getObject(fi)+ "\t");
System.out.println("");
}
}
} catch (Exception e) {
System.out.println("Error : " + e);
}
//đóng các đối tượng đã dùng lại
finally {
if (rs != null) {
try { rs.close(); }
catch (Exception _ex) {System.out.println("Exception: " + _ex);}
}
if (stmt != null) {
try { stmt.close(); }
catch (Exception _ex) {System.out.println("Exception: " + _ex);}
}
}
}
6. Chọn menu Tools.Library để hiển thị cửa sổ Library Manager, chọn button New Library để tạo mới 1 thư viện cần dùng cho ứng dụng, chọn button Add JAR/Folder rồi duyệt tìm và chọn file thư viện miêu tả driver "MySQL Connector/J" được dùng trong ứng dụng.
7. Chọn menu Run.Run MainProject để dịch và chạy ứng dụng, nếu bạn thực hiện đúng tất cả các bước trên thì chương trình sẽ chạy và hiển thị 5 record trong bảng Nguoi giống y như bạn miêu tả.
8. Nếu muốn lọc bỏ các record có field MS trùng nhau, chỉ giữ lại 1 record, bạn hãy hiệu chỉnh đoạn code chức lệnh while (rs.next()) in đậm ở trên thành đoạn code sau:
ms = rs.getObject("MS");
while (rs.next()) {
//nếu tìm thấy record có field MS mới
if (rs.getObject("MS") != ms) {
ms = rs.getObject("MS");
for (fi = 1; fi <= colnum;fi++)
System.out.print(rs.getObject(fi)+ "\t");
System.out.println("");
}
}
9. Chọn menu Run.Run MainProject để dịch và chạy lại ứng dụng, chương trình sẽ chạy và hiển thị 2 record trong bảng Nguoi đúng theo yêu cầu của bạn
Nguyễn Văn Hiệp
(theo PC World VN)