java jdbc脚本_关于java:使用MySQL和JDBC运行.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個表來創建,這看起來不太好。
有沒有辦法從MySQL JDBC運行.sql腳本?
你需要編寫java代碼來運行這些create table語句的任何特殊原因嗎? 它們在某種程度上是動態的嗎?
因為他想通過Java xD做所有事情
好。您可以在此項目中使用此類(由于文件長度而在pastebin上發布)。但請記住保留apache許可證信息。
JDBC ScriptRunner
這是刪除了依賴項的iBatis ScriptRunner的ripoff。
你可以像這樣使用它
Connection con = ....
ScriptRunner runner = new ScriptRunner(con, [booleanAutoCommit], [booleanStopOnerror]);
runner.runScript(new BufferedReader(new FileReader("test.sql")));
而已!
非常少數的課程。我必須補充說,130行會引起頭痛。我將其替換為"String trimmedLine = line.trim()。replaceAll("; $",Matcher.quoteReplacement(";"));"因為你可能會得到stackoverflow.com/questions/3499483/
這可以用于返回ResultSet,還是只適用于更新語句?我嘗試使用它,但無法弄清楚如何讓它返回ResultSet。我會選擇Spring但是使用類比使用整個庫更容易。
小心鏈接到腳本 - 如果你的腳本有一個代碼"注釋",如select 1; -- do nothing那么腳本不會執行它,但將其視為較長命令的前半部分[與新命令連接]另一個副作用 - 如果這是你文件中的最后一件事,它根本不會運行它。如果您只是堅持使用單行sql注釋,那就沒關系
這個班級無法處理PROCEDURE
在創建使用DELIMITER和END的過程時不起作用
我冒昧地復制代碼,更新它以添加對存儲過程的分隔符的支持,將其上傳到GitHub,并在@jitter的答案中更新鏈接。
我對此做了很多研究,并從春天找到了一個好的工具。我認為使用SimpleJdbcTestUtils.executeSqlScript(...)實際上是最好的解決方案,因為它更加維護和測試。
編輯:SimpleJdbcTestUtils已棄用。你應該使用JdbcTestUtils。更新了鏈接。
謝謝@Amir Raminfar,你的回答幫助了我。無論如何,作為更新,spring已棄用SimpleJdbcTestUtil并建議將來使用JdbcTestUtils。
這是最好的答案,Spring框架團隊很活躍。
從Spring 4.0.3開始。 JdbcTestUtils.executeSqlScript()方法現已棄用。應該使用ScriptUtils.executeSqlScript(...)代替。
請注意,無論是否積極開發,這些實用程序類的設計都考慮了測試,并且對于大多數情況來說是不夠的;例如,由于分隔符問題,它們不允許您創建存儲過程;根據您的需要,joe776的答案可能是更好的選擇,
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();
}
到目前為止這里是最好的答案。我厭倦了看到答案,告訴你從命令行運行MySQL轉儲導入。在數據庫位于不同服務器上的自動化環境中不能很好地工作。
@Zoidberg mysql命令行客戶端和mysqldump在網絡上正常工作,可以在自動腳本中使用。將數據庫放在不同的服務器上應該沒有問題。
@Asaph你是對的。我實際上嘗試了上述解決方案,發現性能非常慢。我使用命令行參數就好了,所以我上面的評論實際上是不正確的。
對于由';'拆分的簡單sql腳本你可以使用這個簡單的功能。
它逐個刪除注釋和運行語句
static void executeScript(Connection conn, InputStream in)
throws SQLException
{
Scanner s = new Scanner(in);
s.useDelimiter("/\\*[\\s\\S]*?\\*/|--[^\
\
]*|;");
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();
}
}
您假設注釋不能出現在單個語句中。在CREATE TABLE中,這很常見。
我會說更多。它不支持復雜查詢,但您可以將分隔符更改為其他內容,例如'; [ s r n] * \'。并根據需要使用評論。
對不起,但這個工作更好stackoverflow.com/questions/1497569/
Atais,很高興看到你的嘗試...我的代碼只是一個例子,使用它你希望:)
@Pantelis Sopasakis
在GitHub上稍微修改過的版本:https://gist.github.com/831762/
它更容易跟蹤修改。
你能用這個:
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+"
");
c.prepareCall(sql).execute(sql);
}
此函數獲取SQL文件和數據庫連接。
然后它使用java.io中的BufferedReader逐行讀取文件。
最后,執行read語句。
Java 8+版本:
public static void executeSQL(Path p, Connection c) throws Exception {
List lines = Files.readAllLines(p);
String s = String.join("
", lines.toArray(new String[0]));
c.prepareCall(s).execute(s);
}
雖然此代碼可以回答這個問題,但提供有關如何和/或解決問題的原因的其他背景將提高答案的長期價值。請閱讀這個如何回答提供高質量的答案。
另一個有趣的選擇是使用Jisql來運行腳本。由于源代碼可用,因此應該可以將其嵌入到應用程序中。
編輯:仔細看看;將其嵌入其他內容需要對其源代碼進行一些修改。
關于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或PROCEDURES,這些語句很重要。所以我創建了ScriptRunner的這個修改版本:http://pastebin.com/ZrUcDjSx,我希望你會發現它很有用。
這非常有幫助。非常感謝你。
Maven SQL插件使用此插件通過執行SQL語句文件或文件列表
的SqlCommand
srcFiles
3.fileset配置
對于Oracle PL / SQL,Oracle JDBC驅動程序確實支持執行整個SQL腳本,包括存儲過程和匿名塊(PL / SQL特定表示法),請參閱
JDBC驅動程序可以訪問PL / SQL存儲過程嗎?
Oracle JDBC驅動程序常見問題解答有更多信息:
Oracle JDBC drivers support execution
of PL/SQL stored procedures and
anonymous blocks. They support both
SQL92 escape syntax and Oracle PL/SQL
block syntax. The following PL/SQL
calls would work with any Oracle JDBC
driver:
// 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()方法。
這個問題的第一個鏈接被打破了。
編寫代碼:
讀入包含許多SQL語句的文件。
運行每個SQL語句。
如果我這樣做,我應該解析.sql文件。我期待有一個我無法找到的jdbc功能。
沒有辦法做到這一點。
您可以通過Runtime.exec(String [])運行mysql命令行客戶端,并在決定使用此選項時閱讀本文
或者嘗試使用ibatis的ScriptRunner(com.ibatis.common.jdbc.ScriptRunner)。但是,為了運行腳本而包含整個庫有點愚蠢。
對,是真的。添加一個lib只是為了運行一個腳本沒有意義:(我認為jdbc沒有這樣的東西是很奇怪的。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的java jdbc脚本_关于java:使用MySQL和JDBC运行.sql脚本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3级联动 ajax java_ajax实
- 下一篇: xsd java引用_web.xml文件