我有一个名为ExecuteQuery的方法,负责执行查询。 它被定义为:
public int ExecuteQuery(String itemCode) {
ps = jdbcConnection.prepareStatement(SomeQuery);
rs = ps.executeQuery();
}
我有三种不同的方法,我想使用相同的结果集。很明显,我不想执行相同的查询三次,因为它会妨碍我的时间复杂性。
private Map<String, ItemRelation> loadItemRelations(String itemCode) throws PosfException {
Map<String, ItemRelation> relations = new LinkedHashMap<String, ItemRelation>();
try {
**while (rs.next()) {**
如何在此函数中使用 rs ,以便它在执行rs = ps.executeQuery()时得到的结果循环;
我有三个功能需要相同的查询结果才能执行不同的操作。
答案 0 :(得分:1)
您有两种选择:
通常,ResultSet为TYPE_FORWARD_ONLY
。通过在TYPE_SCROLL_INSENSITIVE
来电中指定该选项,将其更改为TYPE_SCROLL_SENSITIVE
(或prepareStatement()
)。这样你就可以调用beforeFirst()
将ResultSet重置为开头并再次迭代它。
将ResulSet
中的所有行加载到内存中,例如作为List<MyRowClass>
。然后,您可以根据需要多次迭代该列表,并将JDBC调用隔离到单个位置。优点:对列值进行类型化处理,例如处理基元(wasNull()
)的空值只需要在一个地方完成。
我建议选择2。
答案 1 :(得分:0)
这是我的解决方案。 首先,您需要将结果保存到其他类型(如TableModel),然后将数据保存在TableModel中。就像C#中的Datatable一样。 这是我的课。希望能帮到你
package saoviet.amisystem.model.datacollection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
public class DataTable {
public TableModel dataTable;
public TableModel getDataTable() {
return dataTable;
}
private Vector<String> columnNames;
private Vector<Vector<Object>> rows = new Vector<Vector<Object>>();
private TableModel resultSetToTableModel(ResultSet rs) {
try {
ResultSetMetaData metaData = rs.getMetaData();
int numberOfColumns = metaData.getColumnCount();
// Get the column names
for (int column = 0; column < numberOfColumns; column++) {
this.columnNames.addElement(metaData.getColumnLabel(column + 1));
}
// Get all rows.
while (rs.next()) {
Vector<Object> newRow = new Vector<Object>();
for (int i = 1; i <= numberOfColumns; i++) {
newRow.addElement(rs.getObject(i));
}
this.rows.addElement(newRow);
}
return new DefaultTableModel(rows, this.columnNames);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public DataTable() {
}
public DataTable(ResultSet result) throws SQLException {
this.columnNames = new Vector<String>();
this.dataTable = this.resultSetToTableModel(result);
}
public String getValue(int rowIndex, int columnIndex) {
return this.dataTable.getValueAt(rowIndex, columnIndex).toString();
}
public String getValue(int rowIndex, String columnName) {
return this.getValue(rowIndex, this.columnNames.indexOf(columnName));
}
public void addRow(Object[] obj) {
Vector<Object> newRow = new Vector<Object>();
String columIndex = "";
if (this.columnNames == null) {
this.columnNames = new Vector<String>();
for (int i = 0; i < obj.length; i++) {
columIndex = "" + i;
this.columnNames.addElement(columIndex);
}
}
for (int i = 0; i < obj.length; i++) {
newRow.addElement(obj[i]);
}
this.rows.addElement(newRow);
this.dataTable = new DefaultTableModel(rows, this.columnNames);
}
public int rowCount() {
return this.rows.size();
}
}