使用Java解析SQL文件并获取语句和注释

时间:2011-12-16 07:52:23

标签: java sql parsing comments

  

可能重复:
  SQL parser library for Java

我想使用现成的解决方案来解析SQL文件。文件可以包含注释,SQL语句,DDL。 我需要获得评论,所有SQL语句。 没有人知道现成的解决方案吗?我不想再试一个方形轮..

P.S。 请注意我不需要忽略评论,我需要从文件中的评论中获取文本

1 个答案:

答案 0 :(得分:1)

对于它的价值,我建议您查看iBatis,IMHO使用JDBC完全废弃手写DAO和DTO。

在iBatis之前,我使用将SQL保存在单独的SQL文件中,并在需要时检索正确的SQL。我不再使用它了......因为在实际的Java代码中,这只比SQL好一些。

SQL文件的语法如下:

-- I added comments like this...
[id] {
  any SQL statement... (quite frankly any text).
} 

[id2] {
  ...
}

...

然后,以下是一个简单的Parser类:

public class SQLParser {
    private static Logger logger = LoggerUtility.getLogger(SQLParser.class);

    private String raw;
    private Map<String, String> sql;

    public SQLParser(InputStream is) {
        sql = new HashMap<String, String>();
        try {
            read(is);
            parse();
        } catch (IOException e) {
            logger.debug(LoggerCodes.TRACE, "Input Stream could not be successfull read!");
        }
    }

    private void read(InputStream is) throws IOException {
        StringBuilder builder = new StringBuilder();
        BufferedReader in = new BufferedReader(new InputStreamReader(is));
        String line = in.readLine();
        while (line != null) {
            builder.append(line + "\n");
            line = in.readLine();
        }
        raw = builder.toString();
    }

    public String getSql(String sqlId) {
        return sql.get(sqlId);
    }

    public PreparedStatement getSql(Connection connection, String sqlId) throws SQLException {
        String statement = sql.get(sqlId);
        return connection.prepareStatement(statement);
    }

    private void parse() {
        if (raw == null) {
            logger.debug(LoggerCodes.TRACE, "No String to parse for SQL statements!");
            return;
        }

        String regex = "\\.*\\[(\\S*)\\]\\s*\\{\\s*([^\\}]*)\\s*\\}";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(raw);
        while (m.find()) {
            String key = m.group(1);
            String body = m.group(2);
            logger.debug("Adding " + key + " to SQL map.");
            sql.put(key, body.trim());
        }
    }
}

然后只需创建上面的新实例并调用sqlParser.getSql(id)即可获得正确的SQL。