我开始使用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台来建立,这看起来并不好。
有没有一种方式来运行从MySQL JDBC .sql的脚本?
Answer 1:
好。 你可以在你的项目中使用此这个类(上发布引擎收录,因为文件的长度)。 但记得要保持Apache许可证信息。
JDBC ScriptRunner
这是去除依赖iBatis的ScriptRunner的骗人货。
您可以使用它像这样
Connection con = ....
ScriptRunner runner = new ScriptRunner(con, [booleanAutoCommit], [booleanStopOnerror]);
runner.runScript(new BufferedReader(new FileReader("test.sql")));
而已!
Answer 2:
我做了很多的研究,发现这个一个很好的从春天UTIL 。 我想用SimpleJdbcTestUtils.executeSqlScript(...)
实际上是最好的解决方案,因为它是更多的维护和测试。
编辑: SimpleJdbcTestUtils
已被弃用。 您应该使用JdbcTestUtils
。 更新的链接。
Answer 3:
Spring的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();
}
Answer 4:
对于由分裂简单的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();
}
}
Answer 5:
@Pantelis Sopasakis
在GitHub上稍作修改的版本: https://gist.github.com/831762/
它更容易出现跟踪修改。
Answer 6:
对于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语句,如果你需要编译触发器或程序,这是很重要的支持。 所以我创建ScriptRunner的这款改装版: http://pastebin.com/ZrUcDjSx ,我希望你能找到有用的。
Answer 7:
另一个有趣的选项是使用Jisql运行的脚本。 由于源代码是可用的,它应该有可能将其嵌入到应用程序。
编辑:花了仔细的看看吧; 嵌入这里面别的东西需要一些修改其源代码。
Answer 8:
你可以这样做:
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文件和数据库连接。 然后,它读取使用的BufferedReader从java.io.文件中的行由行
最后,执行所读语句。
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);
}
Answer 9:
编写代码:
- 阅读包含多个SQL语句的文件。
- 运行每个SQL语句。
Answer 10:
对于Oracle PL / SQL时,Oracle JDBC驱动程序确实支持执行整个SQL的脚本,包括存储过程和匿名块(PL / SQL特定的符号),见
在JDBC驱动程序可以访问PL / SQL存储过程?
在Oracle JDBC驱动程序常见问题有更多的信息:
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() - 方法。
Answer 11:
Maven的SQL插件使用这个插件通过执行SQL语句的文件的文件或目录
- 的SqlCommand
- srcFiles 3.fileset配置
Answer 12:
是不是真的有办法做到这一点。
您既可以通过运行在的Runtime.exec mysql命令行客户端(字符串[]),并阅读这篇文章 ,当你决定了这个选项
或尝试使用ScriptRunner(com.ibatis.common.jdbc.ScriptRunner)从ibatis的 。 但它是一个有点傻,包括整个图书馆只运行一个脚本。
文章来源: Running a .sql script using MySQL with JDBC