目前我遇到了以下问题:
我从H2数据库加载TableModel数据,如下所示:
public static DefaultTableModel loadTableModel(ResultSet rs)
throws SQLException {
// names of columns
Vector<String> columnNames = new Vector<String>();
int columnCount = Definitions.COLUMN_NAMES.length;
for (String string : Definitions.COLUMN_NAMES) {
columnNames.add(string);
}
// data of table
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
while (rs.next()) {
Vector<Object> vector = new Vector<Object>();
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
if (rs.getObject(columnIndex).getClass() == Integer.class) {
if ((int) rs.getObject(columnIndex) == 0) {
vector.add(null);
} else {
vector.add(rs.getObject(columnIndex));
}
} else {
vector.add(rs.getObject(columnIndex));
}
}
data.add(vector);
}
return new DefaultTableModel(data, columnNames);
}
通过这样做,我将data
从我的数据库和columnNames
传递给DefaulTableModel
的构造函数。问题是,并非所有列都包含相同的数据类型(看似默认类型似乎是String),因此我需要在创建DefaultTableModel
时直接为所有列设置数据类型。怎么会这样?我以后没有找到更改列类的方法。
如果我创建自己的&#34; TableModelClass
&#34;扩展DefaultTableModel
,我如何创建一个类似于这样的构造函数:
TableModelClass(data, columnNames, columnType)
columnType应该是包含类类型的向量
String.class
,Boolean.class
等。
答案 0 :(得分:0)
ResultSetMetaData md = rs.getMetaData();
可能是您预期的信息。打开时只调用一次,当查询结果中的零行时元数据也可以。
BTW我通常
Map< String,OBject >
,但矢量很好。copy&amp;从我的真实代码中粘贴,此示例来自web(Wicket),但数据建模是相同的。
protected Map<String, Object> move_fields() {
Map<String, Object> rec = new HashMap<String, Object>();
// MathContext mc = new MathContext(2);
for (int i = 0; i < columns; i++) {
String key;
try {
key = md.getColumnName(i + 1).toLowerCase();
int type = md.getColumnType(i + 1);
Object o;
switch (type) {
case java.sql.Types.DOUBLE:
case java.sql.Types.DECIMAL:
case java.sql.Types.FLOAT:
case java.sql.Types.NUMERIC:
BigDecimal bd = rs.getBigDecimal(i + 1);
if (bd != null) {
// bd = bd.round(mc);
bd = bd.setScale(2, RoundingMode.HALF_EVEN);
}
o = bd;
break;
default:
o = rs.getObject(i + 1);
break;
}
rec.put(key, o);
} catch (SQLException e) {
e.printStackTrace();
}
}
for (Entry<String, DynamicField> v : virtuals.entrySet()) {
v.getValue().prepare(rs, record, _my_has_next);
Object o = v.getValue().getValue(rs, record, _my_has_next);
rec.put(v.getValue().getNameInTemplate(), o);
}
for (Entry<String, String> f: rest.entrySet()) {
String kolumna = f.getKey();
String prawo = f.getValue();
if(prawa.contains(prawo)){
int c=1;
}
else{
record.put(kolumna, "");
}
}
return rec;
}