我想解析 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));
}
}
最好的方法是什么?
最佳答案
如果您关心哪个项目作为键插入以及哪个项目作为值插入,我认为在迭代 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 结果中的 value
之前获得 key
的验证,但您将代码位与 SQL 解耦,因为所有代码上面关心的是有一个 key
和一个 value
列(或者通过 SQL 中的确切列名,或者通过 SQL 中的 AS
别名) SQL 查询)。
如果要验证列的顺序、列名和数据类型,可以通过调用 s.getMetaData()
来使用 ResultSetMetaData
对象。然后,您可以调用 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)
关于java.sql : Validate ResultSet format,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49282502/