поместить данные в список и вставить их значения в базу данных - PullRequest
0 голосов
/ 22 мая 2019

Я должен сохранить вопросы в сессии позже в Списке, а затем вставить их все в базу данных одним щелчком мыши

мой сервлет

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 голосов
/ 27 мая 2019

Если у вас есть List<Question> и вы хотите вставить все за один раз, тогда вам нужно использовать то, что называется - пакетное или пакетное обновление.См. здесь для получения более подробной информации.

. Вы будете перебирать свой список вопросов и устанавливать параметры для каждого вопроса, затем добавлять этот оператор в пакет (с помощью 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 , так что если выэти идентификаторы действительно нужны, вам придется отключить автоматическую фиксацию, выполнять обновления в цикле без пакетной обработки, собирать сгенерированные идентификаторы в карте или списке для каждого оператора вставки и, наконец, в конце зафиксировать ваше соединение.

0 голосов
/ 24 мая 2019

Попробуйте st.executeUpdate(). Это обычно используется для манипулирования операторами, такими как DELETE, INSERT или UPDATE. Метод вернет либо количество строк для операторов языка данных SQL (DML), либо 0 для операторов, которые ничего не возвращают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...