Как выполнить файл сценария .sql с использованием JDBC

Возможный дубликат:
Запуск сценария .sql с использованием MySQL с JDBC

У меня есть файл сценария SQL, содержащий 40-50 операторов SQL. Можно ли запустить этот файл сценария с помощью JDBC?

Эта ссылка может помочь вам: http://pastebin.com/f10584951 .

Вставка для потомков:

/* * Slightly modified version of the com.ibatis.common.jdbc.ScriptRunner class * from the iBATIS Apache project. Only removed dependency on Resource class * and a constructor */ /* * Copyright 2004 Clinton Begin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.io.IOException; import java.io.LineNumberReader; import java.io.PrintWriter; import java.io.Reader; import java.sql.*; /** * Tool to run database scripts */ public class ScriptRunner { private static final String DEFAULT_DELIMITER = ";"; private Connection connection; private boolean stopOnError; private boolean autoCommit; private PrintWriter logWriter = new PrintWriter(System.out); private PrintWriter errorLogWriter = new PrintWriter(System.err); private String delimiter = DEFAULT_DELIMITER; private boolean fullLineDelimiter = false; /** * Default constructor */ public ScriptRunner(Connection connection, boolean autoCommit, boolean stopOnError) { this.connection = connection; this.autoCommit = autoCommit; this.stopOnError = stopOnError; } public void setDelimiter(String delimiter, boolean fullLineDelimiter) { this.delimiter = delimiter; this.fullLineDelimiter = fullLineDelimiter; } /** * Setter for logWriter property * * @param logWriter * - the new value of the logWriter property */ public void setLogWriter(PrintWriter logWriter) { this.logWriter = logWriter; } /** * Setter for errorLogWriter property * * @param errorLogWriter * - the new value of the errorLogWriter property */ public void setErrorLogWriter(PrintWriter errorLogWriter) { this.errorLogWriter = errorLogWriter; } /** * Runs an SQL script (read in using the Reader parameter) * * @param reader * - the source of the script */ public void runScript(Reader reader) throws IOException, SQLException { try { boolean originalAutoCommit = connection.getAutoCommit(); try { if (originalAutoCommit != this.autoCommit) { connection.setAutoCommit(this.autoCommit); } runScript(connection, reader); } finally { connection.setAutoCommit(originalAutoCommit); } } catch (IOException e) { throw e; } catch (SQLException e) { throw e; } catch (Exception e) { throw new RuntimeException("Error running script. Cause: " + e, e); } } /** * Runs an SQL script (read in using the Reader parameter) using the * connection passed in * * @param conn * - the connection to use for the script * @param reader * - the source of the script * @throws SQLException * if any SQL errors occur * @throws IOException * if there is an error reading from the Reader */ private void runScript(Connection conn, Reader reader) throws IOException, SQLException { StringBuffer command = null; try { LineNumberReader lineReader = new LineNumberReader(reader); String line = null; while ((line = lineReader.readLine()) != null) { if (command == null) { command = new StringBuffer(); } String trimmedLine = line.trim(); if (trimmedLine.startsWith("--")) { println(trimmedLine); } else if (trimmedLine.length() < 1 || trimmedLine.startsWith("//")) { // Do nothing } else if (trimmedLine.length() < 1 || trimmedLine.startsWith("--")) { // Do nothing } else if (!fullLineDelimiter && trimmedLine.endsWith(getDelimiter()) || fullLineDelimiter && trimmedLine.equals(getDelimiter())) { command.append(line.substring(0, line .lastIndexOf(getDelimiter()))); command.append(" "); Statement statement = conn.createStatement(); println(command); boolean hasResults = false; if (stopOnError) { hasResults = statement.execute(command.toString()); } else { try { statement.execute(command.toString()); } catch (SQLException e) { e.fillInStackTrace(); printlnError("Error executing: " + command); printlnError(e); } } if (autoCommit && !conn.getAutoCommit()) { conn.commit(); } ResultSet rs = statement.getResultSet(); if (hasResults && rs != null) { ResultSetMetaData md = rs.getMetaData(); int cols = md.getColumnCount(); for (int i = 0; i < cols; i++) { String name = md.getColumnLabel(i); print(name + "\t"); } println(""); while (rs.next()) { for (int i = 0; i < cols; i++) { String value = rs.getString(i); print(value + "\t"); } println(""); } } command = null; try { statement.close(); } catch (Exception e) { // Ignore to workaround a bug in Jakarta DBCP } Thread.yield(); } else { command.append(line); command.append(" "); } } if (!autoCommit) { conn.commit(); } } catch (SQLException e) { e.fillInStackTrace(); printlnError("Error executing: " + command); printlnError(e); throw e; } catch (IOException e) { e.fillInStackTrace(); printlnError("Error executing: " + command); printlnError(e); throw e; } finally { conn.rollback(); flush(); } } private String getDelimiter() { return delimiter; } private void print(Object o) { if (logWriter != null) { System.out.print(o); } } private void println(Object o) { if (logWriter != null) { logWriter.println(o); } } private void printlnError(Object o) { if (errorLogWriter != null) { errorLogWriter.println(o); } } private void flush() { if (logWriter != null) { logWriter.flush(); } if (errorLogWriter != null) { errorLogWriter.flush(); } } } 

Я использую этот бит кода для импорта SQL-операторов, созданных mysqldump:

 public static void importSQL(Connection conn, InputStream in) throws SQLException { Scanner s = new Scanner(in); s.useDelimiter("(;(\r)?\n)|(--\n)"); Statement st = null; try { st = conn.createStatement(); while (s.hasNext()) { String line = s.next(); if (line.startsWith("/*!") && line.endsWith("*/")) { int i = line.indexOf(' '); line = line.substring(i + 1, line.length() - " */".length()); } if (line.trim().length() > 0) { st.execute(line); } } } finally { if (st != null) st.close(); } } 

Другой вариант, это НЕ поддерживает комментарии, очень полезно с экспортом AmaterasERD DDL для Apache Derby:

 public void executeSqlScript(Connection conn, File inputFile) { // Delimiter String delimiter = ";"; // Create scanner Scanner scanner; try { scanner = new Scanner(inputFile).useDelimiter(delimiter); } catch (FileNotFoundException e1) { e1.printStackTrace(); return; } // Loop through the SQL file statements Statement currentStatement = null; while(scanner.hasNext()) { // Get statement String rawStatement = scanner.next() + delimiter; try { // Execute statement currentStatement = conn.createStatement(); currentStatement.execute(rawStatement); } catch (SQLException e) { e.printStackTrace(); } finally { // Release resources if (currentStatement != null) { try { currentStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } currentStatement = null; } } scanner.close(); } 

Просто прочитайте его, а затем используйте готовое состояние с полным sql-файлом в нем.

(Если я хорошо помню)

ДОБАВИТЬ: вы также можете читать и делиться на ";" и выполнить их все в цикле. Не забывайте комментарии и добавляйте снова ";"

Вы должны иметь возможность анализировать SQL-файл в операторы. И запустите одно заявление за раз. Если вы знаете, что ваш файл состоит из простых операторов insert / update / delete, вы можете использовать точку с запятой в качестве разделителя инструкций. В общем случае у вас есть задача создать конкретный парсер SQL-диалектов.

У меня была та же проблема, что и при попытке выполнить SQL-скрипт, который создает базу данных SQL. Googling здесь и там я нашел Java-class, первоначально написанный Clinton Begin, который поддерживает комментарии (см. http://pastebin.com/P14HsYAG ). Я немного изменил файл, чтобы обслуживать триггеры, где нужно изменить DELIMITER по умолчанию на что-то другое. Я использовал эту версию ScriptRunner (см. http://pastebin.com/sb4bMbVv ). Поскольку class (open source и free) SQLScriptRunner является абсолютно необходимой утилитой, было бы неплохо иметь еще несколько вкладок от разработчиков и, надеюсь, у нас скоро будет более стабильная версия.

Вы можете прочитать строку сценария в строке с помощью BufferedReader и добавить каждую строку в StringBuilder чтобы сценарий стал одной большой строкой.

Затем вы можете создать объект Statement с помощью JDBC и вызвать statement.execute(stringBuilder.toString()) .

  • Почему я получаю java.lang.AbstractMethodError при попытке загрузить blob в db?
  • Обработка MySQL datetime и временных меток в Java
  • Подключение Java к базе данных MySQL
  • ORA-12505, TNS: слушатель в настоящее время не знает о SID, заданном в дескрипторе соединения
  • Каково фактическое использование Class.forName ("oracle.jdbc.driver.OracleDriver") при подключении к базе данных?
  • Java: добавьте несколько строк в MySQL с помощью PreparedStatement
  • Обработка одновременного запроса при сохранении в базе данных oracleа?
  • Как вызвать хранимую процедуру oracle, которая включает пользовательский тип в java?
  • Как читать все строки из огромной таблицы?
  • JPA или JDBC, как они отличаются?
  • Как подключить SQLite с Java?
  • Interesting Posts

    Нужен ли мне отдельный раздел EFI для каждой ОС с общим диском?

    Как создать classы Java из файла WSDL

    Как выполнить итерацию свойств анонимного объекта в C #?

    Android – показывает неопределенный прогресс, без диалога

    Комбинированный график ggplot2 (Не в одном графике), используя функцию par () или layout ()?

    Какую кодировку я должен использовать для базовой проверки подлинности HTTP?

    Принудительная перестройка индекса / базы данных меню начального меню в Windows 10

    Как сделать Internet Explorer 8 для поддержки элемента nth child () CSS?

    Сравнение равенств между несколькими переменными

    Android: Как получить строку из ресурсов, используя ее имя?

    Как сделать аргумент cd аргументом INsensitive?

    Как выбрать первый элемент набора с JSTL?

    Строки – это объекты в Java, поэтому почему мы не используем «новое» для их создания?

    Получить параметр url jquery или Как получить значения строк запроса в js

    Как я могу вручную выгрузить вкладку?

    Давайте будем гением компьютера.