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 tokenize(String text) {
        ArrayList 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 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.
Wszystkie pokazane metody znajdują się w klasie DerbyUtil.

Przykład

Przykład użycia znajduje się tutaj.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *