我开始在MySQL中使用MySQL。
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个表,这看起来不太好。
有没有办法从MySQL JDBC运行.sql脚本?
答案 0 :(得分:70)
确定。您可以在此项目中使用此类(由于文件长度而在pastebin上发布)。但请记住保留apache许可证信息。
iBatis ScriptRunner的ripoff删除了依赖项。
您可以像这样使用
Connection con = ....
ScriptRunner runner = new ScriptRunner(con, [booleanAutoCommit], [booleanStopOnerror]);
runner.runScript(new BufferedReader(new FileReader("test.sql")));
就是这样!
答案 1 :(得分:24)
我对此进行了大量研究并发现了一个很好的util from spring。我认为使用SimpleJdbcTestUtils.executeSqlScript(...)
实际上是最好的解决方案,因为它更加维护和测试。
修改:SimpleJdbcTestUtils
已弃用。您应该使用JdbcTestUtils
。更新了链接。
答案 2 :(得分:14)
Spring Framework的ResourceDatabasePopulator
可能有所帮助。正如您所说的那样,您正在使用MySQL和JDBC,我们假设您已准备好支持MySQL的DataSource
实例。此外,假设您的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();
}
答案 3 :(得分: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();
}
}
答案 4 :(得分:4)
答案 5 :(得分:2)
关于SQL脚本运行器(我也在使用),我注意到以下代码:
for (int i = 0; i < cols; i++) {
String value = rs.getString(i);
print(value + "\t");
}
但是,在getString(int)方法的API文档中,提到了indexes start with 1,所以这应该成为:
for (int i = 1; i <= cols; i++) {
String value = rs.getString(i);
print(value + "\t");
}
其次,ScriptRunner的这种实现不支持SQL脚本中的 DELIMITER 语句,如果您需要编译TRIGGERS或PROCEDURES,这些语句很重要。所以我创建了ScriptRunner的这个修改版本:http://pastebin.com/ZrUcDjSx我希望你会发现它有用。
答案 6 :(得分:2)
另一个有趣的选择是使用Jisql来运行脚本。由于源代码可用,因此应该可以将其嵌入到应用程序中。
编辑:仔细看看它;将其嵌入其他内容需要对其源代码进行一些修改。
答案 7 :(得分:2)
你能用这个:
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);
}
此函数获取SQL文件和数据库连接。 然后它使用来自java.io的BufferedReader逐行读取文件 最后,执行read语句。
Java 8+版本:
public static void executeSQL(Path p, Connection c) throws Exception {
List<String> lines = Files.readAllLines(p);
String s = String.join("\n", lines.toArray(new String[0]));
c.prepareCall(s).execute(s);
}
答案 8 :(得分:1)
将代码写入:
答案 9 :(得分:1)
对于Oracle PL / SQL,Oracle JDBC驱动程序确实支持执行整个SQL脚本,包括存储过程和匿名块(PL / SQL特定符号),请参阅
Can the JDBC Drivers access PL/SQL Stored Procedures?
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() - 方法。
答案 10 :(得分:1)
Maven SQL Plugin使用此插件通过
执行文件或文件列表的SQL语句答案 11 :(得分:0)
没有办法做到这一点。
您可以通过Runtime.exec(String [])运行mysql命令行客户端,并在决定使用此选项时阅读this article
或尝试使用ibatis中的ScriptRunner(com.ibatis.common.jdbc.ScriptRunner)。但是为了运行脚本而包含整个库有点愚蠢。