正则表达式解析数据库列,如JDBC ResultSet

时间:2014-08-29 14:57:10

标签: java sql regex jdbc

我正在使用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库并且必须使用正则表达式。

3 个答案:

答案 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; (您可能需要考虑大写和小写),然后如果存在,则拆分,并使用最右边的值。