После поиска решения я пришел к выводу, что мой первый подход будет наилучшим для этого конкретного случая. По сути, я реализовал фабричный класс, который создает класс синтаксического анализатора для используемой базы данных.
Этот синтаксический анализатор читает каждую строку из сценария SQL и загружает ее в буфер, оценивая, является ли она комментарием или правильной строкой, добавляет ее в список, очищает пустые строки и, наконец, строит каждую команду между двумя операторами GO
добавив строки и передав их в другой список, который будет возвращен в конце.
package parsing;
import java.io.*
import java.util.*
public class ScriptParser implements Parser {
private static ArrayList<String> listOfQueries = null;
@Override
public ArrayList<String> createQueries(String path) {
String queryLine = new String();
StringBuilder sBuffer = new StringBuilder();
listOfQueries = new ArrayList<>();
List<String> dirtyQueries = new ArrayList<>();
try {
FileReader fr = new FileReader(new File(path));
BufferedReader br = new BufferedReader(fr);
while ((queryLine = br.readLine()) != null) {
if (queryLine.contains("--") || queryLine.contains("/*")) {
queryLine = "";
dirtyQueries.add(queryLine);
} else {
dirtyQueries.add(queryLine + " ");
}
}
br.close();
for (Iterator<String> iter = dirtyQueries.listIterator(); iter.hasNext();) {
//TODO
String str = iter.next();
if (str.isEmpty() || str.trim().isEmpty()) {
iter.remove();
} else {
//DO NOTHING
}
}
StringBuilder queryStatement = new StringBuilder();
for (int i = 0; i < dirtyQueries.size(); i++) {
//TODO
if (!dirtyQueries.get(i).contains("GO") || !dirtyQueries.get(i).contains("GO ")) {
queryStatement.append(dirtyQueries.get(i)).append(" ");
} else {
listOfQueries.add(queryStatement.toString());
queryStatement = new StringBuilder();
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println(sBuffer.toString());
}
return listOfQueries;
}
}
Затем каждая запись в списке зацикливается и передается в Statement
и выполняется индивидуально.