JAVA中从Mysql取数据到JTable
Posted
技术标签:
【中文标题】JAVA中从Mysql取数据到JTable【英文标题】:Taking data from Mysql to JTable in JAVA 【发布时间】:2015-05-03 03:05:26 【问题描述】:我正在尝试在我的 Jtable 中获取信息并从 mysql 读取信息,看起来时代来自这个细分市场,因为我可以看到卡住了,我不知道该怎么做,现在我有一个 DefaultTableModel 定义JTable 将使用的方法,我将覆盖 getColumnClass, 我希望我的代码从类中获取列。
static DefaultTableModel TableModel = new DefaultTableModel(dataInfo, columns)
public Class getColumnClass(int column)
if ((column >= 0) && (column < getColumnCount()))
returnValue = getValueAt(0, column);
else
returnValue;
;
【问题讨论】:
“我希望我的代码从类中获取列” - 这不是一个非常糟糕的主意。如果列的行中的值为null
,会发生什么情况?最好提前知道该列负责什么类型的值。仔细查看JDBC Database Access了解更多详情
那我该怎么办?现在它不为空。我被卡住了:(
假设您正在从数据库中加载数据,您应该使用 ResultSet
对象中的 ResultSetMetaData
来获取列类型并将该信息存储在表模型中,这样您就可以根据数据库中的信息返回正确的(预期的)类型
madprogrammer 让我也在那里阅读更多内容。
【参考方案1】:
如果我清楚地理解您,您需要添加 .getclass 方法,该方法有助于将变量移到左侧,并且您还必须返回类的值,在这种情况下将按如下方式完成。取每列的第一个条目。希望能帮助到你。假设您的列没有空值。
static DefaultTableModel TableModel = new DefaultTableModel(dataInfo, columns)
public Class getColumnClass(int column)
Class returnValue;
// Verifying that the column exists (index > 0 && index < number of columns
if ((column >= 0) && (column < getColumnCount()))
returnValue = getValueAt(0, column).getClass();
//you need to add the .getclass method which
//gets the variable to the left.
else
// Returns the class for the item in the column
returnValue = Object.class;
return returnValue;
;
【讨论】:
当getValueAt(0, column)
是null
时会发生什么?坦率地说,这不仅愚蠢,而且非常危险。更好的解决方案是现在每列的类类型是什么,而不依赖于表中的数据(数据应遵循列的约定)。根据我对 OP 试图做什么的“假设”,他们应该从ResultSetMetaData
中提取这些信息
@syombua 让我试试这个,实际上我知道我的错误在哪里。等我几秒钟回来告诉你它是否有效。
现在我传递的参数没有空值了。嘿 syombua 这很好。我很感激。自变量现在起作用了。【参考方案2】:
我们需要稍微修改TableModel
,这样我们就可以控制Class
列的类型...
public class MyTableModel extends DefaultTableModel
private List<Class> columnTypes;
public MyTableModel()
public MyTableModel(int rowCount, int columnCount)
super(rowCount, columnCount);
public MyTableModel(Vector columnNames, int rowCount)
super(columnNames, rowCount);
public MyTableModel(Object[] columnNames, int rowCount)
super(columnNames, rowCount);
public MyTableModel(Vector data, Vector columnNames)
super(data, columnNames);
public MyTableModel(Object[][] data, Object[] columnNames)
super(data, columnNames);
public MyTableModel(List<Class> columnTypes)
this.columnTypes = columnTypes;
public MyTableModel(List<Class> columnTypes, Object[] columnNames, int rowCount)
super(columnNames, rowCount);
this.columnTypes = columnTypes;
public MyTableModel(List<Class> columnTypes, Object[][] data, Object[] columnNames)
super(data, columnNames);
this.columnTypes = columnTypes;
public MyTableModel(List<Class> columnTypes, Vector data, Vector columnNames)
super(data, columnNames);
this.columnTypes = columnTypes;
public MyTableModel(List<Class> columnTypes, Vector columnNames, int rowCount)
super(columnNames, rowCount);
this.columnTypes = columnTypes;
public MyTableModel(List<Class> columnTypes, int rowCount, int columnCount)
super(rowCount, columnCount);
this.columnTypes = columnTypes;
public void setColumnTypes(List<Class> columnTypes)
this.columnTypes = columnTypes;
@Override
public Class<?> getColumnClass(int columnIndex)
return columnTypes.get(columnIndex);
然后,我们从数据库中加载数据,您可以使用ResultSet
中的ResultSetMetaData
来确定该列代表的最合适的对象类型(基于ResultSet#getObject
的返回结果)
MyTableModel tableModel = new MyTableModel();
try (ResultSet rs = ...)
ResultSetMetaData rsmd = rs.getMetaData();
List<Class> columnTypes = new ArrayList<Class>(rsmd.getColumnCount());
for (int column = 0; column < rsmd.getColumnCount(); column++)
String className = rsmd.getColumnClassName(column + 1);
try
columnTypes.add(Class.forName(className));
catch (ClassNotFoundException ex)
ex.printStackTrace();
columnTypes.add(Object.class);
tableModel.setColumnTypes(columnTypes);
// Load data from the ResultSet
catch (SQLException exp)
exp.printStackTrace();
更多详情请见JDBC Database Access...
【讨论】:
非常复杂。我很快就会到那里。以上是关于JAVA中从Mysql取数据到JTable的主要内容,如果未能解决你的问题,请参考以下文章
java - 如何在Java中从MySQL结果集中的while循环中添加值?