Пакетная операция JDBC / JDBCTemplate

Существует множество примеров пакетной вставки запроса с использованием JDBC или JDBCTemplate.

Я хотел бы выполнить пакетную операцию sql, состоящую из выбора, вставки и удаления. Например, мне нужно выполнить следующую операцию sql при одном подключении к базе данных.

  1. Множественный выбор (4 запроса к разным таблицам)
  2. Множественная вставка (4 запроса к разным таблицам)
  3. Множественное удаление (4 запроса к разным таблицам)

Поддерживает ли это JDBC или JDBCTemplate?

ИЗМЕНИТЬ Вопрос:

TicketServiceEnforce ticketDao = TicketServiceEnforceImpl.Factory.getInstance();

        // ================================ SELECT ================================
        if (unknownTicketId > ZERO) {
            unknownTicketList = ticketDao.selectUnknownTicket(unknownTicketId);
            if (!unknownTicketList.isEmpty()) {
                attachmentList = ticketDao.selectAttachment(QueryString.SELECT_UNKNOWN_TICKET_ATTACHMENT_BY_ID.toString(), unknownTicketId);
                ticketCodeList = ticketDao.selectTicketCode(QueryString.SELECT_UNKNOWN_TICKET_CODE_BY_ID.toString(), unknownTicketId);
                ticketCommentList = ticketDao.selectComment(QueryString.SELECT_UNKNOWN_TICKET_COMMENT_BY_ID.toString(), unknownTicketId);
            }
        }
        // ================================ INSERT ================================
        // Retrieve customer_id
        if (!unknownTicketList.isEmpty()) {
            // Just display all customers's name in UI
            customerId = ticketDao.selectCustomerIdByName(genericTicket.getCustomerName());

            genericTicket.setCustomerId(customerId);
            genericTicket.setSubject(unknownTicketList.get(ZERO).getSubject());
            genericTicket.setDetails(unknownTicketList.get(ZERO).getDetails());
            genericTicket.setCreationDate(unknownTicketList.get(ZERO).getCreationDate());

            // =====================================================================
            ticketId = ticketDao.createTicket(genericTicket);
            if (ticketId > ZERO) {

                if (!attachmentList.isEmpty()) {
                    ticketDao.createTicketAttachment(ticketId, attachmentList);
                }

                /*
                 * Insert new ticket code
                */
                newTicketCode = generateTicketCode(ticketId);
                if (!ticketCodeList.isEmpty()) {
                    oldTicketCode = ticketCodeList.get(ZERO);

                    ticketDao.createTicketCode(ticketId, newTicketCode);
                }

                /* Insert old unknown ticket code into ticket_email_mapping
                 * This table used to identify the parent child ticket from email - unknown_ticket
                 * by using two queries
                 * 
                 * 1. Select ticket code - select ticket code from ticket_email_mapping using id  
                 * 2. Select ticket id that has previous ticket code - Select id from ticket_email_mapping tem where tem. 
                 * 
                 */
                if (oldTicketCode != null) {
                    String from_sender = null;
                    if (unknownTicketList.size() > ZERO) {
                        from_sender = unknownTicketList.get(ZERO).getFrom();
                    }

                    ticketDao.createTicketEmailMapping(ticketId, oldTicketCode, from_sender);
                }

                if (!ticketCommentList.isEmpty()) {
                    for (GenericTicketComment comment : ticketCommentList) {
                        comment.setTicketId(ticketId);
                    }

                    ticketDao.createTicketComment(QueryString.INSERT_TICKET_COMMENT.toString(), ticketCommentList);
                }

                if (genericTicket.getAssigneeName() != null) {
                    int assigneeId = -1;
                    String firstName = "";
                    TicketAssignee assignee = new TicketAssignee();

                    firstName = genericTicket.getAssigneeName();
                    assigneeId = ticketDao.selectUserId(firstName);

                    assignee.setTicketId(ticketId);
                    assignee.setAssigneeId(assigneeId);

                    ticketDao.createTicketAssignee(assignee);
                }

                // If all successfull
                ticketCreationSuccessful = true;
            }
        }

        // ================================ DELETE ================================
        if (ticketCreationSuccessful) {
            if (!attachmentList.isEmpty()) {
                affectedRow = ticketDao.removeUnknownTicket(QueryString.DELETE_UNKNOWN_TICKET_ATTACHMENT_BY_ID.toString(), unknownTicketId);
            }

            if (!ticketCommentList.isEmpty()) {
                affectedRow = ticketDao.removeUnknownTicket(QueryString.DELETE_UNKNOWN_TICKET_COMMENT_BY_ID.toString(), unknownTicketId);
            }

            affectedRow = ticketDao.removeUnknownTicket(QueryString.DELETE_UNKNOWN_TICKET_CODE_BY_ID.toString(), unknownTicketId);
            affectedRow = ticketDao.removeUnknownTicket(QueryString.DELETE_UNKNOWN_TICKET_BY_ID.toString(), unknownTicketId);
        }

Это DAO, использующий обычную операцию запроса. Можно ли его переписать в хранимой процедуре или в массовой операции.

Спасибо. Пожалуйста помоги.


person nicholas    schedule 27.11.2012    source источник
comment
Кто-нибудь знает, как это сделать?   -  person nicholas    schedule 28.11.2012
comment
JdbcTemplate.batchUpdate действителен только для нескольких операторов в одной и той же операции sql, например только для вставки.   -  person nicholas    schedule 28.11.2012


Ответы (1)


Как видно из названия jdbcTemplate.batchUpdate, вы не можете выбирать в пакетных операциях. Если вы хотите выполнить всю операцию за один раз, просто создайте один большой SQL, соответствующий вашей логике, и используйте метод JdbcTemplate.#execute(java.lang.String).

person Jayamohan    schedule 12.12.2012
comment
JdbcTemplate. # Execute (java.lang.String) не предлагает привязку заполнителя. Мне нужен метод, который используется для выполнения различных операций sql, таких как выбор, вставка, удаление за один раз с привязкой заполнителя. Спасибо - person nicholas; 14.12.2012
comment
Взгляните на NamedParameterJdbcTemplate. # Execute - person Jayamohan; 17.12.2012