日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

java jdbc脚本_关于java:使用MySQL和JDBC运行.sql脚本

發布時間:2025/3/19 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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脚本的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。