使用JDBC和MySQL运行.sql脚本

我开始使用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个表格来创build,这看起来不太好。

有没有办法从MySQL JDBC运行.sql脚本?

好。 你可以在你的项目中在这里使用这个类(贴在pastebin上,因为文件的长度)。 但记得保持Apache许可证信息。

JDBC ScriptRunner

这是iBatis ScriptRunner的删除依赖关系的剥离。

你可以像这样使用它

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

而已!

我在这方面做了大量的研究, 从spring发现了一个很好的实用工具 。 我认为使用SimpleJdbcTestUtils.executeSqlScript(...)实际上是最好的解决scheme,因为它更加维护和testing。

编辑: SimpleJdbcTestUtils已被弃用。 你应该使用JdbcTestUtils 。 更新了链接。

Spring框架的ResourceDatabasePopulator可能会有所帮助。 正如您所说的,您正在使用MySQL和JDBC,我们假设您已经准备好了MySQL支持的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脚本 你可以使用这个简单的function。 它会逐个删除注释并运行语句

  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脚本运行器(我也在使用),我注意到下面的一段代码:

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

但是,在getString(int)方法的API文档中提到索引从1开始 ,所以这应该变成:

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

其次,ScriptRunner的这个实现不支持SQL脚本中的DELIMITER语句,如果你需要编译TRIGGERS或者PROCEDURE,那么这个语句是很重要的。 所以我创build了ScriptRunner的这个修改版本: http ://pastebin.com/ZrUcDjSx我希望你会觉得有用。

另一个有趣的select是使用Jisql来运行脚本。 由于源代码可用,应该可以将其embedded到应用程序中。


编辑:仔细看看它; 将其embedded到其他内容中将需要对其源代码进行一些修改。

你可以使用这个:

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

编写代码到:

  1. 读入包含许多SQL语句的文件。
  2. 运行每个SQL语句。

没有办法做到这一点。

您可以通过Runtime.exec(String [])运行mysql命令行客户端,并在决定使用此选项时阅读本文

或者尝试使用ibatis的ScriptRunner(com.ibatis.common.jdbc.ScriptRunner)。 但是为了运行一个脚本,包含一个整个库是有点愚蠢的。

对于Oracle PL / SQL,Oracle JDBC驱动程序确实支持执行包括存储过程和匿名块(PL / SQL特定表示法)在内的整个SQL脚本,请参阅

JDBC驱动程序可以访问PL / SQL存储过程吗?

Oracle JDBC驱动程序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插件使用这个插件通过执行SQL语句文件或文件列表

  1. 的SqlCommand
  2. srcFiles 3.文件集configuration