1

春の統合で mybatis を使用する場合、メソッドのパラメーターを変換する最良の方法は何かを知りたいと思いました。変換の理由には、さまざまな理由が考えられます。たとえば、mybatis が java.util.Set を param 入力として処理できないなどです。

具体的には、次のような DAO インターフェイス メソッドがあるとします。

List<Foo> getFooForUniqueIds(Set<Long> ids);

対応する XML は次のとおりです。

<select id="getFooForUniqueIds" parameterType="java.util.Set" resultMap="foo">
    SELECT f.*
      FROM foo f
     WHERE f.id IN <foreach collection="list" item="item" separator="," close=")" open="(">
            #{item}
           </foreach>
</select>

をmybatis XML フラグメントが解釈できるに変換する方法が必要Set<Long> idsです。List<Long> idsSqlSessionFactory を直接処理する具体的なクラスを提供できることは理解していますが、Spring 統合が提供する抽象化が好きで、セッションの取得やセッションの終了などの興味深いこと以外について心配する必要はありません。

また、DAO は愚かであるべきであり、おそらく変換はサービス層で行われるべきだと主張する人もいるかもしれません。ただし、この場合の変換は、マッパー フレームワークのニュアンスが原因であり、サービス レイヤーがそれを相殺するために何かを行っているため、正しくないように見えました。

提案をお待ちしております。事前に感謝します。

4

2 に答える 2

1

ここでの特定の例は、@Param を介して (「リスト」であると想定するのではなく) パラメータ名を指定し、そのパラメータ名を XML で使用することによって解決できます。

List<Foo> getFooForUniqueIds(@Param("set") Set<Long> ids);

XMLを次のように

<select id="getFooForUniqueIds" parameterType="java.util.Set" resultMap="foo">
SELECT f.*
  FROM foo f
 WHERE f.id IN <foreach collection="set" item="item" separator="," close=")" open="(">
        #{item}
       </foreach>
</select>

参考: https ://groups.google.com/forum/?fromgroups=#!topic/mybatis-user/BGjvVw1xx_c

于 2013-02-25T05:04:37.303 に答える
0

MyBatis typeHandlers を見ることができます。独自のタイプ ハンドラーを作成し、それを parameterMap で定義します。これはトリックを行うことができます。

MyBatis は、 foreach ステートメントで List および Array 型のみを受け入れます。

List インスタンスまたは Array をパラメーター オブジェクトとして MyBatis に渡すことができます。そうすると、MyBatis は自動的にマップにラップし、名前でキーを設定します。リスト インスタンスは「list」という名前にキー付けされ、配列インスタンスは「array」という名前にキー付けされます。

于 2013-02-14T14:59:58.580 に答える