我可以在java中使用prepareStatement立即执行以下查询吗?
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
,使您的操作通过事务原子化:
- 设置JDBC自动提交为false:
con = getDb().getConnection();
con.setAutoCommit(false);
- 执行第一个查询并将其结果加载到本地变量
totalQuestion = result.getInt("QuestionVolume");
- 使用
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();
- 将自动提交设置为true,从而提交事务:
con.setAutoCommit(true)
。