java.sql:验证ResultSet格式

时间:2018-03-14 16:03:18

标签: java validation jdbc

我想将java.sql.ResultSet解析为Map<String, String>,我想验证三件事:

  • 第一列应命名为key,且类型应为String
  • 第二列应命名为value,且类型应为String
  • 没有第三栏

以下是我班上HiveStatementOutputContent到目前为止的内容:

protected Map<String, String> keyValueOutput;

public HiveStatementOutputContent(ResultSet s) throws Exception {

    if(s.findColumn("key") != 0 )
        throw new Exception("Error in SQL result: First column has to be 'key'.");
    if(s.findColumn("value") != 1)
        throw new Exception("Error in SQL result: Second column has to be 'value'.");

    //TODO: Validate type

    //TODO: Validate number of columns

    while ( s.next() )
    {
        keyValueOutput.put(s.getString(0),s.getString(1));
    }
}

最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

如果您关心哪个项目作为键插入,哪个项目作为值插入,我认为在迭代ResultSet并获取字符串时使用列别名要简单得多。

while ( s.next() )
{
    keyValueOutput.put(s.getString("key"),s.getString("value"));
}

https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#getString(java.lang.String)

您没有在SQL结果中key之前验证value,但是您将您的代码位与SQL分离,因为上面的所有代码都关注的是是keyvalue列(通过SQL中的确切列名,或SQL查询中的AS别名)。

如果要验证列的顺序,名称和数据类型,可以通过调用ResultSetMetaData来使用s.getMetaData()对象。然后,您可以调用metadata.getColumnName(int)metadata.getColumnType(int)来验证列的名称和数据类型。您还可以利用getColumnCount来验证您没有提取任何额外的列。 看到: https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSetMetaData.html#getColumnName(int) https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSetMetaData.html#getColumnType(int)