
Apache Derby: uruchamianie skryptów SQL w JDBC
Jak pisałam wcześniej skrypty są wygodną formą przygotowywania bazy danych i uruchamiania poleceń SQL i poleceń narzędzia ij. Jednak w zmodularyzowanym JDK uruchamianie skryptów z poziomu JDBC jest kłopotliwe i nie zawsze działa. Jednym z rozwiązań jest przygotowanie własnej metody uruchamiającej skrypty.
Uruchamianie skryptów SQL z poziomu JDBC
Kolejne kroki to:
- Wczytanie skryptu SQL do stringu
- Tokenizacja stringu na polecenia wsadowe
- Wykonanie poleceń SQL
Wczytanie skryptu SQL do stringu
private static String scriptToString(String file) {
FileReader fr = null;
BufferedReader br = null;
StringBuilder sb = new StringBuilder();
String line = null;
try {
fr = new FileReader(file);
br = new BufferedReader(fr);
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
close(br);
close(fr);
}
return sb.toString();
}
Tokenizacja stringu na polecenia wsadowe
private static ArrayList<String> tokenize(String text) {
ArrayList<String> al = new ArrayList<>();
StringTokenizer st = new StringTokenizer(text, ";", false);
while (st.hasMoreTokens()) {
al.add(st.nextToken());
}
return al;
}
Wykonanie poleceń SQL
public static void jdbcRunScript(String file, Connection conn) {
String b = scriptToString(file);
ArrayList<String> al = tokenize(b);
Statement stat = null;
try {
stat = conn.createStatement();
for (String a : al) {
stat.addBatch(a);
}
stat.executeBatch();
} catch (SQLException e1) {
e1.printStackTrace();
}
DerbyUtil.close(stat);
}
Uwagi
W skrypcie mogą się znajdować jedynie polecenia SQL.
W skrypcie nie mogą się znajdować polecenia SELECT tworzące ResultSet, ponieważ w tym przypadku musiałoby być utworzone nowe polecenie Statement.
Oczywiście można tak udoskonalić podane metody, aby rozpoznawały typ polecenia i tworzyły nowe polecenie Statement dla każdego polecenia ResultSet. Nie przewidziałam jednak tutaj takiej możliwości, gdyż zaawansowane polecenia SQL i operacje na zbiorach wynikowych wymagają albo użycia poleceń ij albo poleceń JDBC.
Przykład
Przykład użycia znajduje się we wpisie 'typ_danych_real.html’ – już niedługo.
Pliki do ściągnięcia
Aktualny (tworzony narastająco) plik module-info.java
Aktualny (tworzony narastająco) plik DerbyUtil.java
Pliki tworzone narastająco zastępują poprzednie pliki o tej samej nazwie i działają dla wszystkich wcześniej opublikowanych przykładów we wszystkich wpisach w projekcie. W przypadku pliku module-info.java może być potrzebne skreślenie niepotrzebnych wpisów.
