Запуск сценария. 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?
12 ответов:
ОК. Вы можете использовать этот класс здесь (размещенный на pastebin из-за длины файла) в своем проекте. Но не забудьте сохранить информацию о лицензии apache.
это 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-backedDataSourceэкземпляр готов. Далее, предположим, что ваши файлы сценариев 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: внимательно посмотрел на него; встраивание его в что-то еще потребует некоторой модификации его исходного кода.
для 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 файл или список файлов через
- sqlCommand
- 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