我有一个数据库函数,它检索数据然后填充jtable。我需要更改此函数,以便在Object[][]
内从数据库中返回数据。如何才能做到这一点? (我不确定如何在每行迭代中存储数据 - 下面代码中的while循环部分)。
public void data() {
// clear table then load information
DefaultTableModel model=(DefaultTableModel)table.getModel();
model.getDataVector().removeAllElements();
table.repaint();
ResultSet rs=null;
Statement st=null;
try {
Class.forName("java.sql.Driver");
_con = DriverManager.getConnection(_url,_user,_pwd);
st = _con.createStatement();
String query = "SELECT * FROM table";
rs = st.executeQuery(query);
while (rs.next()) {
String d1 = rs.getString("record1");
String d2 = rs.getString("record2");
model.addRow(new Object[]{d1,d2});
}
} catch (Exception e) {
} finally {
try {
if (rs != null) {
rs.close();
}
if (st != null) {
st.close();
}
if (_con != null) {
_con.close();
}
} catch (SQLException ex) {
}
}
}
答案 0 :(得分:3)
我认为这种方法不是一个好主意,原因如下:
Connection
并将其传入。ResultSet
和Statement
不应该是该类的成员变量。使它们成为方法的本地化。只需更改方法即可返回您想要的内容,而不是void
。我不会使用Object [][]
;我更喜欢地图列表或封装行的其他类型。使用列名作为Map中的键。
答案 1 :(得分:0)
这是OP要求的一些代码,是的,OP应该注意duffymo的推荐 - 我完全赞同他们。
Object[] result = null;
try{
Class.forName("java.sql.Driver");
_con = DriverManager.getConnection(_url,_user,_pwd);
st=_con.createStatement();
String query="SELECT COUNT(*) cnt FROM table";
rs=st.executeQuery(query);
Integer size = null;
if (rs.next()){
size = rs.getInteger("cnt");
}
if (size != null){
Object[] result = new Object[size];
query="SELECT * FROM table";
rs=st.executeQuery(query);
int i = 0;
while(rs.next())
{
String d1=rs.getString("record1");
String d2=rs.getString("record2");
result[i++] = new Object[]{d1,d2};
}
}
}
catch(Exception e)
{
//TODO handle exceptions, e.g. rethrow
//throw new RuntimeException(e);
}