7

最初の質問: 注釈付きの結果セットではなく、1 つの 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);

すべての「保存」手順からメッセージを返しているため、ユーザーに応答を返すことができます:「ユーザーは正常に保存されました」、「ユーザーの保存中にエラーが発生しました」、「このユーザーを保存する権限がありません」など。結果セットを返すことで問題が解決することはわかっていますが、すべての手順を変更したくないだけです!

2 番目の質問:複数の OUT パラメータから入力された「SaveProcedureResponse」を返すことは可能ですか? 例えば:

@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);

Bean は次のようになります。

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

ありがとう!

4

2 に答える 2

9

最初の質問:注釈付きの結果セットではなく、1 つの OUT パラメータを返そうとしています。まず、それは可能ですか?もしそうなら、どうやってこれを行うでしょうか?

エラー、ちょっと。Mapper はreturnパラメーターを出力しませんが、Mybatis を取得してパラメーター オブジェクトに設定したり、このようにマップに配置したりできます。

したがって、すべてのフィールドのゲッターとセッターを持つ単純な 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();

ちょっと説明が難しいですが、意味はありますか?

于 2012-02-10T03:04:52.110 に答える
7

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

于 2013-04-30T17:15:41.010 に答える