Запуск .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.