将数据放入List thenn中,然后将其值插入数据库

时间:2019-05-21 23:32:58

标签: java jdbc

之后我必须将问题存储在会话中的列表中,然后一键将其全部插入数据库中

我的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);
            }

该怎么做?

2 个答案:

答案 0 :(得分:0)

尝试st.executeUpdate()。通常用于处理诸如DELETEINSERTUPDATE之类的语句。该方法将返回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,然后最后最后提交您的连接。