使用MySQL和JDBC运行.sql脚本

Mac*_*rse 66 java mysql sql 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)" +
            ")");
Run Code Online (Sandbox Code Playgroud)

我有3-4个表来创建,这看起来不太好.

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

jit*_*ter 71

好.您可以在此项目中使用此类(由于文件长度而在pastebin上发布).但请记住保留apache许可证信息.

JDBC ScriptRunner

这是删除了依赖项的iBatis ScriptRunner的ripoff.

你可以像这样使用它

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

而已!

  • 这个班级无法处理PROCEDURE (5认同)
  • 我冒昧地复制代码,更新它以添加对存储过程的分隔符的支持,将其上传到GitHub,并在@jitter的答案中更新链接. (3认同)
  • 这可以用来返回`ResultSet`,还是只适用于update语句?我尝试使用它,但无法弄清楚如何让它返回`ResultSet`.我会选择`Spring`但是使用类比使用整个库更容易. (2认同)

Ami*_*far 24

我对此做了很多研究,并从春天找到了一个好的工具.我认为使用SimpleJdbcTestUtils.executeSqlScript(...)实际上是最好的解决方案,因为它更加维护和测试.

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

  • 从Spring 4.0.3开始.`JdbcTestUtils.executeSqlScript()`方法现已弃用.应该使用`ScriptUtils.executeSqlScript(...)`. (7认同)
  • 谢谢@Amir Raminfar,你的回答帮助了我.无论如何,作为更新,spring不推荐使用`SimpleJdbcTestUtil`并建议将来使用`JdbcTestUtils`. (2认同)

Abd*_*ull 16

Spring Framework ResourceDatabasePopulator可能会有所帮助.正如您所说的那样,您正在使用MySQL和JDBC,我们假设您已DataSource准备好MySQL支持的实例.此外,假设您的MySQL脚本文件是类路径可定位的.假设您使用的是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();
    }
Run Code Online (Sandbox Code Playgroud)


lun*_*con 6

对于由';'拆分的简单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();
    }
  }
Run Code Online (Sandbox Code Playgroud)

  • 您假设注释不能出现在单个语句中。在 CREATE TABLE 这很常见。 (2认同)

joe*_*776 5

@Pantelis Sopasakis

GitHub 上稍微修改的版本:https : //gist.github.com/831762/

在那里跟踪修改更容易。