如何将一种方法的executeQuery()结果集用于不同的方法

时间:2016-05-20 04:53:08

标签: java jdbc

我有一个名为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()时得到的结果循环;

我有三个功能需要相同的查询结果才能执行不同的操作。

2 个答案:

答案 0 :(得分:1)

您有两种选择:

  1. 通常,ResultSet为TYPE_FORWARD_ONLY。通过在TYPE_SCROLL_INSENSITIVE来电中指定该选项,将其更改为TYPE_SCROLL_SENSITIVE(或prepareStatement())。这样你就可以调用beforeFirst()将ResultSet重置为开头并再次迭代它。

  2. ResulSet中的所有行加载到内存中,例如作为List<MyRowClass>。然后,您可以根据需要多次迭代该列表,并将JDBC调用隔离到单个位置。优点:对列值进行类型化处理,例如处理基元(wasNull())的空值只需要在一个地方完成。

  3. 我建议选择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();
    }
}