我想将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));
}
}
最好的方法是什么?
答案 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分离,因为上面的所有代码都关注的是是key
和value
列(通过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)