我想使用现成的解决方案来解析SQL文件。文件可以包含注释,SQL语句,DDL。 我需要获得评论,所有SQL语句。 没有人知道现成的解决方案吗?我不想再试一个方形轮..
P.S。 请注意我不需要忽略评论,我需要从文件中的评论中获取文本
答案 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。