循环遍历结果集,具体取决于生成的列

时间:2013-02-27 19:48:29

标签: java sql database resultset

我正在开发一个多线程项目,我需要在columns中随机查找我将使用的SELECT sql,然后我将执行SELECT sql查询。

找到这些列后 -

  1. 我需要查看id是否在有效范围之间,如果它在有效范围之间,然后使用columnsList中的那些列循环结果集并获取数据并存储在变量中。
  2. 如果id不在有效范围内,我需要检查我没有从结果集中获取任何数据。但不知何故,如果我恢复数据并且标志为真,则停止程序,然后退出程序。否则,如果我收回数据但是标志为假以停止程序,则计算发生的数量。
  3. 以下是我的代码 -

    private volatile int count;
    
    @Override
    public void run() {
    
    .....
    
    final String columnsList = getColumns(table.getColumns());
    ....
    rs = preparedStatement.executeQuery();
    ....
    if (Read.endValidRange < id && id < Read.startValidRange) {
    
        while (rs.next()) {
            for(String column: columnsList.split(",")) {
                System.out.println(column + ": " + rs.getString(column));
            }
        }
    } else {
        if(rs.next() && Read.flagTerminate) {
            System.exit(1);
        } else {
            count++;
        }
    }
    
    ....
    
    }
    
    /**
     * A simple method to get the column names in the order in which it was
     * inserted
     * 
     * @param columns
     * @return
     */
    private String getColumns(final List<String> columns) {
        List<String> copy = new ArrayList<String>(columns);
        Collections.shuffle(copy);
    
        int rNumber = random.nextInt(columns.size());
    
        List<String> subList = copy.subList(0, rNumber);
        Collections.sort(subList, new Comparator<String>() {
    
            @Override
            public int compare(String o1, String o2) {
                return columns.indexOf(o1) < columns.indexOf(o2) ? -1 : 1;
            }
        });
        return StringUtils.join(subList, ",");
    }
    

    问题陈述 -

    我无法理解我应该如何迭代结果集,因为每次我在SELECT sql中都有不同的列,具体取决于生成的内容。除此之外,如何在if else循环中使其更清晰。

2 个答案:

答案 0 :(得分:1)

行.. 您可以将随机生成的列保存在String数组中。然后在通过resultset迭代时使用该数组...如下所示: 的更新
您不应该在select语句中包含这些列。相反,您应该使用*选择select语句中的所有列...然后在rs.next()循环中获取该列的值...

rs = con.executeQuery("Select * from tablename");
while(rs.next())
{
   for (String col : columnsList )
   {
     System.out.print(rs.get(col));
   }
   System.out.print("\n");
}

<强> UPDATE1
您需要在run()中编写的关键代码部分包含在synchronized块中,以避免Race Condition,如下所示:

private volatile int count;

@Override
public void run() {

.....
while (!Read.flagTerminate)
{
    synchronized(this)
    {
        if (!Read.flagTerminate)
        {
            String columnsList = getColumns(table.getColumns());
            ....
            rs = preparedStatement.executeQuery();
            ....
            if (Read.endValidRange < id && id < Read.startValidRange) 
            {
                while (rs.next()) 
                {
                    for(String column: columnsList.split(",")) 
                    {
                        System.out.println(column + ": " + rs.getString(column));
                    }
                }
            } 
            else 
            {
                while (rs.next())
                {
                    count++;
                }
            }
        }

    }
}
System.exit(0);//it implies that flag = true;

....

}

/**
 * A simple method to get the column names in the order in which it was
 * inserted
 * 
 * @param columns
 * @return
 */
private String getColumns(final List<String> columns) {
    List<String> copy = new ArrayList<String>(columns);
    Collections.shuffle(copy);

    int rNumber = random.nextInt(columns.size());

    List<String> subList = copy.subList(0, rNumber);
    Collections.sort(subList, new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            return columns.indexOf(o1) < columns.indexOf(o2) ? -1 : 1;
        }
    });
    return StringUtils.join(subList, ",");
}

答案 1 :(得分:0)

这个怎么样:

if (Read.endValidRange < id && id < Read.startValidRange) {
    while (rs.next()) {
        for (String column : columnsList.split(",")) {
            System.out.println(column + ": " + rs.getString(column));
        }
    }
} else if (rs.next()) {
    if (Read.flagTerminate) {
        System.exit(1);
    } else {
        count++;
    }
}

根据我对问题的理解,我还更新了if-else条件。