Вызов хранимой процедуры Java MyBatis с параметрами OUT

Первый вопрос: я пытаюсь вернуть один параметр OUT, а не набор результатов с аннотациями. Во-первых, возможно ли это? Если это так, как можно это сделать?

MyBatis: 3.0.6

База данных: SQL Server 2008

Вот пример синтаксиса моего вызова метода в UserDAO:

@Select(value= "{ CALL saveUser( "
        + "#{userId, mode=IN, jdbcType=INTEGER},"
        + "#{firstname, mode=IN, jdbcType=VARCHAR},"
        + "#{lastname, mode=IN, jdbcType=VARCHAR},"
        + "#{message, mode=OUT, jdbcType=VARCHAR}"
        + ")}")
@Options(statementType=StatementType.CALLABLE)
public String saveUser(
        @Param("userId") int userId,
        @Param("firstname") String firstname,
        @Param("lastname") String lastname);

Я возвращаю сообщение от всех моих процедур сохранения, и поэтому я могу вернуть ответ пользователю: "Пользователь успешно сохранен","Ошибка при сохранении пользователя","У вас нет разрешения на сохранение этого пользователя" и т. Д. Я знаю, что возвращение набора результатов решит проблему, просто я не хочу менять все мои процедуры!

Второй вопрос: возможно ли вернуть "SaveProcedureResponse", заполненный несколькими параметрами OUT? Например:

@Select(value= "{ CALL saveUser( "
        + "#{userId, mode=IN, jdbcType=INTEGER},"
        + "#{firstname, mode=IN, jdbcType=VARCHAR},"
        + "#{lastname, mode=IN, jdbcType=VARCHAR},"
        + "#{message, mode=OUT, jdbcType=VARCHAR},"
        + "#{status, mode=OUT, jdbcType=VARCHAR},"
        + "#{returnCode, mode=OUT, jdbcType=INTEGER}"
        + ")}")
@Options(statementType=StatementType.CALLABLE)
public SaveProcedureResponse saveUser(
        @Param("userId") int userId,
        @Param("firstname") String firstname,
        @Param("lastname") String lastname);

Где боб выглядит так:

public class SaveProcedureResponse {
    private String message;
    private String status;
    private int returnCode;

    public SaveProcedureResponse(String message, String status, int returnCode) {
        this.message = message;
        this.status = status;
        this.returnCode = returnCode;
    }
}

Спасибо!

2 ответа

Первый вопрос: я пытаюсь вернуть один параметр OUT, а не набор результатов с аннотациями. Во-первых, возможно ли это? Если это так, как можно это сделать?

эээ, сорта. Картограф не будет return выходные параметры, но вы можете заставить Mybatis установить их на объект параметра или поместить их в карту, подобную этой.

Поэтому дан простой Java-объект с геттерами и сеттерами для всех полей. После вызова маппера выходные параметры будут установлены на объекте.

<update id="someProcedure" statementType="CALLABLE">
    {call some procedure(
            #{someInParamA, mode=IN},
            #{someInParamB, jdbcType=ARRAY, mode=IN},
            #{someOutParamA, javaType=Boolean, jdbcType=NUMERIC, mode=OUT },
            #{someOutParamB, javaType=Object, jdbcType=ARRAY, jdbcTypeName=SOMEJDBCTYPE, mode=OUT})}
</update>

Таким образом, чтобы получить параметры, это будет выглядеть примерно так.

mapper.getSomeProcedure(someBean);
//out params populated on the object passed to the mapper :)
String outA = bean.getSomeOutParamA();

Это сложно объяснить, имеет ли это смысл?

Используя аннотации MyBatis-Spring, напишите свой код следующим образом.

public interface ProductMapper
{
    @Select("exec Pup_ProductSearch_Sel #{searchString}, #{pageNum}, #{pageSize}, #{totalRows,mode=OUT,jdbcType=NUMERIC}")
    @Options(statementType = StatementType.CALLABLE)
    public List<Map<String, Object>> productSearch(ProductSearchParameters params);


    public class ProductSearchParameters
    {
        private String searchString = null;
        private Integer pageNum = 1;
        private Integer pageSize = 5;
        private Integer totalRows = -1;

        // Accessors go here...
    }
}

Параметры IN заполняются нами в коде вызова. Параметры OUT заполняются уровнем доступа к данным и присутствуют в объекте params после вызова преобразователя.

@Service
public class TestService
{
    @Resource
    private ProductMapper mapper;


    public void run()
    {
        final ProductMapper.ProductSearchParameters params = new ProductMapper.ProductSearchParameters();
        params.setSearchString("book"); // IN parameter
        final List<Map<String, Object>> results = mapper.productSearch(params);

        for(final Map<String, Object> product : results)
        {
            System.out.println(product.get("title"));
        }

        System.out.println("Total results: " + params.getTotalRows()); // OUT parameter
    }
}

Вдохновленный этим постом: http://ibatis.10938.n7.nabble.com/IBatis-3-0-beta-10-annotations-stored-procedures-td7806.html

Другие вопросы по тегам