Запуск .sql script с использованием MySQL с JDBC

Я начинаю использовать MySQL с JDBC.

Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///x", "x", "x");
stmt = conn.createStatement();
stmt.execute( "CREATE TABLE amigos" +
            "("+
            "id          int AUTO_INCREMENT          not null,"+
            "nombre      char(20)                    not null,"+
            "primary key(id)" +
            ")");

У меня есть 3-4 таблицы для создания, и это не выглядит хорошо.

Есть ли способ запустить .sql script из MySQL JDBC?

Ответ 1

Ok. Вы можете использовать этот класс здесь (размещен на pastebin из-за длины файла) в вашем проекте. Но не забудьте сохранить информацию о лицензии apache.

JDBC ScriptRunner

Это ripoff из iBatis ScriptRunner с удаленными зависимостями.

Вы можете использовать его так:

Connection con = ....
ScriptRunner runner = new ScriptRunner(con, [booleanAutoCommit], [booleanStopOnerror]);
runner.runScript(new BufferedReader(new FileReader("test.sql")));

Что это!

Ответ 2

Я провел много исследований по этому вопросу и нашел хороший util из spring. Я думаю, что использование SimpleJdbcTestUtils.executeSqlScript(...) на самом деле является лучшим решением, так как оно более поддерживается и проверяется.

Изменить: SimpleJdbcTestUtils устарел. Вы должны использовать JdbcTestUtils. Обновлена ​​ссылка.

Ответ 3

Spring Framework ResourceDatabasePopulator может помочь. Как вы уже сказали, вы используете MySQL и JDBC, предположим, что у вас есть готовый MySQL DataSource экземпляр. Кроме того, предположим, что ваши файлы MySQL script являются classpath-locatable. Предположим, вы используете макет WAR, а файлы script находятся в каталоге src/main/webapp/resources/mysql-scripts/... или src/test/resources/mysql-scripts/.... Затем вы можете использовать ResourceDatabasePopulator для выполнения SQL-скриптов следующим образом:

import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import javax.sql.DataSource;

DataSource dataSource = getYourMySQLDriverBackedDataSource();

ResourceDatabasePopulator rdp = new ResourceDatabasePopulator();    
rdp.addScript(new ClassPathResource(
                        "mysql-scripts/firstScript.sql"));
rdp.addScript(new ClassPathResource(
                        "mysql-scripts/secondScript.sql"));

try {
        Connection connection = dataSource.getConnection();
        rdp.populate(connection); // this starts the script execution, in the order as added
    } catch (SQLException e) {
        e.printStackTrace();
    }

Ответ 4

Для простого sql script, разделенного ';' вы можете использовать эту простую функцию. Он удаляет комментарии и запускает заявления один за другим.

  static void executeScript(Connection conn, InputStream in)
    throws SQLException
  {
    Scanner s = new Scanner(in);
    s.useDelimiter("/\\*[\\s\\S]*?\\*/|--[^\\r\\n]*|;");

    Statement st = null;

    try
    {
      st = conn.createStatement();

      while (s.hasNext())
      {
        String line = s.next().trim();

        if (!line.isEmpty())
          st.execute(line);
      }
    }
    finally
    {
      if (st != null)
        st.close();
    }
  }

Ответ 5

@Пантелис Сопасакис

Немного измененная версия на GitHub: https://gist.github.com/831762/

Легче отслеживать изменения там.

Ответ 6

Что касается SQL script runner (который я также использую), я заметил следующий фрагмент кода:

for (int i = 0; i < cols; i++) {
  String value = rs.getString(i);
  print(value + "\t");
}

Однако в документации API для метода getString (int) упоминалось, что индексы начинаются с 1, поэтому это должно стать:

for (int i = 1; i <= cols; i++) {
  String value = rs.getString(i);
  print(value + "\t");
}

Во-вторых, эта реализация ScriptRunner не обеспечивает поддержку операторов DELIMITER в SQL script, которые важны, если вам нужно скомпилировать TRIGGERS или PROCEDURES. Поэтому я создал эту модифицированную версию ScriptRunner: http://pastebin.com/ZrUcDjSx, который, надеюсь, вы найдете полезным.

Ответ 7

Еще один интересный вариант - использовать Jisql для запуска скриптов. Поскольку исходный код доступен, его можно включить в приложение.


Изменить: внимательно посмотрел на него; встраивание его во что-то другое потребует некоторой модификации исходного кода.

Ответ 8

Введите код:

  • Прочитайте в файле, содержащем несколько операторов SQL.
  • Запустите каждый оператор SQL.

Ответ 9

Для Oracle PL/SQL драйвер JDBC Oracle действительно поддерживает выполнение всех SQL-скриптов, включая хранимые процедуры и анонимные блоки (специфичные для PL/SQL записи), см.

Могут ли драйверы JDBC получить доступ к хранимым процедурам PL/SQL?

Часто задаваемые вопросы по драйверу JDBC Oracle содержит дополнительную информацию:

Драйверы JDBC Oracle поддерживают выполнение хранимых процедур PL/SQL и анонимные блоки. Они поддерживают оба Синтаксис escape-кода SQL92 и Oracle PL/SQL синтаксис блока. Следующий PL/SQL вызовы будут работать с любым Oracle JDBC Водитель:

// SQL92 syntax
CallableStatement cs1 = conn.prepareCall
                       ( "{call proc (?,?)}" ) ; // stored proc
CallableStatement cs2 = conn.prepareCall
                       ( "{? = call func (?,?)}" ) ; // stored func
// Oracle PL/SQL block syntax
CallableStatement cs3 = conn.prepareCall
                       ( "begin proc (?,?); end;" ) ; // stored proc
CallableStatement cs4 = conn.prepareCall
                       ( "begin ? := func(?,?); end;" ) ; // stored func

Должно быть возможно прочитать в файле и передать содержимое методу prepareCall().

Ответ 10

Maven SQL Plugin Используйте этот плагин для выполнения инструкций SQL файла или списка файлов через

  • SQLCommand
  • srcFiles Конфигурации 3.fileset

Ответ 11

Можете ли вы использовать это:

public static void executeSQL(File f, Connection c) throws Exception {
    BufferedReader br = new BufferedReader(new FileReader(f));
    String sql = "", line;
    while ((line = br.readLine()) != null) sql += (line+"\n");
    c.prepareCall(sql).execute(sql);
}

Ответ 12

На самом деле нет способа сделать это.

Вы можете запустить клиент командной строки mysql через Runtime.exec(String []) и прочитать эту статью, когда вы решите для этого опция

Или попробуйте использовать ScriptRunner (com.ibatis.common.jdbc.ScriptRunner) из ibatis. Но немного глупо включать целую библиотеку только для запуска script.