[MyBatis] カスタム resultMap 3 つのマッピング関係

目次

1. 1対1マッピング(One-to-One)

1.1 テーブルの関係

1.2 resultMap セットのカスタム マッピング 

2 つの 1 対多マッピング (One-to-Many)

2.1 エンティティの作成

2.2 マッピング関係のカスケード処理

2.3 SQLの定義

2.4 OrderMapperインターフェース

2.5 ビジネスロジック層の作成

2.6 Junit テスト

3. 多対多のマッピング (多対多)

3.1 テーブルの関係

3.2 エンティティの作成

3.3 マッピング関係の処理と SQL の定義

3.4 HBookMapper インターフェイス

3.5 ビジネスロジック層の作成

3.6 Junit テスト


1. 1対1マッピング(One-to-One)

1.1 テーブルの関係

         1 対 1 マッピングとは、1 つのオブジェクトが別のオブジェクトと 1 対 1 の関係を持つことです。たとえば、ユーザー (User) とアドレス (Address) の関係です。次のテーブル構造があるとします。

user 表:

id (int)
name (varchar)
address_id (int)

アドレステーブル:

id (int)
street (varchar)
city (varchar)

まず、User エンティティ クラスと Address エンティティ クラスを作成します。

ユーザー.java

public class User {
    private int id;
    private String name;
    private Address address;
    // getters and setters
}

アドレス.java

public class Address {
    private int id;
    private String street;
    private String city;
    // getters and setters
}

次に、1 対 1 マッピングの resultMap を作成します。

1.2 resultMap セットのカスタム マッピング 

ユーザーマッパー.xml

<resultMap id="UserAddressResultMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    //一对一关系使用association
    <association property="address" javaType="Address">
        <id property="id" column="address_id"/>
        <result property="street" column="street"/>
        <result property="city" column="city"/>
    </association>
</resultMap>

属性:

  • id: カスタム マッピングの一意の識別子を示します。
  • type: クエリされたデータにマップされるエンティティ クラスのタイプ

サブタブ:

  • id:主キーのマッピング関係を設定します
  • 結果: 共通フィールドのマッピング関係を設定します
  • association : 多対 1 のマッピング関係を設定します
  • コレクション: 1 対多のマッピング関係を設定する

サブタグの属性:

  • property: マッピング関係のエンティティクラスに属性名を設定します
  • 列: マッピング関係のテーブルのフィールド名を設定します

最後に、この resultMap を使用するクエリ メソッドを作成します。 

ユーザーマッパー.xml

<select id="findUserWithAddress" resultMap="UserAddressResultMap">
    SELECT u.id, u.name, a.id as address_id, a.street, a.city
    FROM user u
    INNER JOIN address a ON u.address_id = a.id
    WHERE u.id = #{id}
</select>

        最後に、インターフェイス findUserWithAddress メソッドのテストを実装します。上記の簡単なケースを通じて、カスタム リレーションシップ マッピングについてはすでに理解できたと思います。実際の開発ではデータやテーブルがより複雑になることがよくありますが、高度な使用方法については、次の例を参照してください。

2 つの 1 対多マッピング (One-to-Many)

        1 対多のマッピングは、オブジェクトが多くのオブジェクトと 1 対多の関係を持つことを意味します。たとえば、注文 (Oeder) と注文の詳細 (OrderItem) の間の関係です。次のテーブル構造があるとします。

2.1 エンティティの作成

mybatis リバース エンジニアリング(generatorConfig.xml) を使用してモデル層コードを生成します。

   创建 OrderVoOrder これは、クラス  を継承し、追加のプロパティを追加した値オブジェクト (Value Object) です orderItemsこのクラスは、アプリケーションのさまざまな層間、特にプレゼンテーション層とビジネス ロジック層の間でデータを受け渡すために使用されます。この例では、OrderVo クラスは注文とそれに関連する品目を表すために使用されます。

package com.ycxw.vo;

import com.ycxw.model.Order;
import com.ycxw.model.OrderItem;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-26 16:30
 */
@Data
public class OrderVo extends Order {
    private List<OrderItem> orderItems = new ArrayList<>();
}

2.2 マッピング関係のカスケード処理

    <resultMap id="OrderVoMap" type="com.ycxw.vo.OrderVo">
        <result column="order_id" property="orderId"></result>
        <result column="order_no" property="orderNo"></result>
        //多关系使用collection
        <collection property="orderItems" ofType="com.ycxw.model.OrderItem">
            <result column="order_item_id" property="orderItemId"></result>
            <result column="product_id" property="productId"></result>
            <result column="quantity" property="quantity"></result>
            <result column="oid" property="oid"></result>
        </collection>
    </resultMap>

2.3 SQLの定義

    <select id="SelectByOid" resultMap="OrderVoMap" parameterType="java.lang.Integer">
        SELECT *
        FROM t_hibernate_order o,
             t_hibernate_order_item oi
        WHERE o.order_id = oi.oid
          AND o.order_id = #{oid}
    </select>

2.4 OrderMapperインターフェース

package com.ycxw.mapper;

import com.ycxw.model.Order;
import com.ycxw.vo.OrderVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface OrderMapper {

    OrderVo SelectByOid(@Param("oid") Integer oid);
}

2.5 ビジネスロジック層の作成

OrderItmeBizインターフェース
package com.ycxw.biz;

import com.ycxw.vo.OrderItemVo;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-26 21:48
 */
public interface OrderItmeBiz {
    OrderItemVo SelectByOitemId(Integer oiid);
}
OrderBizImpl インターフェース実装クラス
package com.ycxw.biz.impl;

import com.ycxw.biz.OrderBiz;
import com.ycxw.mapper.OrderMapper;
import com.ycxw.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-26 16:46
 */
@Service
public class OrderBizImpl implements OrderBiz {
    @Autowired
    private OrderMapper orderMapper;

    @Override
    public OrderVo SelectByOid(Integer oid) {
        return orderMapper.SelectByOid(oid);
    }
}

2.6 Junit テスト

package com.ycxw.biz.impl;

import com.ycxw.biz.OrderBiz;
import com.ycxw.vo.OrderVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-26 16:48
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})
public class OrderBizImplTest {
    @Autowired
    private OrderBiz orderBiz;


    @Test
    public void selectByOid() {
        OrderVo orderVo = orderBiz.SelectByOid(8);
        //获取订单
        System.out.println(orderVo);
        //获取订单项信息
        orderVo.getOrderItems().forEach(System.out::println);
    }

}

操作結果:

3. 多対多のマッピング (多対多)

3.1 テーブルの関係

        多対多のマッピングとは、複数のオブジェクトが複数のオブジェクトと多対多の関係を持つことです。テーブル間の多対多の関係はもう少し複雑で、以下を表す中間テーブルが必要です。

        中間テーブルには 3 つのフィールドがあり、そのうちの 2 つは各パーティの主キーを指す外部キーとして使用されるため、多対多の関係は中間テーブルを通じて表現され、1 対多の関係は次のように表現できます。あるテーブルと別の中間テーブルを組み合わせて表現します。

 

 例:書籍 ID に従って、関連する属性カテゴリを検索します。

3.2 エンティティの作成

mybatis リバース エンジニアリング(generatorConfig.xml)を使用してモデル層コードを生成します。

 

HBookVo値オブジェクト(Valueオブジェクト)の作成

package com.ycxw.vo;

import com.ycxw.model.BookCategory;
import com.ycxw.model.HBook;
import lombok.Data;

import java.util.List;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-27 21:03
 */
@Data
public class HBookVo extends HBook {
    private List<BookCategory> bookc = new ArrayList<>();
}

3.3 マッピング関係の処理と SQL の定義

  <resultMap id="HBookVoMap" type="com.ycxw.vo.HBookVo" >
    <result column="book_id" property="bookId"></result>
    <result column="book_name" property="bookName"></result>
    <result column="price" property="price"></result>
    <collection property="bookc" ofType="com.ycxw.model.Category">
      <result column="category_id" property="categoryId"></result>
      <result column="category_name" property="categoryName"></result>
    </collection>
  </resultMap>

  <!--根据书籍的id查询书籍的信息及所属属性-->
  <select id="selectByBookId" resultMap="HBookVoMap" parameterType="java.lang.Integer">
    SELECT
      *
    FROM
      t_hibernate_book b,
      t_hibernate_category c,
      t_hibernate_book_category bc
    WHERE
      b.book_id = bc.bid
      AND c.category_id = bc.bcid
      AND b.book_id = #{bid}
  </select>

3.4 HBookMapper インターフェイス

HBookVo selectByBookId(@Param("bid") Integer bid);

3.5 ビジネスロジック層の作成

HBookBizインターフェース
package com.ycxw.biz;

import com.ycxw.vo.HBookVo;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-29 12:47
 */
public interface HBookBiz {
    HBookVo selectByBookId(Integer bid);
}
HBookBizImpl インターフェース実装クラス
package com.ycxw.biz.impl;

import com.ycxw.biz.HBookBiz;
import com.ycxw.mapper.HBookMapper;
import com.ycxw.vo.HBookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-29 12:48
 */
@Service
public class HBookBizImpl implements HBookBiz {
    @Autowired
    private HBookMapper hBookMapper;
    @Override
    public HBookVo selectByBookId(Integer bid) {
        return hBookMapper.selectByBookId(bid);
    }
}

3.6 Junit テスト

package com.ycxw.biz.impl;

import com.ycxw.biz.HBookBiz;
import com.ycxw.vo.HBookVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-26 16:48
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})
public class OrderBizImplTest {
    @Autowired
    private HBookBiz hBookBiz;


    @Test
    public void selectByBookId(){
        HBookVo hBookVo = hBookBiz.selectByBookId(22);
        //数据所有信息
        System.out.println(hBookVo);
        //书籍有关的类别
        System.out.println(hBookVo.getBookc());
    }
}

 またその逆も同様です。カテゴリ ID に基づいて書籍情報を検索します。

 <resultMap id="CategotyVoMap" type="com.ycxw.vo.CategoryVo">
    <result column="category_id" property="categoryId"></result>
    <result column="category_name" property="categoryName"></result>
    <collection property="books" ofType="com.ycxw.model.HBook">
      <result column="book_id" property="bookId"></result>
      <result column="book_name" property="bookName"></result>
      <result column="price" property="price"></result>
    </collection>
  </resultMap>

  <select id="selectCategoryId" resultMap="CategotyVoMap" parameterType="java.lang.Integer">
    SELECT
      *
    FROM
      t_hibernate_book b,
      t_hibernate_category c,
      t_hibernate_book_category bc
    WHERE
      b.book_id = bc.bid
      AND c.category_id = bc.bcid
      AND c.category_id = #{cid}
  </select>

テスト走行:

おすすめ

転載: blog.csdn.net/Justw320/article/details/132512497