[JavaSQL] Bài 3- Truy vấn CSDL và hiển thị lên JTable
20:14
Chào các bạn.
Hai bài trước mình đã hướng dẫn các bạn về kết nối và truy vấn dữ liệu từ CSDL với MySQL.
Hôm nay, mình sẽ hướng dẫn các bạn truy xuất dữ liệu từ CSDL và hiển thị lên Frame thông qua đối tượng JTable.
Trước hết là khái niệm(cái này chắc ai cũng lười đọc – mình cũng vậy :) ).
– Java cung cấp cho ta một đối tượng có tên JTabel trong gói javax.swing. Thực chất đối tượng này chỉ là một component thông thường nhưng nó có hình dạng của một cái bảng giống như Excel vậy. Nhiệm vụ của chúng ta bây giờ là đưa dữ liệu vào từng ô của cái bảng này là xong.
– Để hiển thị bảng này lên Frame thì cũng giống như các components khác ta sử dụng
JTable jtable = new JTable();
frame.add(jtable)
Tuy nhiên, khi dữ liệu của chúng ta có quá nhiều hàng hay quá nhiều cột trong khi Frame chỉ có một kích thước nhỏ bé nào đó khiến ta không thể nhìn thấy hết dữ liệu được, Mà table thì không hề có một thanh cuộn nào để chúng ta có thể kéo nó và xem dữ liệu được. Java sinh ra một đối tượng JScrollPane giúp chúng ta làm việc này. JScrollPane cũng chỉ là một components giống như Jpanel vậy. Các components khác sẽ được thêm vào scrollpane và thêm scrollpane vào frame là chúng ta đã có một thanh cuộn dùng cho các đối tượng đó rồi.
Để thêm vào ta thực hiện câu lệnh
JScrollPanel scroll = JTable.createScrollPaneForTable(jtable);
frame.add(scroll);
Thế là xong rồi.
Tiếp theo chúng ta đến phần truy xuất dữ liệu và hiện dữ liệu lên jtable. Như mình đã nói ở trên, jtable chỉ là một component nên nó không thể chứa được dữ liệu, điều này hiển nhiên sẽ không đưa được kỳ dữ liệu nào vào jtable.
Java cung cấp cho ta một đối tượng có tên DefaultTableModel, đối tượng này sẽ lưu trữ dữ liệu và jtable sẽ đọc dữ liệu từ đây rồi hiện ra màn hình.
Vậy việc cần làm bây giờ sẽ là thiết đặt cho DefaultTableModel các thông tin dữ liệu là ok.
Trước hết ta cần phải kết nối jtable với DefaultTableModel đã.
Việc kết nối thực hiện qua một câu lệnh đơn giản như sau:
DefaultTableModel tableModel = new DefaultTableModel();
jtable.setModel(tableModel);
Bây giờ là viết dữ liệu vào tableModel nào :)
TableModel là một bảng có cấu trúc gồm tên các cột và nội dung của từng cột.
giống như hình dưới đây:
Để đặt tiêu đề cho các cột ta dùng lệnh sau:
String colsName[] = { “Mã hàng”, “Tên hàng” };
tableModel.setColumnIdentifiers(colsName);
Đoạn lệnh trên sẽ cài đặt cho bảng có 2 cột, với cột đầu có tên là “Mã hàng”, cột tiếp theo là “Tên hàng”
Đặt nội dung cho cột ta sử dụng lệnh sau:
String value[] = {“1″, “Áo phông”};
tableModel.addRow(value);
lệnh trên sẽ thêm một dòng dữ liệu vào bảng với thông tin tương ứng là: mã hàng = 1, tên hàng = áo phông.
Công việc còn lại của ta bây giờ là đưa dữ liệu từ CSDL lên tableModel. Bài trước mình đã hướng dẫn truy xuất bảng để xem CSDL thông qua đối tượng ResultSet.
Giả sử đã có đối tượng ResultSet chứa dữ liệu mà chúng ta muốn hiển thị. Để hiển thị dữ liệu từ ResultSet lên frame ta làm như sau:
String value[] = new String[2];
value[0] = resultSet.getString(1); // lấy dữ liệu ở cột 1
value[0] = resultSet.getString(2); // lấy dữ liệu ở cột 2
tableModel.addRow(value);
tương tự vậy ta sẽ dùng phương thức next() của đối tượng resultSet để kiểm tra xem có còn bản ghi nào không, nếu còn thì thực hiện lặp lại đoạn lệnh trên là được.
Ngoài cách sử dụng mảng value kiểu String thì ta có thể dùng kiểu Vector
Vector value = new Vector();
value.add( resultSet.getString(1) ); // lấy dữ liệu ở cột 1
value.add( resultSet.getString(2) ); // lấy dữ liệu ở cột 2
tableModel.addRow(value);
Vậy là xong rồi, các bạn copy đoạn code dưới đây vào lưu với tên là MyJTable.java sau đó chạy và xem kết quả :)
Lưu ý: trong CSDL của bạn sẽ phải có bảng HangHoa nhé! và tên CSDL là test, user là root, pass là khoaninh.
Hãy tùy cơ ứng biến với CSDL của bạn :)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
package
opin.swing.component; import
java.sql.Statement; import
java.sql.Connection; import
java.sql.DriverManager; import
java.sql.ResultSet; import
java.sql.SQLException; import
javax.swing.JFrame; import
javax.swing.JScrollPane; import
javax.swing.JTable; import
javax.swing.table.DefaultTableModel; public
class
MyJTable
extends
JFrame
{ private
static
final
long
serialVersionUID
= -6464587060272247354L; private
Connection
connect = null ; private
JTable
jtable = new
JTable(); private
DefaultTableModel
tableModel = new
DefaultTableModel(); public
MyJTable(){ String
[]colsName = { "Mã
hàng" ,
"Tên
hàng" }; tableModel.setColumnIdentifiers(colsName);
//
đặt tiêu đề cột cho tableModel jtable.setModel(tableModel);
//
kết nối jtable với tableModel initComponent();
//
Khởi tạo các components trên JFrame connectSQL();
//
kết nối cơ sở dữ liệu updateData(view());
//
gọi hàm view để truy suất dữ liệu sau đó truyền cho hàm updateData để đưa dữ
liệu vào tableModel và hiện lên Jtable trong Frame } public
void
updateData(ResultSet
result){ String
[]colsName = { "Mã
hàng" ,
"Tên
hàng" }; tableModel.setColumnIdentifiers(colsName);
//
Đặt tiêu đề cho bảng theo các giá trị của mảng colsName try
{ while (result.next()){
//
nếu còn đọc tiếp được một dòng dữ liệu String
rows[] = new
String[ 2 ]; rows[ 0 ]
= result.getString( 1 );
//
lấy dữ liệu tại cột số 1 (ứng với mã hàng) rows[ 1 ]
= result.getString( 2 );
//
lấy dữ liệu tai cột số 2 ứng với tên hàng tableModel.addRow(rows);
//
đưa dòng dữ liệu vào tableModel để hiện thị lên jtable //mỗi
lần có sự thay đổi dữ liệu ở tableModel thì Jtable sẽ tự động update lại trên
frame } }
catch
(SQLException
e) { e.printStackTrace(); } } public
void
initComponent(){ this .setSize( 400 ,
200 ); //
Đưa jtable vào trong thanh cuộn (khi dữ liệu quá nhiều dòng sẽ có thanh cuộn
ngang và doc để xem dữ liệu) JScrollPane
scroll = JTable.createScrollPaneForTable(jtable); this .add(scroll);
//
Đưa thanh cuộn vào Frame (hiện thanh cuộn trên frame) this .setDefaultCloseOperation(DISPOSE_ON_CLOSE); this .setVisible( true ); } public
void
connectSQL(){ try
{ Class.forName( "com.mysql.jdbc.Driver" ); String
url = new
String( "jdbc:mysql://127.0.0.1:3306/test" ); try
{ connect
= DriverManager.getConnection(url, "root" ,
"khoaninh" ); System.out.println( "Kết
nối thành công" ); }
catch
(SQLException
e) { e.printStackTrace(); } }
catch
(ClassNotFoundException
e) { e.printStackTrace(); } } public
ResultSet
view(){ ResultSet
result = null ; String
sql = "SELECT
* FROM HangHoa" ; try
{ Statement
statement = (Statement) connect.createStatement(); return
statement.executeQuery(sql); }
catch
(SQLException
e) { e.printStackTrace(); } return
result; } public
static
void
main(String[]
args) { new
MyJTable(); } } |
0 nhận xét