суббота, 28 апреля 2012 г.

DbUnit: чистый sql

Начало: DbUnit: общее описание, DbUnit: пример.

В некоторых случаях сформировать простой датасет не только не просто, но и невозможно; и потому появляется необходимость выполнять "чистые" SQL запросы напрямую к базе данных. Естественно, что при этом желательно бы использовать тот же самый datasource, а ещё лучше - тот же самый DbUnit.
Далее приводится пример такого запроса на основе PreparedStatement с поддержкой транзакционности.


//MockData mock - объект с некоторыми данными
public void doSqlQuery (MockData mock) throws Exception {
    Connection connection = dbConnection.getConnection();
    ResultSet rs;

    //предварительное получение какого-то необходимого значения
    PreparedStatement pstClientId = connection.prepareStatement(
            "select client_id from client_message where message_identifier = ?");
    pstClientId.setString(1, mock.message_identifier);
    rs = pstClientId.executeQuery();
    rs.next();
    mock.client_id = rs.getInt("client_id");

    //подготовка одного запроса для вставки
    PreparedStatement pstResult = connection.prepareStatement(
            "insert into result (client_id, sms_index, msisdn, status, datetime values (?, ?, ?, ?, ?)");
    pstResult.setInt(1, mock.client_id);
    pstResult.setInt(2, mock.sms_index);
    pstResult.setInt(3, mock.msisdn);
    pstResult.setInt(4, mock.status);
    pstResult.setTimestamp(5, mock.date_time);

    //подготовка второго запроса для обновления записи в БД
    PreparedStatement pstSendSms = connection.prepareStatement(
            "update send_sms set status = ?, status_date_time = ? where client_id = ?");
    pstSendSms.setInt(1, mock.send_sms_status);
    pstSendSms.setTimestamp(2, mock.date_time);
    pstSendSms.setInt(3, mock.client_id);

    connection.setAutoCommit(false);                    //отключение автокомита
    Savepoint point = connection.setSavepoint();  //создание точки отката
    try {
        pstResult.executeUpdate();                           //выполнение одного
        pstSendSms.executeUpdate();                      //и второго запросов
        connection.commit();                                    //подтверждение транзакции
    } catch (Exception e) {
        connection.rollback(point);                          //откат при ошибке
        throw e;
    } finally {
        connection.setAutoCommit(true);                 //включение автокомита
    }
}

Комментариев нет:

Отправить комментарий