Посмотрел несколько вариантов, наиболее симпатичным (что, впрочем, предсказуемо) оказался вариант и использованием спрингового SimpleJdbcCall.
Итак, есть такая табличка - разумеется, что здесь всё упрощено насколько это можно - и даже чуть более
CREATE TABLE BOOK (
ID INTEGER NOT NULL PRIMARY KEY,
NAME VARCHAR2(20))
Есть такая вот хранимая процедура
PROCEDURE GET_BOOKS_BY_NAME (book_cursor OUT SYS_REFCURSOR, name_template IN VARCHAR2)
IS
BEGIN
OPEN book_cursor FOR
SELECT b.ID as ID, b.NAME as NAME
FROM BOOK b
WHERE b.NAME LIKE name_template
ORDER BY ID;
END GET_BOOKS_BY_NAME;
Осталась самая малость - получить от этой процедуры содержимое курсора book_cursor.
Для начала, понадобится получить экземпляр SimpleJdbcCall. Его можно создать руками, можно прописать в контексте спринга - по вкусу.
Для представления данных удобно создать отдельный DTO
public class BookItem {
private Integer id;
private String name;
public BookItem() {}
// getters и setters опущены
}
На экземпляры этого класса будут отображены данные из получаемого курсора.
А теперь собираем всё вместе и получаем данные
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("app-config.xml");
SimpleJdbcCall simpleJdbcCall = context.getBean("simpleJdbcCall", SimpleJdbcCall.class);
// Этот экземпляр отвечает за отображение набора данных, полученных из
// базы данных в курсоре, на список объектов
RowMapper
// Указывается имя вызываемой хранимой процедуры
simpleJdbcCall.withProcedureName("GET_BOOKS_BY_NAME");
// Связывается курсор, получаемый из хранимой процедуры, с отображателем
// данных
simpleJdbcCall.returningResultSet("BOOK_CURSOR", rowMapper);
// Задаются входные параметры для хранимой процедуры
SqlParameterSource params = new MapSqlParameterSource().addValue("NAME_TEMPLATE", "NEW%");
// Теперь производится непосредственный вызов хранимой процедуры.
// В возвращаемый в результате вызова map помещается имя курсора
// (параметр типа String) и сами полученные данные в виде ArrayList.
// Для того, чтобы эти данные из ArrayList разобрать, и используется
// rowMapper
Map
// При этом вызове производится отображение полученных данных на тип,
// указанный в параметре rowMapper
@SuppressWarnings("unchecked")
List
// А теперь просто работаем с тем, что получили от БД
System.out.println("Получено записей: " + resultList.size());
for (BookItem item : resultList) {
System.out.println(item);
}
}
Вот и всё.
Комментариев нет:
Отправить комментарий