簡體   English   中英

在Java中設置准備並執行查詢

[英]Set Prepare and execute query in java

我可以使用prepareStatement在Java中立即執行以下查詢嗎?

SET @totalQuestion = (SELECT QuestionVolume FROM rules ORDER BY QuestionVolume DESC LIMIT 1);
PREPARE STMT FROM 'SELECT * FROM question ORDER BY RAND() LIMIT ?';
EXECUTE STMT USING @totalQuestion;

我正在考慮的Java代碼??? (不確定是否可以做這樣的事情?)

generateQuestion = getDb().getConnection().prepareStatement(
                "SET @totalQuestion = (SELECT QuestionVolume FROM rules ORDER BY QuestionVolume DESC LIMIT 1);\n"
                + "\n"
                + "PREPARE STMT FROM 'SELECT * FROM question ORDER BY RAND() LIMIT ?';\n"
                + "EXECUTE STMT USING @totalQuestion;");

誰能解釋為什么最好用Java執行查詢?

更新

我將聲明改為以下內容。

 getQuestionRule = getDb().getConnection().prepareStatement(""
                + "SELECT QuestionVolume FROM rules ORDER BY QuestionVolume DESC LIMIT 1", Statement.RETURN_GENERATED_KEYS);
 generateQuestion = getDb().getConnection().prepareStatement(
                "SELECT * FROM question ORDER BY RAND() LIMIT ?", Statement.RETURN_GENERATED_KEYS);

使用Java變量存儲totalQuestion使您的操作通過事務原子化:

  1. 將JDBC自動提交設置為false: con = getDb().getConnection(); con.setAutoCommit(false);
  2. 執行第一個查詢並將其結果加載到局部變量totalQuestion = result.getInt("QuestionVolume");
  3. ;使用totalQuestion值而不是在mysql級別使用動態sql而是在程序端編寫sql來執行第二個查詢: String sql = "SELECT * FROM question ORDER BY RAND() LIMIT ?"; PreparedStatement st = con.prepareStatement(sql); st.setInt(1,totalQuestion); ResultSet res = st.executeQuery();
  4. 將autocommit設置為true,從而提交事務: con.setAutoCommit(true)

否:這是兩個語句,除非將它們分組在存儲過程中,否則不能一次執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM