• Thứ Ba, 26/04/2011 17:38 (GMT+7)

    Lập trình: Kết nối CSDL từ Java vào MySQL

    Nguyễn Băn Hiệp
    Bạn đọc “boy_it98” trên “Cộng đồng” của Tạp chí Thế Giới Vi Tính - PC World Vietnam có yêu cầu hướng dẫn về cách kết nối CSDL từ Java vào MySQL với các chi tiết:

    Bạn đọc “boy_it98” trên “Cộng đồng” của Tạp chí Thế Giới Vi Tính – PC World Vietnam đã có yêu cầu hướng dẫn về cách kết nối CSDL từ Java vào MySQL với các chi tiết: 

    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ỉ "http://dev.mysql.com/downloads/connector/j/", 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.
     

    ID: A1102_84
    Bài liên quan
    Ý kiến của bạn? Ý kiến của bạn?
    Tin ngày :