我正在使用JDBC从查询结果中获取列。
例如:
String query = "SELECT foo, bar AS barAlias FROM table";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
//Show my "foo" column results
while (resultSet.next()) {
log.debug(resultSet.getString("foo"));
}
我想在运行它们之前解析我的查询。本质上,我想为列标签创建一个数组,该数组将匹配resultSet.get **方法所期望的值。为了便于说明,我想用此替换上面的循环并获得相同的结果:
//Show my "foo" column results
while (resultSet.next()) {
log.debug(resultSet.getString(arrayOfColumns.get(0)));
}
这似乎很容易。我可以使用一个简单的正则表来解析我的语句,该正则表达式使用SELECT和FROM之间的字符串,使用列分隔符创建组,以及从组中构建arrayOfColumns。但是JDBC有特定的方法来处理别名。对于第二列,这个天真的解析器将返回整个" bar AS barAlias"我认为resultSet.get **需要" barAlias"。它会告诉我"列名栏as barAlias无效。"
基本上,我想了解JBDC列标签解析行为以便复制它。
注意,我知道我可以从resultSet对象获取索引列。这不是目标。另外,我不想使用任何与JDBC相关的方法(我知道preparedStatement元数据是可用的)。将此视为一个理论问题,其中没有JDBC库并且必须使用正则表达式。
答案 0 :(得分:3)
获取结果集列的最佳方法是让JDBC为您执行此操作。
ResultSet对象 -ResultSetMetaData
就足够了。
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSetMetaData metaData = preparedStatement.getMetaData();
for (int i = 1 ; i <= metaData.getColumnCount() ; i++) {
listOfColumns.add(metaData.getColumnLabel(i));
}
答案 1 :(得分:1)
要获取与您的ResultSet
相关联的列名,请咨询其ResultSetMetaData
。与解析查询文本相比,这将更容易,更可靠。
答案 2 :(得分:0)
因此,在分隔符(逗号)上拆分以获取SELECT和FROM之间的列名后,检查每一个以查看它是否包含字符串&#34; AS&#34; (您可能需要考虑大写和小写),然后如果存在,则拆分,并使用最右边的值。