Tạo lưới hiển thị và xử lý dữ liệu của các bảng dữ liệu trong Java
Tóm tắt: Java, không giống như VB và C#, không có lưới hiển thị dữ liệu
và bảng dữ liệu (RecordSet trong VB, C# và ResultSet trong Java). Vì vậy,
người lập trình thường gặp khó khăn khi tạo các ứng dụng quản lý dữ liệu.
Bài báo này giới thiệu một lớp Java do tác giả xây dựng có thể giúp giảm
bớt những khó khăn này
Bạn đang xem tài liệu "Tạo lưới hiển thị và xử lý dữ liệu của các bảng dữ liệu trong Java", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Tạo lưới hiển thị và xử lý dữ liệu của các bảng dữ liệu trong Java
Tạp chí Khoa học và Giáo dục, Trường Đại học Sư phạm Huế ISSN 1859-1612, Số 03(03)/2007: tr. 42-47 TẠO LƯỚI HIỂN THỊ VÀ XỬ LÝ DỮ LIỆU CỦA CÁC BẢNG DỮ LIỆU TRONG JAVA HÀ VIẾT HẢI Trường Đại học Sư phạm - Đại học Huế Tóm tắt: Java, không giống như VB và C#, không có lưới hiển thị dữ liệu và bảng dữ liệu (RecordSet trong VB, C# và ResultSet trong Java). Vì vậy, người lập trình thường gặp khó khăn khi tạo các ứng dụng quản lý dữ liệu. Bài báo này giới thiệu một lớp Java do tác giả xây dựng có thể giúp giảm bớt những khó khăn này 1. MỞ ĐẦU Java hiện là một trong những công nghệ lập trình mạnh mẽ và được sử dụng rộng rãi nhất trên toàn thế giới. Ngôn ngữ này có khả năng đáp ứng những nhu cầu hiện tại để phát triển các ứng dụng từ đơn giản đến phức tạp, những ứng dụng chạy cục bộ trên máy đơn và những ứng dụng mạng ở các mức độ khác nhau. Về mặt truy cập cơ sở dữ liệu (CSDL), Java sử dụng các cầu nối ODBC, JDBC dạng cục bộ và mạng rất mạnh để kết nối tới các dạng CSDL khác nhau ở phạm vi kết nối khác nhau. Tuy nhiên, để hiển thị dữ liệu của một bảng dữ liệu (Data Table), Java không có sẵn công cụ thuận tiện để hiển thị dữ liệu ở dạng bảng. Điều này khác với VB, C#, khi sử dụng lớp lưới hiển thị dữ liệu (Data Grid) của chúng, ta có thể dễ dàng đưa dữ liệu của một bảng dữ liệu và hiển thị chúng trong các giao diện đồ hoạ một cách rất đơn giản và dễ dàng. Vì vậy, người lập trình thường gặp khó khăn và mất công sức khi lập trình Java để hiển thị và xử lý dữ liệu trong lưới. Bài báo này nhằm giới thiệu một lớp (class) Java có tên gọi là ResultSetTable do tác giả xây dựng để giảm bớt sự khó khăn này. Lớp này đã được các sinh viên Tin học sử dụng rộng rãi trong việc tạo lập các phần mềm quản trị CSDL bằng ngôn ngữ Java. 2. MỘT VÍ DỤ SỬ DỤNG LỚP ResultSetTable Dưới đây là một ví dụ sử dụng lớp ResultSetTable. Ứng dụng kết nối với CSDL NorthWind trong bộ MicroSoft Office. Người sử dụng chọn tên bảng dữ liệu cần hiển thị trên combo box Select table, sau đó nhấn nút Display, dữ liệu của bảng được chọn sẽ được hiển thị ở trung tâm của giao diện. Đây là một ví dụ điển hình cho thấy sự cần thiết của việc hiển thị dữ liệu của một bảng dữ liệu (chứa trong một đối tượng kiểu ResultSet). Mã nguồn của ví dụ này được giới thiệu trong phần 5. TẠO LƯỚI HIỂN THỊ VÀ XỬ LÝ DỮ LIỆU CỦA CÁC BẢNG DỮ LIỆU TRONG JAVA 43 Hình 1. Giao diện của một ứng dụng sử dụng lớp ResultSetTable 3. PHÂN TÍCH YÊU CẦU VÀ THIẾT KẾ LỚP ResultSetTable Các yêu cầu chính về lưới hiển thị dữ liệu là Khả năng hiển thị dữ liệu của một bảng dữ liệu Java (ResultSet) trong lưới. Khả năng hiển thị lưới dữ liệu trong một khung có thanh trượt dọc. Một số tính năng khác để xử lý dữ liệu trong lưới. 3.1. Hiển thị dữ liệu của một bảng dữ liệu Java (ResultSet) trong lưới Đây là yêu cầu cơ bản và quan trọng nhất. Java không có sẵn lớp nào thực hiện trực tiếp được điều này. Thông thường, bảng dữ liệu được hiển thị ở dạng lưới, với dòng đầu tiên chứa tên các trường, mỗi dòng tiếp theo chứa dữ liệu của một bản ghi. Lớp gần nhất của Java để đáp ứng nhu cầu là JTable. Nó có khả năng hiển thị một lưới, tuy nhiên, dữ liệu phải đưa vào dưới dạng các Vector (một lớp của Java) chứ không phải phải dạng ResultSet. Trong số những cấu tử của JTable, cái thích hợp nhất cho việc hiển thị bảng dữ liệu là cấu tử có hai tham số, trong đó tham số thứ nhất là một vector (một chiều) chứa tên các trường dữ liệu, tham số thứ hai cũng là một vector (hai chiều) chứa dữ liệu của các bản ghi. Do vậy, ta có thể lựa chọn phương án xây dựng lớp mới có chứa một bảng dạng JTable. Việc đưa dữ liệu từ ResultSet vào bảng được tiến hành qua hai bước. Bước thứ nhất, lần lượt đọc cấu trúc (tên các trường dữ liệu) và dữ liệu (các record) của ResultSet nạp chúng vào trong một vector (một chiều) chứa tên các trường và một vector (hai chiều) chứa dữ liệu. Bước thứ hai, gọi cấu tử của JTable với các tham số là hai vector của bước trên để khởi tạo bảng hiển thị dữ liệu có dòng tiêu đề chứa tên của các trường và các dòng nội dung chứa nội dung của các bản ghi. HÀ VIẾT HẢI 44 Để lấy ra được cấu trúc của một ResultSet nói chung và tên của các trường của đối tượng này nói riêng, ta sử dụng phương thức getMetaData( ) của nó, phương thức này sẽ trả về một đối tượng dạng ResultSetMetaData. Từ đối tượng nhận được này, ta có thể lấy ra những thông tin cần thiết về cấu trúc của ResultSet như số trường, tên trường... Việc lấy dữ liệu của các bản ghi từ một ResultSet thì đơn giản hơn nhờ sử dụng các phương thức có sẵn của lớp này. Để đưa dữ liệu của nó vào một vector, ta chỉ việc lần lượt đọc từng bản ghi của nó và nạp thêm vào vector cần tạo. 3.2. Hiển thị lưới dữ liệu trong một khung có thanh trượt dọc Yêu cầu này là cần thiết trong trường hợp dữ liệu chứa quá nhiều dòng và không thể hiển thị toàn bộ cùng một lúc trên giao diện. Lúc này cần có thanh trượt để người sử dụng có thể duyệt tới phần dữ liệu mà mình quan tâm. Lớp Java đáp ứng yêu cầu gần nhất là JScrollPane. Nó là một lớp chứa (container) có khả năng hiển thị một JTable ở bên trong và có thanh trượt dọc ở biên để duyệt qua nội dung của JTable này khi cần thiết. Do vậy phương án được chọn là khởi tạo một JSrcollPane với tham số là JTable chứa bảng dữ liệu được yêu cầu. 3.3. Một số yêu cầu bổ sung khác Để thuận tiện hơn cho lập trình viên khi xử lý bảng dữ liệu, có thể thêm các phương thức khác để đáp ứng cho các nhu cầu thường gặp được yêu cầu trên lưới dữ liệu như bổ sung dòng, xoá dòng, chọn dòng... 4. MÃ NGUỒN LỚP ResultSetTable Phần này chỉ giới thiệu phương thức cơ bản nhất là cấu tử khởi tạo một đối tượng của lớp từ một ResultSet. Độc giả có thể liên hệ với ban biên tập hoặc tác giả (theo địa chỉ HaVietHai@Google.com) nếu muốn có mã nguồn chi tiết hơn. /** * Title: ResultSetTable * Description: A class helping to create a Table displaying the contents of a resultset * Copyright: Copyright (c) 2003 - 2004 * Company: Hue University * @author Ha Viet Hai * @version 2.1 */ import javax.swing.*; import java.util.*; import java.sql.*; public class ResultSetTable{ private Vector vectorColNames; //vector contains field names private Vector vectorData; //vector contains all records private JTable jTableData; //table displays recordset private JScrollPane jScrollPaneTable; //scrollPane contains the table displaying recordset //constructor 1 - create a ResultSetTable from a Resultset TẠO LƯỚI HIỂN THỊ VÀ XỬ LÝ DỮ LIỆU CỦA CÁC BẢNG DỮ LIỆU TRONG JAVA 45 public ResultSetTable(ResultSet rs) throws SQLException{ ResultSetMetaData rm = rs.getMetaData(); //determing the number of columns in each row of the resultset int numberCols = rm.getColumnCount(); //create the vector contains field names vectorColNames = new Vector(); for(int i=1; i<=numberCols; ++i){ vectorColNames.addElement(rm.getColumnName(i)); } //create the vector contains all the rows of resultset vectorData = new Vector(); //vector contains all records Vector row; //vetor contains one record while(rs.next()){ //read the current record and add its data to a vector row = new Vector(); for(int col=1; col<=numberCols; ++col){ row.addElement(rs.getString(col)); } vectorData.addElement(row); //add the current record to vector contains all records } this.jTableData = (new JTable(vectorData, vectorColNames)); this.jScrollPaneTable = new JScrollPane(this.jTableData); }//constructor 1 // The other methods of class here have been omitted here }//class 5. MÃ NGUỒN MỘT VÍ DỤ SỬ DỤNG LỚP ResultSetTable Phần này trình bày mã nguồn sử dụng lớp ResultSetTable có giao diện như trong phần II. Để chạy được ví dụ này, trước hết cần tạo một System DSN có tên NWind qua cầu nối ODBC để kết nối tới CSDL NorthWind (file Northwind.mdb) trong bộ MicroSoft Office. Độc giả có thể sử dụng trực tiếp mã nguồn trong bài báo này hoặc liên hệ với ban biên tập hoặc tác giả nếu muốn có mã nguồn chi tiết hơn. Phần mã đầu của lớp nhằm tạo giao diện như hình 1. Mỗi khi nút Display được bấm, tên của bảng dữ liệu cần được hiển thị được lấy từ ComboBox Select table. Tên này được dùng để đọc ra một ResultSet tương ứng từ kết nối Nwind. Sau đó lớp ResultSetTable được sử dụng để khởi tạo một JScrollPane chứa dữ liệu của ResultSet vừa đọc được. JScrollPane được hiển thị lên ở giữa giao diện như ở hình 1. import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; /** * Title: * Description: A resultset displaying program * Copyright: Copyright (c) 2003-2004 HÀ VIẾT HẢI 46 * Company: Hue University * @author: Ha Viet Hai * @version 2.0 //Note: Before run this program, set a DNS (ODBC) pointing to the NorthWind database of Microsoft public class ResultSetDisplayFrame extends JFrame implements ActionListener{ JPanel contentPane; BorderLayout borderLayout1 = new BorderLayout(); JPanel jPanelNorth = new JPanel(); JPanel jPanelCenter = new JPanel(); JPanel jPanelSouth = new JPanel(); JLabel jLabelSelectTable = new JLabel(); JComboBox jComboBoxTableName = new JComboBox(); JButton jButtonRun = new JButton(); Connection con; Statement stm; ResultSet rs; ResultSetTable resultSetTableRS; JScrollPane scp; //Construct the interface – A frame public ResultSetDisplayFrame(String title){ super(title); contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(borderLayout1); jPanelSouth.setBackground(Color.orange); jPanelCenter.setBackground(Color.pink); jPanelNorth.setBackground(Color.orange); jLabelSelectTable.setText("Select table:"); jComboBoxTableName.addItem("Customers"); jComboBoxTableName.addItem("Orders"); jComboBoxTableName.addItem("Products"); jButtonRun.setText("Display"); jButtonRun.addActionListener(this); jButtonRun.setActionCommand("Display"); jComboBoxTableName.addActionListener(this); jComboBoxTableName.setActionCommand("Select Table"); contentPane.add(jPanelNorth, BorderLayout.NORTH); jPanelNorth.add(jLabelSelectTable); jPanelNorth.add(jComboBoxTableName); jPanelNorth.add(jButtonRun); contentPane.add(jPanelCenter, BorderLayout.CENTER); contentPane.add(jPanelSouth, BorderLayout.SOUTH); //Connect to the database try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:NWind"); stm = con.createStatement(); }catch(Exception e){System.out.println(e);} } //constructor //-------------------------------------------- public void actionPerformed(ActionEvent e) { TẠO LƯỚI HIỂN THỊ VÀ XỬ LÝ DỮ LIỆU CỦA CÁC BẢNG DỮ LIỆU TRONG JAVA 47 if(e.getActionCommand().equals("Display")){ String query = "Select * From " + jComboBoxTableName.getSelectedItem().toString(); try{ rs = stm.executeQuery(query); resultSetTableRS = new ResultSetTable(rs); scp = resultSetTableRS.getJScrollPane(); scp.setPreferredSize(new Dimension(650, 250)); jPanelCenter.removeAll(); jPanelCenter.add(scp); this.validate(); }catch(Exception ex){System.out.println(ex);} }//Display } //---------------------------------------------- public static void main(String args[]){ ResultSetDisplayFrame frame1 = new ResultSetDisplayFrame("Display ResultSet in a Table"); frame1.setSize(new Dimension(700,400)); frame1.show(); } //main() } //class 6. KẾT LUẬN Khả năng đáp ứng cho việc lập trình quản trị CSDL của Java là rất mạnh. Tuy nhiên, tại một số điểm, ta cần phải viết thêm những tiện ích bổ sung để phát triển khả năng của nó. Lớp ResultSetTable là một sản phẩm đi theo hướng này. Hy vọng nó cung cấp thêm cho những ai quan tâm đến mảng lập trình quản trị CSDL nói riêng và lập trình trên Java nói chung một chút ý tưởng để cho công việc của mình được tiến hành một cách nhanh chóng và thuận tiện hơn. Độc giả có thể tiếp tục phát triển lớp này để nó thể có được những tính năng tương tự như của lớp DataGrid của VB và C#. TÀI LIỆU THAM KHẢO [1] Nguyễn Tiến - Nguyễn Văn Tâm - Nguyễn Văn Hoài (2001), Java, lập trình cơ sở dữ liệu, NXB Thống kê. [2] Aptech World Wide (2002), Advanced Java, Giáo trình giảng dạy Java. [3] Sun MicroSystems Inc., Java Tutorial, version 1.4.1. [4] Sun MicroSystems Inc., JavaTM 2 SDK, Standard Edition Documentation, version 1.4.1. Title: CREATING A GRID FOR DATA DISPLAYING AND PROCCESSING OF DATA TABLES IN JAVA Abstract: In Java, not like in VB and C#, there isn’t the grid that can display directly the data of a data table (RecordSet in VB, C# and ResultSet in Java) so programmers often have many difficulties when creating the data management applications. This paper refers to present an author’s class that helps this work becomes easier. ThS. HÀ VIẾT HẢI GV Khoa Tin học, Trường Đại học Sư phạm - Đại học Huế.
File đính kèm:
- tao_luoi_hien_thi_va_xu_ly_du_lieu_cua_cac_bang_du_lieu_tron.pdf