21

アプリケーション内のいくつかの大規模なクエリを properties\sql\xml ファイルに外部化したいと考えています。ただし、これをクリーンな方法で実現する方法について、誰かが推奨事項を持っているかどうか疑問に思っていました。ほとんどの結果は ORM フレームワークの使用を推奨していますが、これはデータの制約により適用できません。

Java - SQL ステートメントを外部ファイルに保存するが、それぞれが 20 行を超えるいくつかのクエリに対してこのプロパティ名 .1、.2 などを実行することは、それほどクリーンではないようです。

4

5 に答える 5

13

少し前に同じ問題に直面し、YAML を思いつきました。複数行の文字列プロパティ値をサポートしているため、クエリ ファイルに次のように記述できます。

selectSomething: >
  SELECT column1, column2 FROM SOMETHING

insertSomething: >
  INSERT INTO SOMETHING(column1, column2)
  VALUES(1, '1')

ここで、selectSomethinginsertSomethingはクエリ名です。そのため、非常に便利で、特殊文字がほとんど含まれていません。クエリは空白行で区切り、各クエリ テキストはインデントする必要があります。クエリには独自のインデントを絶対に含めることができるため、以下が完全に有効であることに注意してください。

anotherSelect: <
  SELECT column1 FROM SOMETHING
  WHERE column2 IN (
    SELECT * FROM SOMETHING_ELSE
  )

次に、以下のコードを使用して、SnakeYAML ライブラリの助けを借りて、ファイルの内容をハッシュマップに読み取ることができます。

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.FileUtils;
import java.io.FileReader;

import org.yaml.snakeyaml.Yaml;
import java.io.File;
import java.io.FileNotFoundException;

public class SQLReader {
  private Map<String, Map> sqlQueries = new HashMap<String, Map>();

  private SQLReader() {
    try {
      final File sqlYmlDir = new File("dir_with_yml_files");
      Collection<File> ymlFiles = FileUtils.listFiles(sqlYmlDir, new String[]{"yml"}, false);
      for (File f : ymlFiles) {
        final String fileName = FilenameUtils.getBaseName(f.getName());
        Map ymlQueries = (Map)new Yaml().load(new FileReader(f));
        sqlQueries.put(fileName, ymlQueries);
      }
    }
    catch (FileNotFoundException ex) {
      System.out.println("File not found!!!");
    }
  }
}

上記の例では、マップのマップが作成され、各 YAML ファイルがクエリ名/文字列を含むマップにマッピングされます。

于 2015-06-09T13:24:29.830 に答える
1

行末に \ を付けることにより、プロパティ ファイルで複数行のクエリを実行できます。例えば

queries.myquery = select \
foo, bar \
from mytable \
where baz > 10
于 2013-03-15T18:16:29.813 に答える