Mang đến cho bạn hành trang là Kiến thức và Kinh nghiệm

Lựa chọn chủ đề bạn quan tâm

Cùng nhau thảo luận về các vấn đề

Hãy theo dõi chúng tôi nếu bạn thấy bổ ích

  1. Hỏi đáp IT
  2. Hỏi nhanh

Làm thế nào để load data từ MySql vào JTable

Sau khi kết nối được với MySql rồi thì làm sao để load được data từ một table nào đó trên csdl của mình vào JTable rồi hiển thị lên màn hình. Mình có thấy mấy cái hướng dẫn là sd lớp DefaulTableModel, với AbtractTableModel gì đó mà ko hiểu được. Mong mọi người giúp đỡ
public void putDataToTable(Connection cn, JTable tb, String tbName, final boolean isEditable) {
        try {
            
PreparedStatement cs = cn.prepareStatement(
                    
String.format("SELECT * FROM [%s]", tbName),
                    
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
            
ResultSet rs = cs.executeQuery();
            
Vector colName = new Vector<>();

            
ResultSetMetaData data = rs.getMetaData();
            
int count = data.getColumnCount();
            for (
int i = 1; i <= count; i++) {
                
colName.add(data.getColumnName(i));
            }

            
Vector row;
            
DefaultTableModel dtm = new DefaultTableModel(){
                @
Override
                
public boolean isCellEditable(int i, int i1) {
                    return 
isEditable;
                }
            };
            
dtm.setColumnIdentifiers(colName);
            while (
rs.next()) {
                
row = new Vector();
                for (
int i = 1; i <= count; i++) {
                    
row.add(rs.getString(i));
                }
                
dtm.addRow(row);
            }
            
tb.setModel(dtm);
        } catch (
SQLException ex) {
            
Logger.getLogger(DBHander.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


Câu trả lời

- Bạn đã sẵn sàng thảo luận về chủ đề này. Hãy bấm "Viết bình luận", bạn có thể lựa chọn sử dụng tài khoản Facebook hoặc Google++

- Vì sự phát triển của cộng đồng CNTT/CNPM tại Việt Nam!

Unknown user
No responses yet

Trước hết, cái JTable của bạn phải được đặt trong một cái JScrollPane trước đã nhé.... Vì khi đặt trong JScrollPane thì cái Column Header nó mới hiện ra trên JTable được..... Giờ thì bắt đầu các bước load dữ liệu lên JTable

Phần 1: LấyData từ DB - Mỗi người mỗi khác D ở đây mình dùng Oracle DB
PHP:
private List getStudentsFromDB(){
        try {
            
OracleDataSource source = new OracleDataSource();
            
source.setURL("jdbc:oracle:thin:@localhost:1521/XE");
            
Connection con = source.getConnection("sa", "123456");
            
String sql = "SELECT StudentID, StudentName, Age, Address FROM Student";
            
PreparedStatement pst = con.prepareStatement(sql);
            
ResultSet rs = pst.executeQuery();
            List<
Student> list = new ArrayList>();
            while (
rs.next()) {
                
Student student = new Student(rs.getString("StudentID"), rs.getString("StudentName"), rs.getString("Age"), rs.getString("Address"));
                list.
add(student);
            }
            return list;
        } catch (
SQLException e) {
            
// TODO Auto-generated catch block
            
e.printStackTrace();
        }
        return 
null;
    }
Phần 2: Đưa Data lên JTable
+ Bước 1: Tạo mới một DefaultTableModel và khởi tạo nó trong Constructor

PHP:
private DefaultTableModel model;

public 
Demo() {
model = new DefaultTableModel();
}
+ Bước 2: Tạo mới một Vector dùng để chứa Column Header và add Vector đó vào model để lát nữa show header
PHP:
/* Tạo mới Vector chứa Column Header */
Vector column = new Vector();
column.add("Student ID");
column.add("Student Name");
column.add("Age");
column.add("Address");
/* Set Column Header lên DefaultTableModel */
model.setColumnIdentifiers(column);
Kết quả bước 2: Hình demo là thế. Chỉ khi nào xong bước 4 bạn mới thấy đc cái hình này
IMG

+ Bước 3: Lấy từng row Data từ CSDL và đưa từng thông tin vào Vector
PHP:
List list = getStudentsFromDB();
        for (
int i = 0; i < list.size(); i++) {
            
Student student = (Student)list.get(i);
            
Vector row = new Vector();
            
row.add(student.getStudentID());
            
row.add(student.getStudentName());
            
row.add(student.getAge());
            
row.add(student.getAddress());
            
model.addRow(row);
        }    
+ Bước 4 (Quan trọng): Set model cho Table - Không có bước này thì coi như từ đầu đến giờ làm hok có ý nghĩa gì
PHP:
tblStudent.setModel(model);
Kết quả cuối cùng:
IMG

Tóm tắt: Để Load đc data lên JTable chúng ta cần phải làm những việc sau
+ Tạo DefaultTableModel cho JTable
+ Tạo một Vector chứa thông tin Column Header
+ Tạo Vector để chứa thông tin từng Row trên JTable
+ Add Column và Row vào Model
+ Set Model cho JTable

VÀ ĐÂY LÀ FULL CODE
PHP:
package demo;

import java.awt.Dimension;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

import oracle.jdbc.pool.OracleDataSource;

public class 
Demo extends JFrame{
    private 
JTable tblStudent;
    private 
DefaultTableModel model;
    public 
Demo() {
        
// TODO Auto-generated constructor stub
        /* START - Nếu dùng Netbeans thì không cần quan tâm đến đoạn này làm gì */
        
tblStudent = new JTable();
        
tblStudent.setPreferredSize(new Dimension(500,500));
        
this.add(new JScrollPane(tblStudent));
        
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
this.pack();
        
this.setVisible(true);
      
/* END - Nếu dùng Netbeans thì không cần quan tâm đến đoạn này làm gì */

        
loadDataIntoJTable();  //đưa column name và data row lên JTable
    
}

    private 
void loadDataIntoJTable(){
        
model = new DefaultTableModel();
        
//Set Column Title
        
Vector column = new Vector();
        
column.add("Student ID");
        
column.add("Student Name");
        
column.add("Age");
        
column.add("Address");
        
model.setColumnIdentifiers(column);
        List<
Student> list = getStudentsFromDB();
        for (
int i = 0; i < list.size(); i++) {
            
Student student = (Student)list.get(i);
            
Vector row = new Vector();
            
row.add(student.getStudentID());
            
row.add(student.getStudentName());
            
row.add(student.getAge());
            
row.add(student.getAddress());
            
model.addRow(row);
        }

        
tblStudent.setModel(model);
    }

    private List<
Student> getStudentsFromDB(){
        try {
            
OracleDataSource source = new OracleDataSource();
            
source.setURL("jdbc:oracle:thin:@localhost:1521/XE");
            
Connection con = source.getConnection("sa", "123456");
            
String sql = "SELECT StudentID, StudentName, Age, Address FROM Student";
            
PreparedStatement pst = con.prepareStatement(sql);
            
ResultSet rs = pst.executeQuery();
            List<
Student> list = new ArrayList>();
            while (
rs.next()) {
                
Student student = new Student(rs.getString("StudentID"), rs.getString("StudentName"), rs.getString("Age"), rs.getString("Address"));
                list.
add(student);
            }
            return list;
        } catch (
SQLException e) {
            
// TODO Auto-generated catch block
            
e.printStackTrace();
        }
        return 
null;
    }

    public static 
void main(String[] args) {
        new 
Demo();
    }
}
2 Lượt thích

anh hướng dẫn chi tiết quá !!!
mà JTable hình như mặc định là nằm trong JScrollPane mà (em dùng NetBeans)
1 Lượt thích

Lâu rồi không xài netbeans mình cũng không để ý đến vấn đề đó. Dạo này đi làm toàn dùng ECLIPSE hihi. Mà để cái Column Header show trên JTable thì buộc phải nằm trong một cái JScrollPane nhé
0 Lượt thích

mà em nghĩ là JScrollPane chỉ hỗ trợ cuôn thôi, tại sao lại dính tới cái header nữa ???
2 Lượt thích

Cái này là Magic đó bạn. Mình cũng không biết lí giải vì sao. Bạn thử bỏ cái JTable ra khỏi JScrollPane đi sẽ thấy điều kì diệu hehe
1 Lượt thích

để em thử xem, đó giờ em chưa biết vụ này @@
1 Lượt thích

thank anh nhiều. anh hướng dẫn dễ hiểu thật
2 Lượt thích

Xin chào mọi người.Mình gặp lỗi như thế này mong mọi người giúp đỡ.Khi mình đổ dữ liệu từ trong bảng lên JTable.
bảng có 3 fields là name,address,age.Mình điền cho 3 dòng dữ liều vào(Nguyễn văn A,B,C 22.23,24, Phú thọ,....)
KHi load dữ liệu nó chỉ hiển thị dữ liệu row đầu tiên tức là Nguyên văn A 22,Phú thọ.Tất cả các row đằng sau đều giống hệt như vậy mà không hiển thị ra Nguyễn văn B.....
Đây là đoạn code lấy dữ liệu của mình
Code:
public List getInfoStudents() { List listStudents=new ArrayList(); try { String sql="Select * from student"; DBHelper db=new DBHelper(); ResultSet rs=db.excuteQuery(sql); while(rs.next()){ Students sd=new Students(); sd.name=rs.getString("name"); sd.address=rs.getString("address"); sd.age=rs.getInt("age"); listStudents.add(sd); System.out.print(listStudents.toString()); } } catch(SQLException e){ e.printStackTrace(); } return listStudents; }

2 Lượt thích

  1. public List getInfoStudents() {
        List<
    Students> listStudents=new ArrayList>();
        try {
        
    String sql="Select * from student";
            
    DBHelper db=new DBHelper();
            
    ResultSet rs=db.excuteQuery(sql);
            while(
    rs.next()){
                
    Students sd=new Students();
                
    sd.name=rs.getString("name");
                
    sd.address=rs.getString("address");
                
    sd.age=rs.getInt("age");
                
    listStudents.add(sd);
                
    // In từưng giá trị của sd ra.
                // In vầy là in cái List chứ đâu phải in từng dòng.
                
    System.out.print(listStudents.toString());
            }
        }
        catch(
    SQLException e){
            
    e.printStackTrace();
        }
          return 
    listStudents;
    }
    Mình làm theo code của bạn olala phía trên
2 Lượt thích

Mình làm theo code của bạn olala phía trên
Code:
List list = new ArrayList(); while (rs.next()) { Student student = new Student(rs.getString("StudentID"), rs.getString("StudentName"), rs.getString("Age"), rs.getString("Address")); list.add(student); } return list;
Mình nghĩ cái list đấy sẽ chứa 1 mảng các item trong bảng cở sở dữ liệu truyền vào rồi chứ.
2 Lượt thích

Add rs2xml.jar vào thư viện project và làm như sau
Code:
private TableModel getCustomer(Connection conn) { TableModel tb = null; ResultSet rs; try { CallableStatement calState = conn.prepareCall("select * from tblcustomer"); rs = calState.executeQuery(); tb = DbUtils.resultSetToTableModel(rs); } catch (Exception e) { e.printStackTrace(); } return tb; } jtable.setModel(getCustomer(connection));
connection: là đối tượng kết nối đến csdl
1 Lượt thích

try {
            
PreparedStatement pre = con.prepareStatement("SELECT  * FROM KHACHHANG where MAKH in (SELECT MAKH FROM HoaDonChiTiet WHERE MADOAN = ?)");
            
pre.setString(1, tftendk.getText());
            
ResultSet rs = pre.executeQuery();
            
ResultSetMetaData rsmetadata = rs.getMetaData();
            
int columns = rsmetadata.getColumnCount();
            
DefaultTableModel dtm = new DefaultTableModel();
            
Vector column_name = new Vector();
            for (
int i = 1; i <= columns; i++) {
                
column_name.add(rsmetadata.getColumnName(i));
            }
            
dtm.setColumnIdentifiers(column_name);
            while (
rs.next()) {
                
Vector data_rows = new Vector();
                for (
int j = 1; j <= columns; j++) {
                    
data_rows.add(rs.getString(j));
                    
String test = rs.getString(j);
                    
System.out.println(test);
                }
                
dtm.addRow(data_rows);
            }
            
tb1.setModel(dtm);
        } catch (
SQLException ex) {
        }
Mình vẫn ko hiểu chỗ rs.next cho lắm vì mỗi lần lấy ra nó lấy nào là Mã Khách hàng , Tên Khách hàng , ... để add vào vector nhưng khi sao add vector đó vào DefaultTableModel và in ra trên JTable nó vẫn ra dữ liệu chuẩn chỉnh đúng như trong CSDL ạ .
0 Lượt thích

Mọi Người cho mình hỏi sử dụng ArrayList và Vector thì cái nào tốt hơn , từ trước tới giờ mình toàn dùng ArrayList
PHP:
 public ArrayListselectChambre(){
      
ArrayList mylist = new ArrayList();
      
String req= "Select num_chambre,nom_chambre,A.num_type_chambre,nom_type_chambre,zone_chambre,active_chambre"
              
+ " from chambre A, type_chambre B where A.num_type_chambre = B.num_type_chambre and active_chambre = 0 order by 1";
      
System.out.println("Chambre "+req);
      
ResultSet resu = DaoConnexionMySQL.getInstance().selectQuery(req);
      try
      {
        while(
resu.next())
        {
          
mylist.add(new chambre(resu.getInt(1),resu.getString(2),resu.getInt(3),resu.getString(4),resu.getString(5),
                  
resu.getByte(6)));
        }
      }
      catch(
SQLException e )
      {
        
System.out.println(e.toString());
        
System.exit(-1);
      }
      return 
mylist;

0 Lượt thích

Từ khóa tìm kiếm

Câu trả lời mới nhất

Tin tuyển dụng