Запуск сценария. sql с использованием 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 скрипт из MySQL JDBC?

639   12  

12 ответов:

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

JDBC ScriptRunner

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

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

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

вот именно!

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

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

весенние рамки ResourceDatabasePopulator может помочь. Как вы сказали, вы используете MySQL и JDBC, давайте предположим, что у вас есть MySQL-backed DataSource экземпляр готов. Далее, предположим, что ваши файлы сценариев MySQL являются classpath-locatable. Предположим, вы используете макет WAR, а файлы скриптов находятся в каталоге 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();
    }

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

  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();
    }
  }

@Pantelis Sopasakis

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

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

Что касается 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 не поддерживает разделитель операторы в сценарии SQL, которые важны, если вам нужно скомпилировать триггеры или процедуры. Так Я создал эту модифицированную версию ScriptRunner:http://pastebin.com/ZrUcDjSx который, я надеюсь, вы найдете полезным.

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


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

написать код:

  1. читать в файле, содержащем ряд операторов SQL.
  2. запустите каждую инструкцию SQL.

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

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

на Oracle JDBC driver FAQ дополнительные сведения:

драйверы Oracle JDBC поддерживают выполнение хранимых процедур PL / SQL и анонимные блоки. Они поддерживают оба 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 () -.

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

  1. sqlCommand
  2. srcFiles 3.конфигурации наборов файлов

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

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);
}

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

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

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

Comments

    Ничего не найдено.