ResultSet对象在一次迭代后到达结尾

时间:2018-03-28 16:31:04

标签: java mysql jdbc

我正在尝试从数据库中读取表中的所有记录,并使用这些数据进行一些处理。以下是我使用的代码。

package differences;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;


public class ConformancePercentageChecking {

    private final String dbDriver = "com.mysql.jdbc.Driver";
    private Connection connection = null;
    private final String serverName = "localhost";
    private final String mydatabase = "google";
    private final String username = "root";//kh hoseinpur
    private final String password = "123";
    private final String extrainfo = "?useUnicode=true&characterEncoding=UTF-8";
    int numberOfInsertedIDs = 0;

    public void findConformances() {
        try {
            try {
                Class.forName(dbDriver);//a call to forname("X") causes the class named X to be initialized
                String url = "jdbc:mysql://" + serverName + "/" + mydatabase + extrainfo;
                if (connection == null) {
                    connection = (Connection) DriverManager.getConnection(url, username, password);
                }
            } catch (ClassNotFoundException | SQLException e) {
                JOptionPane.showMessageDialog(null, "database");
            }

            String query1, query2, query3, query4, query5, query6, testSuite, id;
            PreparedStatement statement1, statement2, statement3, statement4, statement5, statement6;
            query1 = "drop table PresConformance;";
            query2 = "drop table PostConformance;";
            statement1 = connection.prepareStatement(query1);
            statement2 = connection.prepareStatement(query2);
            statement1.executeUpdate();
            statement2.executeUpdate();
            query1 = "CREATE TABLE PresConformance(testSuite Text, conformance numeric(10), depthDifference numeric(10),pathLength numeric(10));";
            query2 = "CREATE TABLE PostConformance(testSuite Text, conformance numeric(10), depthDifference numeric(10),pathLength numeric(10));";
            query3 = "SELECT * FROM presDifference;";
            query4 = "SELECT * FROM presdifference;";
            query5 = "insert into PresConformance values(?,?,?,?);";
            query6 = "insert into PostConformance values(?,?,?,?);";
            statement1 = connection.prepareStatement(query1);
            statement2 = connection.prepareStatement(query2);
            statement3 = connection.prepareStatement(query3);
            statement4 = connection.prepareStatement(query4);
            statement5 = connection.prepareStatement(query5);
            statement6 = connection.prepareStatement(query6);
            Map<String, String> map = new HashMap<>();

            statement1.executeUpdate();
            statement2.executeUpdate();

            ResultSet r1, r2, r3, r4;
            r1 = statement3.executeQuery();
            System.out.println("***1");
            r2 = statement4.executeQuery();
            System.out.println("***2");

            int idCount = 0, depthDifference = 0, totalNumberOfExecutions = 0, testSuitesCounts = 0, difference = 0, pathLength = 0;
            float conformancePercentage = 0, sumOfconformancePercentage = 0;
            r3 = r1;
            r4 = r2;
            while (r1.next()) {
                testSuitesCounts = 0;
                sumOfconformancePercentage = 0;
                testSuite = r1.getString("testSuite");
                id = null;
                id = map.get(testSuite);
                if (id == null) {
                    idCount++;
                    map.put(Integer.toString(idCount), testSuite);
                    r3.absolute(r1.getRow());
                    r3.previous();
                    while (r3.next()) {
                        if (testSuite.equals(r3.getString("testSuite"))) {
                            System.out.println(testSuite + " equal");
                            totalNumberOfExecutions = r3.getInt("totalNumberOfExecutions");
                            difference = r3.getInt("difference");
                            conformancePercentage = (1 - ((float) difference / totalNumberOfExecutions)) * 100;
                            if (testSuitesCounts == 0) {
                                String[] testSuite1, testSuite2, testSuite3;
                                testSuite1 = testSuite.split("_");
                                testSuite2 = testSuite1[0].split("/");
                                testSuite3 = testSuite1[1].split("/");
                                depthDifference = Math.abs(testSuite2.length - 1) - testSuite3.length;
                                pathLength = (testSuite2.length - 1) + testSuite3.length;
                            }
                            testSuitesCounts++;
                            sumOfconformancePercentage += conformancePercentage;
                        }
                    }
                    statement5.setString(1, testSuite);
                    statement5.setFloat(2, (sumOfconformancePercentage / testSuitesCounts));
                    statement5.setInt(3, depthDifference);
                    statement5.setInt(4, pathLength);
                    statement5.executeUpdate();
                }
                System.out.println(r1.getRow());
            }

            System.out.println("Pres Finished*****************************************");
            idCount = 0;
            map = new HashMap<>();
            while (r2.next()) {
                testSuitesCounts = 0;
                sumOfconformancePercentage = 0;
                testSuite = r2.getString("testSuite");
                id = null;
                id = map.get(testSuite);
                if (id == null) {
                    idCount++;
                    map.put(Integer.toString(idCount), testSuite);
                    r4.absolute(r2.getRow());
                    r4.previous();
                    while (r4.next()) {
                        if (testSuite.equals(r4.getString("testSuite"))) {
                            System.out.println(testSuite + " equal");
                            totalNumberOfExecutions = r4.getInt("totalNumberOfExecutions");
                            difference = r4.getInt("difference");
                            conformancePercentage = (1 - ((float) difference / totalNumberOfExecutions)) * 100;
                            if (testSuitesCounts == 0) {
                                String[] testSuite1, testSuite2, testSuite3;
                                testSuite1 = testSuite.split("_");
                                testSuite2 = testSuite1[0].split("/");
                                testSuite3 = testSuite1[1].split("/");
                                depthDifference = Math.abs(testSuite2.length - 1) - testSuite3.length;
                                pathLength = (testSuite2.length - 1) + testSuite3.length;
                            }
                            testSuitesCounts++;
                            sumOfconformancePercentage += conformancePercentage;
                        }
                    }
                    statement6.setString(1, testSuite);
                    statement6.setFloat(2, (sumOfconformancePercentage / testSuitesCounts));
                    statement6.setInt(3, depthDifference);
                    statement6.setInt(4, pathLength);
                    statement6.executeUpdate();
                }
            }
            System.out.println("Post Finished*****************************************");

            System.out.println("Finished Inserting to DB");
        } catch (SQLException ex) {
            Logger.getLogger(DifferencesPresPost.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

问题是,对于包含表记录的ResultSet对象r1和r3,它只迭代一次,然后到达ResultSet对象的末尾。

我尝试在每个while循环之前计算两个ResultSet对象中的记录数,并且它正确地打印了recored的数量,但是当它进入这些while循环时,它仅适用于每个ResultSet对象的第一行。 任何人都可以帮我找出这个问题的结果吗?

1 个答案:

答案 0 :(得分:-1)

我相信默认情况下你的结果集是TYPE_FORWARD_ONLY。在准备预准备语句时,需要指定TYPE_SCROLL_INSENSITIVE。希望这可以帮助。