title: Display ResultSet of a SQL query in a JTable (Java)
body: <p>I'm working on a program with which I can search through a database and display the results.</p>
  
  <p>I'm stuck at the displaying part at the moment. My SQL query already works and returns the results. I'm using a PreparedStatement to fill my ResultSet. However I don't know how I can return the data of the ResultSet to a JTable which I want to use to display the data. Can anyone explain to me in detail how to do this or if there is a better way instead of a JTable I'm not seeing?</p>
  
  <p>I'm using the MVC model and the DAO pattern, but I'm still pretty new to programming.
  So far from researching it I found the best solution to be to make a custom table class, but from there on I don't know how to progress.</p>
  
  <p>My custom table class:</p>
  
  <pre><code>import java.sql.ResultSet;
  import java.sql.ResultSetMetaData;
  
  import java.util.Vector;
  
  import javax.swing.table.DefaultTableModel;
  import javax.swing.table.TableModel;
  
  
  public class ResultSetTable {
   public static TableModel resultSetToTableModel(ResultSet rs) {
      try {
          ResultSetMetaData metaData = rs.getMetaData();
          int numberOfColumns = metaData.getColumnCount();
          Vector columnNames = new Vector();
  
          //Spaltennamen
          for (int column = 0; column &lt; numberOfColumns; column++) {
              columnNames.addElement(metaData.getColumnLabel(column + 1));
          }
  
          //Alle Zeilen
          Vector rows = new Vector();
  
          while (rs.next()) {
              Vector newRow = new Vector();
  
              for (int i = 1; i &lt;= numberOfColumns; i++) {
                  newRow.addElement(rs.getObject(i));
              }
  
              rows.addElement(newRow);
          }
  
          return new DefaultTableModel(rows, columnNames);
      } catch (Exception e) {
          e.printStackTrace();
  
          return null;
      }
  }
  }
  </code></pre>
  
  <p>And the relevant part of my View class:</p>
  
  <pre><code>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);
  }
  </code></pre>
  
  <p>My BTRDaoImpl class with the sql query and resultset:</p>
  
  <pre><code>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&lt;BtrBean&gt; getBTR() throws SQLException,
          IOException {
      sqlquery();
      final Collection&lt;BtrBean&gt; result = new ArrayList&lt;BtrBean&gt;();
  
      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;
  }
  
  }
  </code></pre>
  
  <p>My BTRBean class:</p>
  
  <pre><code>public class BetriebBean {
  
  private String betriebname;
  private int betriebnr;
  private String betriebplz;
  
  public BetriebBean() {
  
  }
  
  public BetriebBean(String betriebname, int betriebnr, String betriebplz) {
      super();
      this.betriebname = betriebname;
      this.betriebnr = betriebnr;
      this.betriebplz = betriebplz;
  }
  public String getBetriebname() {
      return betriebname;
  }
  public void setBetriebname(String betriebname) {
      this.betriebname = betriebname;
  }
  public int getBetriebnr() {
      return betriebnr;
  }
  public void setBetriebnr(int betriebnr) {
      this.betriebnr = betriebnr;
  }
  public String getBetriebplz() {
      return betriebplz;
  }
  public void setBetriebplz(String betriebplz) {
      this.betriebplz = betriebplz;
  }
  
  }
  </code></pre>
  
  <p>//edit:</p>
  
  <p>My whole View.class:</p>
  
  <pre><code>import java.awt.FlowLayout;
  import javax.swing.JButton;
  import javax.swing.JFrame;
  import javax.swing.JLabel;
  import javax.swing.JTable;
  import javax.swing.JTextField;
  
  public class View extends JFrame{
  
  private static final long serialVersionUID = 1L;
  
  public static final String SEARCH = "SEARCH";
  
  private JLabel searchbtrlabel = new JLabel("BTR name:");
  public static JTextField searchbtrname = new JTextField(10);
  private JLabel searchbtrlabel = new JLabel("PLZ:");
  public static JTextField searchbtrplz = new JTextField(10);
  private JButton searchbutton = new JButton();
  
  public View() {
      this.setTitle("BTR search TBBBST");
  
      this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  
      this.setLayout(new FlowLayout());
  
      this.add(searchbtrlabel);
      this.add(searchbtrname);
      this.add(searchbtrplzlabel);
      this.add(searchbtrplz);
  
      searchbutton.setText("Search");
      searchbutton.setActionCommand(View.SEARCH);
      this.add(searchbutton);
  
      JTable table = new JTable();
      this.add(table);
  
      this.setSize(600, 400);
      setResizable(false);
      //this.pack();
  }
  
  public JTextField getSearchbtrname() {
      return searchbetriebname;
  }
  
  public JTextField getSearchbbtrplz() {
      return searchbetriebplz;
  }
  
  public JButton getSearchbutton() {
      return searchbutton;
  }
  }
  </code></pre>
  
  <p>My Controller class:</p>
  
  <pre><code>import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.util.Observable;
  import java.util.Observer;
  
  import mvc.Model;
  import dbconnect.dao.impl.BTRDaoImpl;
  
  public class Controller implements Observer, ActionListener{
  
  private Model model;
  @SuppressWarnings("unused")
  private View view;
  
  public Controller(Model model, View view) {
      this.model = model;
      this.view = view;
  
      model.addObserver(this);
      view.getSearchbutton().addActionListener(this);
      view.setVisible(true);
  }
  
  @Override
  public void actionPerformed(ActionEvent e) {
      switch (e.getActionCommand()) {
      case View.SEARCH:
          model.search();
          view.table.setModel(ResultSetToTable.buildTableModel(BTRDaoImpl.resultset));
          break;
  
      default:
          System.out.println("Error : " + e.getActionCommand());
          break;
      }
  
  }
  
  @Override
  public void update(Observable o, Object arg) {
      // TODO Auto-generated method stub
  
  }
  
  }
  </code></pre>