之后我必须将问题存储在会话中的列表中,然后一键将其全部插入数据库中
我的servlet
Question question = new Question(title, content, idExam);
request.getSession().setAttribute("question", question);
int quizKey = ExamDAO.add_question(question);
ArrayList<Question> ques = new ArrayList<Question>();
ques.add(question);
我的岛
cnx = Connect.getConnection();
String req = "insert into question(title, content, id_examen) values(?,?,?)";
PreparedStatement st = cnx.prepareStatement(req, Statement.RETURN_GENERATED_KEYS);
st.setString(1, question.getTitre());
st.setString(2, question.getContenu());
st.setInt(3, question.getIdExamen());
st.executeBatch();
ResultSet rs = st.getGeneratedKeys();
if (rs.next()) {
quizKey = rs.getInt(1);
}
该怎么做?
答案 0 :(得分:0)
尝试st.executeUpdate()
。通常用于处理诸如DELETE
,INSERT
或UPDATE
之类的语句。该方法将返回SQL数据操作语言(DML)语句的行数,或者返回不返回任何内容的语句的行数。
答案 1 :(得分:0)
如果您有List<Question>
,并且希望一次插入所有内容,则必须利用所谓的-批处理或批处理更新。有关更多详细信息,请参见here
您将迭代问题列表并为每个问题设置参数,然后将该语句添加到批处理中(使用st.addBatch()),然后最终调用-st.executeBatch()
。
在代码示例中,您正在执行一个批处理,但是该批处理中只有一个准备好的语句。您需要准备的语句与列表中的问题数量一样多。
String req = "insert into question(title, content, id_examen) values(?,?,?)";
PreparedStatement st = cnx.prepareStatement(req, Statement.RETURN_GENERATED_KEYS);
for(Question question : ques){
st.setString(1, question.getTitre());
st.setString(2, question.getContenu());
st.setInt(3, question.getIdExamen());
st.addBatch();
}
st.executeBatch();
使用这种方法,您可能在收集生成的密钥方面遇到问题,如本SO question所示,因此,如果您确实需要这些id,则必须关闭自动提交功能,不分批地循环执行更新,收集生成的每个插入语句的映射或列表中的ID,然后最后最后提交您的连接。