少し前に同じ問題に直面し、YAML を思いつきました。複数行の文字列プロパティ値をサポートしているため、クエリ ファイルに次のように記述できます。
selectSomething: >
SELECT column1, column2 FROM SOMETHING
insertSomething: >
INSERT INTO SOMETHING(column1, column2)
VALUES(1, '1')
ここで、selectSomething
とinsertSomething
はクエリ名です。そのため、非常に便利で、特殊文字がほとんど含まれていません。クエリは空白行で区切り、各クエリ テキストはインデントする必要があります。クエリには独自のインデントを絶対に含めることができるため、以下が完全に有効であることに注意してください。
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 ファイルがクエリ名/文字列を含むマップにマッピングされます。