2011-12-16 8 views
-1

可能性の重複:
SQL parser library for Java解析SQLのJavaの付いたファイルとgetステートメントとコメント

私はSQLファイルを解析するための準備ができてソリューションを使用したいと思います。ファイルには、コメント、SQL文、DDLを含めることができます。 コメント、すべてのSQL文を取得する必要があります。 誰もが解決策を知っていませんか?私はもう1つの四角い車輪を塗りたいとは思わない。

P.S. コメントを無視する必要はありません。ファイル内のコメントからテキストを取得する必要があります。

+3

既に尋ねられています。http://stackoverflow.com/questions/660609/sql-parser-library-for-java –

+0

http://stackoverflow.com/q/660609/108341 –

+0

http:// stackoverflow。 com/questions/660609/sql-parser-library-for-java –

答えて

1

iBatisのIMHOは手書きのDAOとDTOを作成することをお勧めしますJDBCは完全に時代遅れです。

私は自分の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を取得します。

+0

OK、このソリューションはコメントを無視しますが、それに合わせて修正することができます。 –

+0

私は自分の仕事を説明したいと思います。私は、異なるSQLスクリプトを持つ既存のファイルを持っています:DDL create table/viewsステートメント、選択、e.t.cこれらのファイルにマクロを追加したいと思います。 Macrosesはコメントの中にあります。だから、SQLファイルは有効なままで、私のツールはそれらを読み込み、コメントからマクロを抽出し、追加の操作を実行できます。このアイデアは、ファイルに格納されている既存のSQLコードを破棄し、より多くの機能を追加することではありません。ありがとうJaco私はJavaプロジェクトでSQL queiriesのために同じアプローチを使用します。 SQLコードをJavaコードにインライン展開するのは嫌です。それは醜いです。 :( – Sergey

関連する問題