SoapUI – соединение JDBC
SoapUI позволяет управлять работой базы данных с помощью TestStep, который называется JDBC Request.
Шаг 1 – Щелкните правой кнопкой мыши TestStep и выберите Добавить шаг → Запрос JDBC.

Шаг 2 – введите имя шага и нажмите ОК.

Шаг JDBC добавлен. Дважды щелкните шаг, и откроется мастер JDBC.

Чтобы создать соединение JDBC, пользователь должен предоставить действительный драйвер и строку подключения. Эти параметры используются для определения типа базы данных и создания соединения для использования базы данных.
Для MySQL драйвером базы данных может быть com.mysql.jdbc.Driver . Аналогично, для другой базы данных есть предопределенный драйвер, который можно найти в разделе документов базы данных.
Шаг 3 – Строка подключения должна быть в следующем формате –
Jdbc:mysql://[host]:[port]/[database]?[property][=value]
Здесь свойство – это имя пользователя и пароль, а также другие параметры, необходимые для соединения с базой данных.
jdbc:mysql://localhost:8089/xxx_DB?user=root&password=root
Шаг 4 – Нажмите «Проверить соединение». При успешном подключении будет отображаться УСПЕХ, в противном случае предоставьте подробности отказа.
SoapUI используем клиентский сертификат
Создаем проект
Проходим по шагам, открываем свойства проекта 1, переходим по вкладкам 2,3, жмем 4, указываем файл сертификата 5 и пароль 6
И результат: 
Опубликовано Октябрь 7, 2015 Ноябрь 15, 2016 Автор Андрей Рубрики Разное
Ручное интеграционное тестирование в банковском секторе. Что внутри?
Не всегда, приходя на крупный новый или старый проект, новый тестировщик знает с какой стороны подойти к началу процесса тестирования. Иногда нет куратора, иногда не настроен процесс коммуникации. И вы можете хоть сто раз плюнуть в компанию и пойти искать новую, благо рынок сейчас в дефиците. Но гораздо интереснее будет получить бесценный опыт становления вас как самостоятельного и понимающего члена команды. Данная статья будет посвящена теории тестирования реализаций системы антифрод в одном из крупнейших банков РФ. О чем мы поговорим в этой статье? Об особенностях архитектуры enterprise. Про основной инструментарий и про советы тем, кто захочет прийти в сферу интеграционного тестирования бэкэнда в крупную компанию.
Примеры будут браться из работ по интеграции антифрод-системы.
Инструментарий для тестирования
На собеседованиях на данную позицию кроме основных обязательных знаний по теории тестирования и работы с базовым инструментарием тестировщика также требуется набор знаний, нужных для понимания работы протоколов по которому это взаимодействие происходит. А также набор инструментов. Что в этот набор входит:
- SOAP (состав xml сообщений);
- REST (часть взаимодействий идет через OpenAPI), JSON;
- SoapUI и Postman (по желанию, какой инструмент удобен, тем и пользовались). Из практики, если очередь работает с XML — используем SoapUI. Если основа REST — Postman. Было замечено, что SoapUI не всегда корректно отрабатывает ошибки RestAPI.
- принципы ssl шифрования. Шины любят общаться безопасно, поэтому требуются знания по генерации ключей;
- putty + bash + linux. На некоторых сложных интеграциях нельзя слать сообщения напрямую из системы-источника (речь о way4 и транзакциях процессинга). Поэтому, дружба с linux приветствовалась на уровне “знаю как подключаться по ssh и запустить модуль с параметрами”. Для генерации ssl, кстати, тоже надо будет это знать;
- SQL на уровне простых запросов до join. Теория реляционных БД желательно. Умение работать с любой РСУБД — MS SQL Developer, PL\SQL Developer. Второй даже поддерживает Test Runner для простых проверок;
- Понимание клиент-серверной архитектуры и OSI на базовом уровне.
Не обязательна практика работы, но всегда хочется, чтобы кандидат был вовлечен. Любой Pet-проект подойдет чтобы рассказать о практике работы со всем вышеназванным. Связка virtualBox + http сервер + проект Postman. Или озвучивание сервисов с открытым API.
Архитектура
Встречается различный подход к документации на проектах. Кто-то требует документировать свою работу, кто-то работает по гибким методологиям и не ставит составление документации в приоритет. В общем, документация может быть, а может и не быть. И если вы не уточнили про наличие оной на собеседовании, то не удивляйтесь. Найдите сотрудника (PM, Тимлид, Техлид), который может обрисовать технологический стек и постарайтесь накидать для себя схему архитектуры сами. Потом, показывая картинку, легче понимать передвижение потоков данных и разговаривать с остальными членами команды на одном языке.

Пример состава тестового контура:
- Шина данных. Очень часто в корпоративном секторе используется какой-то сервис очередей — tibco, kafka, RabbitMQ.
- Ядро антифрод системы (+ web интерфейс к ней для настройки политик).
- БД с данными транзакций, клиентов и другими, для корректных расчетов системы антифрод и применения политик скоринга.
- Остальные смежные системы, требуемые для тестирования
Смежные системы общаются с шиной посредством коннекторов. Для каждого коннектора на шине пишется отдельный сервис, который конвертирует данные из формата, понятного системе-источнику, в формат понятный шине. Чаще всего это xml.
После этого документ помещается в очередь, из которой шина отправляет данные в систему-приемник. В нашем частном случае это была антифрод-система.
Для приема и корректной обработки данных из каждой системы-источника на стороне сервера антифрод пишется отдельный микросервис. Микросервисы выполняют атомарные функции доставки данных в ядро и передачу скоринговых баллов из ядра с вердиктом антифрода обратно в шину. Также могу валидировать входящие и исходящие данные в соответствии с ТЗ. При этом результаты опционально, по согласованию с заказчиком, логируются в базу данных для последующего анализа.
Процессы тестирования
Процессы тестирования делятся на два вида — отдельно тестирование нового микросервиса и end-2-end тестирование. Каждый из этих видов включает несколько этапов со стороны команды тестирования.
Тестирование нового микросервиса включает в себя следующие этапы:

- Анализ технического задания на микросервис (разрабатывается заказчиком совместно с аналитиком);
- Декомпозиция требований и составление матрицы соответствия требований;
- Написание тест-плана для согласования с заказчиком. Можно найти шаблон в интернет-пространстве, если такового не имеется в наличие;
- Написание тест-кейсов согласно матрице. Используется любая система управления тестированием. В корпоративном секторе сейчас распространена TFS(Azure DevOps Server)
- Собственно, прохождение тест-кейсов и заведение дефектов;
- Отчетность по результатам тестирования — протоколы, артефакты и т.п. (опционально по согласованию с заказчиком)
В корпоративном секторе роль заказчика часто принадлежит внутреннему бизнес-подразделению и лицом принимающим решение со стороны бизнеса является его руководитель. Он же ставит бизнес-задачу на разработку интеграционного взаимодействия. Например, руководитель департамента МСБ (малый-средний бизнес). Тестовые данные в данном случае могут предоставлять сотрудники подразделения-заказчика.
Бизнес-задачи для системы антифрод может звучать так:
“Требуется, чтобы все платежи от юридических лиц проверялись в системе и отправлялись на ручную проверку\блокировались при значении скорингового балла более 60”.
“Требуется блокировать все запросы от ИП с просрочкой более 1 месяца”
End-2-end тестирование отличается тем, что к обычному процессу добавляется этап согласования тест-плана не только с заказчиком, но и с командой тестирования сервиса-источника. А также в процессе прохождения тест-кейсов все тестовые данные(запросы) генерируются ролями в системах-источниках. У каждой информационной банковской системы есть своя команда(внутренняя или внешний интегратор), разрабатывающая новые функции, и также имеет своих разработчиков и тестировщиков. E2E проводится совместно с ними.
Например: Тестировщик Диасофт от роли “Оператор” отправляет платеж по карте мир от одного юрлица к другому.

Команда взаимодействия
Тестировщики системы взаимодействуют в работе со следующими ключевыми сотрудниками:
- Проектный менеджер
- Менеджер технологической инфраструктуры (возможно DevOps)
- Аналитик со стороны разработки
- Аналитик со стороны заказчика (опционально)
- Разработчик со стороны сервиса-источника
- Разработчик со стороны антифрод
- Разработчик со стороны шины
- Автотестировщик, Архитектор, Поддержка, Скрам-мастер и прочие невиданные звери — опционально, но скорее нет. Набор ролей соответствует стандартному набору ролей в жизненном цикле ПО по любой методологии.
Базовый сценарий тестирования
После того, как заказчик прислал требования и набор политик для антифрод, аналитики или служба поддержки настраивают их на тестовом контуре в веб-интерфейсе.
В обязанности команды тестирования входит подготовка тестовых данных согласно требованиям и политикам, и создание проекта SoapUI для пересылки этих данных в соответствующий микросервис. После написания каждого нового микросервиса заново выгружается wsdl файл, который потом грузится в SoapUI.
Под тестовыми данными я подразумеваю xml-файлы, набор полей в которых соответствовал требованиям, при которых политики срабатывали корректно или отдавали соответствующий код ответа, согласно документации.
Пример: При осуществлении платежа от ИП Васечкин к ИП Петечкину платеж должен быть не более 1 млн.руб. Если больше, то антифрод возвращает ответ DECLINE и транзакция блокируется.
Код ответа может меняться, так же, как и состав политик.
Более сложный пример: При пересылке от ИП Васечкин 1 млн.руб требуется запросить наличие просроченных кредитов у данного ИП через смежную систему. При наличие просрочки, увеличить скоринговый бал у Васечкина на 50ед за каждую просрочку. При превышении скорингового балла 100ед, отправить платеж на проверку менеджеру в ручном режиме. При этом антифрод должен прислать в теле ответа код ALLOW WAIT и скоринговый бал.
Позитивные сценарии.
Для всех позитивных сценариев составляются xml с нужными данными по клиенту(id, наименование, инн) и нужной суммой в теле запроса. Запрос отправляется в микросервис и в SoapUI создаются ассерты для проверки корректности ответа.
books c:\endeca\apps\books 8000 8001 90 120 --threads 6
Привел его для примера. Тестировщику желательно знать ключевые элементы схемы XML
Негативные сценарии.
Для всех негативных сценариев в ключевых полях изменяются наборы данных. Применяются различные техники тест-дизайна, чтобы проверить корректность ответа системы антифрод. Если есть требования к типам и длинне данных, надо проверять и реакцию фронта и реакцию баз данных на выход за границы значений. Желательно обрабатывать ошибки на сервере приложений, не пуская ошибочные данные в базу.
После отправки запроса в микросервис, и проверки корректности ответа с помощью ассертов также надо проверить корректность логирования в базе антифрода и отправку ответа в шину.
Логирование работы каждого сервиса всегда происходит в отдельную таблицу БД антифрода, если заказчик не указал иное. Проверка происходит ручным составлением запроса в БД или добавлением проверки данных из БД с помощью SoapUI — JDBC request.

Проверка логов шины данных тоже включается в процесс тестирования микросервиса. Микросервис должен принять ответ от ядра, сформировать ответ для шины в нужном формате и отправить его в шину по соответствующему протоколу. Шина логирует входящие сообщения от сервисов и делает запись в соответствующий лог. На данном этапе проверяется состав полей ответа, соответствие с ТЗ заказчика.
Замечание. При end-2-end тестировании особое значение уделяется проверкам по составу входящих и исходящих сообщений в шину данных. Состав, наименования и структура json и xml полей, соответствие типов данных и т.д. Если типы данных или имена полей не согласуются, то мы получает 100% вероятность дефекта при записи в БД или при обработке документа соответствующим коннектором или микросервисом, как в системе приемнике, так и в системе-источнике.
Вывод
Антифрод-система в банках сейчас является одним из важнейших модулей в инфраструктуре и некорректная работа данной системы может сильно повлиять на надежность и безопасность обслуживания. Тестирование данной системы также имеет высокий приоритет для департамента финансового мониторинга. Спецификой работы над таким проектом является глубокое погружение команды тестирования в предметную область банковских операций. Взаимодействие с множеством сотрудников различных систем-источников требуют высоких аналитических навыков, ведь время погружение в задачу и предметную область диктуется релизными рамками.
- тестирование
- интеграционное тестирование
- банки
- корпорации
- Тестирование IT-систем
- Тестирование веб-сервисов
Автоматизированное тестирование баз данных в Java с помощью JdbcTemplate
В преддверии старта курса «Java QA Automation Engineer» подготовили перевод полезного материала.
Также приглашаем поучаствовать в открытом вебинаре на тему «HTTP. Postman, Newman, Fiddler (Charles), curl, SOAP. SoapUI». На этом занятии участники вместе с экспертом разберут, какие бываю API и каким способом можно проверить, что backend отдает ожидаемые данные, а также познакомятся с основными инструментами для тестирования.

Бывает, и достаточно часто, что во время автоматизированного тестирования наши тесты должны взаимодействовать с базами данных. Иногда нам нужно установить какие-либо тестовые данные. В других случаях нам нужно совершать запросы в базу данных, чтобы получить те самые тестовые данные. И давайте не будем забывать об очистке данных, которые мы использовали и которые больше нам не нужны. В этой статье я покажу, как вы можете использовать класс Spring JdbcTemplate для упрощения работы с базой данных MySQL из ваших автоматизированных тестов на Java.
Вам также следует взглянуть на это замечательное дополнение к базе данных MySQL, созданное сообществом для библиотеки дополнений TestProject, позволяющее расширить возможности тестирования с помощью предварительно созданных автоматизированных экшенов, которые вы можете мгновенно внедрить в ваши написанные и закодированные тесты.
Требования
Прежде чем мы сможем начать наши взаимодействия с базой данных, нам нужно кое-что настроить. А именно зависимости, которые нам нужно добавить в наш проект. В моем случае, поскольку я использую Maven, зависимости, которые мне нужно добавить в файл pom.xml , будут выглядеть следующим образом:
mysql mysql-connector-java 8.0.23
Первая зависимость, которую мы здесь видим, — это зависимость из пакета Spring. Здесь мы можем найти класс JdbcTemplate , который мы будем использовать для коммуникации с базой данных. Этот класс содержит полезные методы для обновления или получения данных из базы данных. Вторая зависимость требуется для связи с инстансом MySQL.
Примечание: эти зависимости имеют последнюю доступную на момент написания статьи версию (какую вы можете увидеть в репозитории Maven). Версия mysql-connector-java должна быть синхронизирована с версией инстанса MySQL, на котором работает ваша база данных. В моем случае, мой сервер MySQL имеет версию > 8, поэтому версия моего «mysql-connector-java» также выше чем 8.
Подключение к базе данных
После того как мы разобрались с зависимостями, мы можем установить связь с нашей базой данных. Мы могли бы написать код, необходимый для этой операции, в нашем тесте. Однако нам обязательно понадобится этот код и в других тестовых классах. Следовательно, этот код может быть написан либо в специальном классе для работы с базой данных, либо в базовом классе, расширяемом вашими тестами. Независимо от того, какой вариант вы выберете, соединение может быть установлено с помощью подобного метода:
public DataSource mysqlDataSource() < DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://dbURL:portNumber/nameOfDB?useSSL=false"); dataSource.setUsername("username"); dataSource.setPassword("password"); return dataSource; >
Первое, на что нам нужно обратить внимание, это то, что этот метод возвращает DataSource . Это необходимо для инициализации класса JdbcTemplate , который мы будем использовать в наших тестах, поскольку он хранит соединение с базой данных.
Затем в качестве имени класса драйвера в этом примере я использовал значение « com.mysql.cj.jdbc.Driver ». Опять же это требуется для установки соединения, и в некоторых случаях в более старых версиях зависимостей коннектора MySQL вместо него следует использовать « com.mysql.jdbc.Driver ». Если вы используете неправильное имя, вы получите соответствующее предупреждение при попытке подключения к базе данных.
Вам нужно будет указать расположение базы данных в методе setUrl . Он состоит из URL-адреса, порта и имени базы данных. И, конечно же, вам необходимо указать имя пользователя и пароль для подключения к базе данных, с помощью методов setUsername и setPassword .
Теперь, когда соединение установлено, нам нужно инициализировать класс JdbcTemplate . Мы можем объявить переменную этого типа в нашем тестовом классе:
private JdbcTemplate jdbcTemplate;
Затем в методе @BeforeAll мы можем инициализировать эту переменную, предоставив соединение, которое мы установили с базой данных:
jdbcTemplate = new JdbcTemplate(nameOfClass.mysqlDataSource());
На этом настройка завершена, соединение установлено, и мы можем начать обновление (updating) или запрашивание (querying) базы данных.
Update
В классе JdbcTemplate мы можем найти много полезных методов. Один из них, ‘update’, может быть использован для создания и обновления таблиц, добавления в них данных или даже удаления данных. Существует несколько вариантов этого метода (с разными сигнатурами), но тот, который я приведу здесь в качестве примера, принимает один параметр: SQL-запрос в виде String.
Пример
Создадим две новые таблицы: одну с именем ‘meal’ (блюдо) и ‘ingredient’ (ингредиент). В таблице ‘meal’ мы хотим хранить название блюда, присвоенную ему категорию (представляющую, будь то завтрак, обед или ужин) и автоматически сгенерированный id в качестве первичного ключа (primary key). Для создания таблицы напишем в тестовом методе следующий код:
jdbcTemplate.update("create table meal(\n" + " meal_id bigint auto_increment primary key,\n" + " name varchar(50) not null unique,\n" + " category varchar(50) not null\n" + ");");
Когда мы запустим тест, таблица будет создана. Для создания таблицы больше ничего не требуется. Допустим, мы также хотим добавить к этому столу два блюда: фахитас из курицы и энчилада. Сделать это легко — просто передадим требуемый SQL-запрос в метод update следующим образом:
jdbcTemplate.update("insert into meal (name, category) values ('Chicken Fajita', 'lunch');"); jdbcTemplate.update("insert into meal (name, category) values ('Enchilada', 'lunch');");
Как видите, у нас по одному вызову метода update на одну SQL-операцию.
Теперь давайте создадим таблицу под названием ingredient . У нее не будет автоматически сгенерированного первичного ключа. Однако у нее будет внешний ключ (foreign key), соответствующий значению meal_id из таблицы meal . Каждая запись в этой таблице представляет собой ингредиент, соответствующий блюду из таблицы meal . Этот внешний ключ свяжет ингредиент с блюдом. Кроме того, в таблице ingredient есть столбцы для хранения названия ингредиента ( name ), количества ( quantity ) и единицы измерения ( ‘uom’ — unit of measure ) для количества ингредиента.
Для того чтобы создать эту таблицу, а затем добавить к ней внешний ключ, мы снова будем использовать метод update , которому мы передадим соответствующий SQL-запрос:
jdbcTemplate.update("create table ingredient(\n" + " meal_id bigint not null,\n" + " name varchar(50) not null,\n" + " quantity bigint not null,\n" + " uom varchar(50) not null\n" + ");"); jdbcTemplate.update("alter table ingredient add foreign key (meal_id)" + " references meal(meal_id);\n");
Чтобы иметь больше данных для наших следующих примеров, я также добавлю некоторые данные в таблицу ingredient :
jdbcTemplate.update("insert into ingredient (meal_id, name, quantity," + " uom) values ((select meal_id from meal where name = 'Chicken Fajita'), 'chicken', 1, 'kg');\n"); jdbcTemplate.update("insert into ingredient (meal_id, name, quantity, uom) " + "values ((select meal_id from meal where name = 'Chicken Fajita'), 'red pepper', 1, 'piece');\n"); jdbcTemplate.update("insert into ingredient (meal_id, name, quantity, uom) " + "values ((select meal_id from meal where name = 'Chicken Fajita'), 'green pepper', 1, 'piece');\n"); jdbcTemplate.update("insert into ingredient (meal_id, name, quantity, uom) " + "values ((select meal_id from meal where name = 'Chicken Fajita'), 'yellow pepper', 1, 'piece');"); jdbcTemplate.update("insert into ingredient (meal_id, name, quantity," + " uom) " + "values ((select meal_id from meal where name = " + "'Enchilada'), 'chicken', 1, 'kg');\n"); jdbcTemplate.update("insert into ingredient (meal_id, name, quantity," + " uom) " + "values ((select meal_id from meal where name = " + "'Enchilada'), 'cheese', 100, 'grams');\n"); jdbcTemplate.update("insert into ingredient (meal_id, name, quantity," + " uom) " + "values ((select meal_id from meal where name = " + "'Enchilada'), 'tomato', 1, 'piece');\n");
Отлично, у нас есть 2 таблицы с данными, которые мы можем запрашивать. Теперь же мы будем использовать разные методы из класса JdbcTemplate для получения результатов разных типов.
queryForObject — получить одно значение
Если нам нужно запросить из базы данных одно значение, мы можем использовать метод queryForObject . У этого метода также есть несколько вариантов использования, но здесь мы рассмотрим наиболее простой:
jdbcTemplate.queryForObject(String sqlStatement, Class returnType);
При вызове этого метода нам нужно указать, какой тип возвращаемого значения должен иметь запрос ( Class ). Мы могли бы, например, получить значение String (указав String.class ) или целое число (указав Integer.class ).
Пример
Нам нужно запросить базу данных, чтобы получить значение meal_id из таблицы meal для блюда ‘Chicken Fajita’. Нам нужно сохранить этот результат в переменной с типом int :
int meal_id from meal where name='Chicken Fajita';", Integer.class);
Здесь вы можете видеть, что тип возвращаемого значения запроса указан как Integer.class , поэтому результат сохраняется в переменной с типом int . Допустим, в тесте мы также хотим вывести в консоль результат этого запроса:
System.out.println("Meal id for Chicken Fajita java">Meal id for Chicken Fajita = 1
queryForMap — получить строку
Теперь предположим, что вы хотите получить целую строку из таблицы. Или части строки. Вы можете сделать это с помощью метода queryForMap , которому вы передаете необходимый SQL-запрос:
jdbcTemplate.queryForMap(String sqlStatement);
Результат этого запроса можно сохранить в переменной типа Map . Ключи map будут соответствовать имени каждого столбца, которому принадлежит элемент строки. Значение будет соответствовать фактическому значению из строки, соответствующей этому столбцу.
Пример
Мы хотим извлечь все данные о блюде с id 1 из таблицы ‘meal’, сохранить их в переменной и вывести результат в консоль. Это легко можно сделать следующим образом:
Map entireRowAsMap = jdbcTemplate.queryForMap("select * from meal where meal_id = 1"); System.out.println("All details of meal with id 1 java">All details of meal with id 1 =
queryForList — получить столбец
Когда вам нужно получить либо все значения, либо часть значений из конкретного столбца, вы можете использовать метод queryForList . В этом варианте использования я покажу на примере, что для результирующих элементов требуется SQL-запрос и тип возвращаемого значения. Речь идет о типе элементов, которые вы будете сохранять в список (List) Java. Например, если все элементы, которые вы извлекаете с помощью этого запроса, являются целыми числами, типом возврата будет Integer.class . Основной пример использования метода выглядит так:
jdbcTemplate.queryForList(String sqlStatement, Class returnType);
Пример
Мы хотим сохранить в список Java все названия ингредиентов, которые есть в таблице ‘ingredient’. Мы также хотим вывести эти значения в консоль. Этого можно добиться следующим образом:
List queryForColumn = jdbcTemplate.queryForList("select " + "distinct name from ingredient", String.class); System.out.println("All available ingredients java">All available ingredients = [chicken, red pepper, green pepper, yellow pepper, cheese, tomato]
queryForList — получение списка строк
Другой вариант использования метода queryForList — получение сразу нескольких строк. В этом случае единственный параметр, требуемый при вызове этого метода, — это SQL-запрос, который собирает данные. Типом возврата будет список элементов типа map , где каждая map будет иметь ключ с типом String и соответствующее значение с типом Object . Этот метод выглядит так:
jdbcTemplate.queryForList(String sqlStatement);
Пример
Выберите все значения из таблицы ‘meal’, сохраните и выведите их в консоль.
List> severalRowsAsListOfMaps = jdbcTemplate.queryForList("select * from meal;"); System.out.println("All available meals java">All available meals = [, ]
Передача параметров запросам
В некоторых случаях SQL-запросы нуждаются в передаче параметра для замены захардкоженного значения из запроса. Например, вы можете захотеть выполнить тот же запрос для поиска строки в базе данных на основе ее id . Но вам может потребоваться передать id в тест через DataProvider . Следовательно, при каждом запуске метода для выполнения запроса у вас будет другое значение id .
В этом случае для любого запроса, который вы хотите выполнить, вместо указания явного значения вы проставляете символ ? . Это нужно сделать внутри SQL-запроса.
В тестовом методе нам нужно выяснить, сколько строк существует в таблице ingredient с именем, которое предоставляется в виде параметра. Результат этого запроса будет сохранен в переменной типа int и будет выведен в консоль. Этого можно добиться следующим образом:
Integer howManyUsages = jdbcTemplate.queryForObject("select count(*) " + "from ingredient where name=?", Integer.class, ingredientToLookFor); System.out.println("How many time does the ingredient passed as " + "parameter appear in the DB " + " java">How many time does the ingredient passed as parameter appear in the DB = 2
Извлечение данных в объект Java
Помните мою статью об использовании объектов Java для моделирования данных, извлеченных из БД? Вы можете легко использовать JdbcTemplate для запроса базы данных и извлечения результата непосредственно в объект (Object). Все, что вам нужно для выполнения этой задачи, — это объект Java для моделирования данных; класс преобразователя строк ( row mapper ), который сопоставляет столбец из базы данных со свойствами объекта; запрос, который извлекает данные в объект с помощью преобразователя строк.
Пример
Допустим, нам нужно смоделировать данные, соответствующие ингредиенту, название которого содержит текст ‘yellow’, в объект ингредиента ( Ingredient Object ). Это означает, что мы хотим, чтобы объект имел те же свойства, что и ингредиент в таблице. Мы хотим сопоставить каждый столбец со свойством. Поэтому мы создадим объект Java под названием Ingredient. Его свойства будут следующими:
public int meal_id; public String name; public int quantity; public String uom;
Рекомендуется синхронизировать имена свойств с именами столбцов базы данных. Таким образом, вы можете легко идентифицировать каждое свойство. Поскольку это объект, нам потребуется создать методы equals , hashCode и toString . Пока я пропущу эту часть.
Вместо этого я покажу кое-что еще, что вам понадобиться, а именно сеттеры для каждого свойства. Вы можете легко автоматически сгенерировать их в IntelliJ, используя в редакторе сочетание клавиш Alt+Insert. Они будут выглядеть следующим образом:
public void setMeal_id ( int meal_id) < this.meal_id = meal_id; >public void setName (String name) < this.name = name; >public void setQuantity ( int quantity) < this.quantity = quantity; >public void setUom (String uom)
Вы будете использовать их для отображения данных БД в свойства объекта. И это произойдет внутри класса преобразователя строк, который мы создадим следующим. Тело этого класса выглядит следующим образом:
public class IngredientRowMapper implements RowMapper < @Override public Ingredient mapRow(ResultSet rs, int rowNum) throws SQLException < Ingredient ingredient = new Ingredient(); ingredient.setMeal_id(rs.getInt("meal_id")); ingredient.setName(rs.getString("name")); ingredient.setQuantity(rs.getInt("quantity")); ingredient.setUom(rs.getString("uom")); return ingredient; >>
Как видите, этот класс должен реализовать интерфейс под названием RowMapper . Из-за этого нам потребуется реализовать метод mapRow . И внутри этого метода вы будете сопоставлять каждое свойство объекта со столбцом базы данных, используя сеттеры. Так, например, для свойства quantity метод setQuantity установит значение, извлеченное из строки, имя соответствующего столбца которой тоже quantity .
Создав класс IntegerRowMapper , мы можем выполнить поставленную задачу, используя queryForObject для извлечения данных, соответствующих желтому (‘yellow’) ингредиенту:
Ingredient ingredient = jdbcTemplate.queryForObject("select * from " + "ingredient where name like '%yellow%'", new IngredientRowMapper()); System.out.println("The ingredient object java">The ingredient object = Ingredient
Заключение
Мы рассмотрели несколько способов работы с базами данных из наших автоматизированных тестов: нужно ли нам обновлять их или просто извлекать данные — в классе JdbcTemplate есть множество методов, которые могут нам помочь с этим. Вы можете выбрать, какой из них использовать, в зависимости от того, что должен возвращать ваш SQL-запрос.