java - 将 ResultSet 读入 JTable(在不同的类上)

标签 java swing jdbc jtable resultset

因此,在我的程序中,我尝试读取结果集中的数据,我用它来通过PreparedStatement从数据库中获取数据。我正在使用 MVC 模型和 DAO 模式,这让我有点迷失了如何将我的结果集从一个类(BTRDaoImpl)读取到我的 View 类中的 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 来保存您的数据。
  2. 从PreparedStatement 中创建POJO 实例并在POJO 中填充数据。
  3. 通过扩展 AbstractTableDataModel 创建自定义 TableModel 类。实现 getValue(int, int) 方法以返回模型中的数据。
  4. 创建您的 GUI 并在构建时将模型传递到您的表。

任务完成。

关于java - 将 ResultSet 读入 JTable(在不同的类上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34039739/

相关文章:

java - 这里的<T>是什么意思?

java - JOptionPane 中的 JSpinner?

java - 你能在 CardLayout 上放置 SpringLayout "esque"约束吗?

Java MySQL 连接未关闭

java - 为什么 Booleanexecute(String SQL) 总是 true,即使我的输入不在我的数据库中

java - 为什么ListCellRenderer中需要removeAll()?

java - 如果使用 transient 对象值,Dto 类不会创建 mysql 数据库表

java - 明智地使用 bufferedReader

java - Java中的边框与间距?

java - JDBC,Java调用Sqlserver存储过程