将 ResultSet 读入 JTable(通过不同的类)

Posted

技术标签:

【中文标题】将 ResultSet 读入 JTable(通过不同的类)【英文标题】:Reading ResultSet into JTable (over different classes) 【发布时间】:2015-12-02 09:58:07 【问题描述】:

因此,在我的程序中,我试图读取结果集中的数据,我曾经使用 PreparedStatement 从数据库中获取数据。我正在使用 MVC 模型和 DAO 模式,这让我有点迷失了如何在我的 View 类中将我的结果集从一个类(BTRDaoImpl)读取到我的 JTable。 到目前为止,我没有研究它,发现最好的解决方案是制作一个自定义表格类,但从那里我不知道如何进步。

我的自定义表格类:

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class ResultSetTable extends JTable
 /**
 * 
 */
private static final long serialVersionUID = 1L;

private final DefaultTableModel dataModel;

  public ResultSetTable(ResultSet rs)
                       throws SQLException

    super();
    dataModel = new DefaultTableModel();
    setModel(dataModel);

    try 
      //create an array of column names
      ResultSetMetaData mdata = rs.getMetaData();
      int colCount = mdata.getColumnCount();
      String[] colNames = new String[colCount];
      for (int i = 1; i <= colCount; i++) 
        colNames[i - 1] = mdata.getColumnName(i);
      
      dataModel.setColumnIdentifiers(colNames);

      //get data through loop
      while (rs.next()) 
        String[] rowData = new String[colCount];
        for (int i = 1; i <= colCount; i++) 
          rowData[i - 1] = rs.getString(i);
        
        dataModel.addRow(rowData);
      
    
    finally
      try 
        rs.close();
      
      catch (SQLException ignore) 
      
    
  

以及我的 View 类的相关部分:

import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.JTextField;

import dbconnect.dao.impl.BTRDaoImpl;

public class View extends JFrame
public View() 

    JTable table = new JTable(new ResultSetTable(BTRDaoImpl.resultset);

    this.setSize(600, 400);
    setResizable(false);

我的 BTRDaoImpl 类带有 sql 查询和结果集:

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import mvc.View;
import dao.BTRbDao;
import business.BTRBean;

public class BTRDaoImpl extends AbstractDao implements BTRDao 

private Connection dbConnection = null;
private PreparedStatement preparedStatement = null;

public void sqlquery() 
    try 

        String btrname = View.searchbbtrname.getText();
        String btrplz = View.searchbtrplz.getText();
        btrname = btrname.trim().toUpperCase();
        btrplz = btrplz.trim().toUpperCase();

        if (btrplz.isEmpty()) 
            String btrResult = "SELECT BBSTBBNR, BBSTNABE, BBSTPLZ FROM BP.TBBBST WHERE BBSTNABEG = ?";

            dbConnection = AbstractDao.getConnection();
            preparedStatement = dbConnection.prepareStatement(btrResult);
            preparedStatement.setString(1, btrname);


         else 
            String btrResult = "SELECT BBSTBBNR, BBSTNABE, BBSTPLZ FROM BP.TBBBST WHERE BBSTNABEG = ? AND BBSTPLZ = ?";

            dbConnection = AbstractDao.getConnection();
            preparedStatement = dbConnection.prepareStatement(btrResult);
            preparedStatement.setString(1, btrname);
            preparedStatement.setString(2, btrplz);

        
     catch (SQLException e1) 
        System.out.println("An error with the SQL query occured: ");
        e1.printStackTrace();
     


public Collection<BtrBean> getBTR() throws SQLException,
        IOException 
    sqlquery();
    final Collection<BtrBean> result = new ArrayList<BtrBean>();

    ResultSet resultset = null;
    try 
        resultset = preparedStatement.executeQuery();

        // while loop to get data
        while (resultset.next()) 
            BtrBean btr = new BtrBean();
            int btrid = resultset.getInt(1);
            String btrplz = resultset.getString(3);
            String btrname = resultset.getString(2);
            btr.setBetriebnr(btrid);
            btr.setBetriebplz(btrplz);
            btr.setBetriebname(btrname);
            result.add(btr);
        //  System.out.println("BTR-ID: " + btrid + " BTR PLZ: " + btrplz + " BTR: " + btrname);
        

     catch (SQLException e) 
        e.printStackTrace();
        System.out.println("An error processing the SQL occured: ");
        e.printStackTrace();
     catch (NullPointerException npe) 
        System.out.println("NullPointerException: ");
        npe.printStackTrace();
     finally 
        if (preparedStatement != null) preparedStatement.close();
        closeConnection(resultset);
    
    return result;



【问题讨论】:

【参考方案1】:

执行此操作的一般方法:

    设计一个 POJO 来保存您的数据。 从 PreparedStatement 创建 POJO 实例并在 POJO 中填充数据。 通过从AbstractTableDataModel 扩展来创建自定义TableModel 类。实现getValue(int, int) 方法以在模型中返回您的数据。 创建您的 GUI 并在构建时将模型传递给您的表。

任务完成。

【讨论】:

我不太确定该怎么做。 嗯,太糟糕了,我无法在我的工作场所下载它。它是否包含一个很好的解释/评论?我认为我不能仅仅从代码或一些“做这个做那个”中理解它。

以上是关于将 ResultSet 读入 JTable(通过不同的类)的主要内容,如果未能解决你的问题,请参考以下文章

java:把查询结果存储到resultSet对象中,在把该对象的数据放置在一个JTable对象中

Java中具有相同ResultSet的多个jTable

使用 JTable 显示 ResultSet

当 jTable 行上的数字很大时,如何不显示 E 的幂?

将信息从数据库传输到 JTable

JTable 缺少第一行