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.