Вызов хранимой процедуры Java MyBatis с параметрами OUT - PullRequest
5 голосов
/ 09 февраля 2012

Первый вопрос: Я пытаюсь вернуть один параметр 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 ]

7 голосов
/ 10 февраля 2012

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

err, sorta.Mapper не будет return выходных параметров, но вы можете заставить Mybatis установить их на объект параметра или поместить их в карту, например this .

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

<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>

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

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

Этодовольно трудно объяснить, это имеет смысл?

5 голосов
/ 30 апреля 2013

Используя 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

...