将 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(通过不同的类)的主要内容,如果未能解决你的问题,请参考以下文章