Начало: DbUnit: общее описание, DbUnit: пример.
В некоторых случаях сформировать простой датасет не только не просто, но и невозможно; и потому появляется необходимость выполнять "чистые" SQL запросы напрямую к базе данных. Естественно, что при этом желательно бы использовать тот же самый datasource, а ещё лучше - тот же самый DbUnit.
Далее приводится пример такого запроса на основе PreparedStatement с поддержкой транзакционности.
В некоторых случаях сформировать простой датасет не только не просто, но и невозможно; и потому появляется необходимость выполнять "чистые" 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); //включение автокомита
}
}
Комментариев нет:
Отправить комментарий