ResultMapとResultTypeの違い

最初のように習慣を身につけてから見てください!!!

2つの違いは、主に戻り値の型にあります。

mybatisで返される可能性のあるデータ型は、主に次の2つです。

  • 単一のコレクション-ResultType、ResultMap

  • 複数のコレクション-ResultMap

では、どのような種類のデータを単一セットと呼び、どのような種類のデータを複数セットと呼びますか?次の2つの図から理解できます。

シングルコレクション

ここに画像の説明を挿入

複数のセット

ここに画像の説明を挿入

上記の2枚の写真を読んだ後、基本的に誰もがそれらの違いを知ることができますが、2枚の具体的な使用シナリオは何ですか?

2つの例を挙げましょう

当時获取所有用户的数据は明らかに、ユーザーに情報を提供するだけで、追加のデータを取得する必要はありません。

しかし进行用户的角色校验、やがて、ユーザーに関する情報を取得するだけでなく、次にユーザーの役割も取得する必要があることは明らかです。明らかに、返されたデータにはユーザー情報だけでなく、データをカプセル化する必要があります。上記の複数のコレクション役割の検証を容易にするため。

上記の概念を理解した後、誰もが基本的に2つの違いを理解しますが、誰もがもう一度質問する必要があります。ResultMapは単一のコレクションと複数のコレクションの両方に使用できるとおっしゃっていましたが、すべてを使用しないのはなぜですか? ResultMap?ResultTypeを使用するのはどうですか?

これは主にResultType虽然只针对单个集合、ですが、彼はですが可以直接调用我们已经编写好的实体类、ResultMapが異なる不管如何都需要我们进行自定义ため、主に複数のコレクションの場合に使用され、ResultTypeは単一のコレクションの場合にも使用されます。

このように、基本的には誰もが両者の違いを理解できるので、違いを理解した上で、使い方を詳しく説明します。

  • ResultType

ResultTypeの使用は比較的簡単です。前述のように、エンティティクラスを直接呼び出すことができるため、基本的にはエンティティクラスの相対パスを直接コピーするだけです。これが栗です。

<select id="selectAll" resultType="com.auguigu.gmall.bean.PmsProductInfo">
select * from pms_product_info
</select>

ResultTypeに返す必要のあるエンティティクラスのパスを直接割り当てるだけでよいことがわかります。これは単純で便利です。

  • ResultMap

しかし、ResultMapは比較的面倒で、実際、主なことは需要告诉Mybatis你是将那几个实体类进行多重组合的、残りはmybatisで実行できるようにすることです。または、次の栗を通して、詳細に説明します。

複数セットの2つのエンティティクラス:

  • PmsProductSaleAttr
public class PmsProductSaleAttr implements Serializable {
    
    

    @Id
    @Column
    Integer id;

    @Column
    Integer productId;

    @Column
    Integer saleAttrId;

    @Column
    String saleAttrName;

    @Transient
    List<PmsProductSaleAttrValue> pmsProductSaleAttrValueList;
}
  • PmsProductSaleAttrValue
public class PmsProductSaleAttrValue implements Serializable {
    
    
    @Id
    @Column
    Integer id;

    @Column
    Integer productId;

    @Column
    Integer saleAttrId;

    @Column
    String saleAttrValueName;

    @Transient
    Integer isChecked;

}

次に、mapper.xmlファイルで定義したコードを見てみましょう。

<select id="selectspuSaleAttrListCheckBySku" resultMap="selectspuSaleAttrListCheckBySkuMap">
        SELECT
            sa.id as sa_id,
            sav.id as sav_id,
            sa.*,
            sav.*,
            if(ssav.sku_id,1,0) as isChecked
        FROM
            pms_product_sale_attr sa
                INNER JOIN pms_product_sale_attr_value sav ON sa.product_id = sav.product_id
                AND sa.sale_attr_id = sav.sale_attr_id
                AND sa.product_id = #{
    
    productId}
                LEFT JOIN pms_sku_sale_attr_value ssav ON sav.id = ssav.sale_attr_value_id
                AND ssav.sku_id = #{
    
    skuId}
                ORDER BY sav.id
    </select>
    <resultMap id="selectspuSaleAttrListCheckBySkuMap" type="com.auguigu.gmall.bean.PmsProductSaleAttr" autoMapping="true">
        <result column="sa_id" property="id"></result>
        <collection property="pmsProductSaleAttrValueList" ofType="com.auguigu.gmall.bean.PmsProductSaleAttrValue" autoMapping="true">
            <result column="sav_id" property="id"></result>
        </collection>
    </resultMap>

コードを分析する前に、SQLステートメントの実行後に取得するデータを見てみましょう。

ここに画像の説明を挿入

取得したデータ内のいくつかのフィールド名が繰り返されていることがわかります。これにより、mybatisの照合が困難になるため、mybatisに照合方法を指示することに重点を置いています。

まず、ResultMapに以下で定義したResultMapの名前を入力し、次にこのResultMapの定義方法に焦点を当てます。

まず、ResultMapパーツを最初に見てから、コレクションを見てみましょう。

<resultMap id="selectspuSaleAttrListCheckBySkuMap" type="com.auguigu.gmall.bean.PmsProductSaleAttr" autoMapping="true">
        <result column="sa_id" property="id"></result>
</resultMap>

最初にResultMapの名前、つまりidを定義する必要があります。次に、ResultMapのタイプを定義する必要があります。ここで、typeは複数のコレクションの最も外側のエンティティオブジェクトであり、次に、の主キーを定義する必要があります。エンティティオブジェクト。、Columnは、定義した戻りデータのフィールド名を参照し、propertyは、エンティティクラスで定義した主キーを参照します。残りのフィールドは、autoMapping = trueを介してmybatisによって自動的に処理されます。

<collection property="pmsProductSaleAttrValueList" ofType="com.auguigu.gmall.bean.PmsProductSaleAttrValue" autoMapping="true">
            <result column="sav_id" property="id"></result>
</collection>

ResultMapがどのように定義されているかを理解すると、コレクションは比較的単純に見えます。ここでは、コレクション内のプロパティのみを確認する必要があります。これは、最も外側のエンティティクラスで定義されている次のレベルのコレクションのオブジェクトです。名前(図を参照)未満:

ここに画像の説明を挿入
2つ目は、ここの型です。ここの型は、上記のResultMapと同じではないことがわかります。それでも、typeまたはoftypeであり、複数のコレクションの概念をより表現します。

このようにして、ResultMapオブジェクトが定義されます。

コードワードは簡単ではありません。役立つ場合は、私の公式アカウントをフォローしてください。新規参入者はあなたのサポートが必要です。
ここに画像の説明を挿入
クリックして表示しないでください。クリックして表示してください。クリックして表示してください

おすすめ

転載: blog.csdn.net/lovely__RR/article/details/110133718