1、1対1
1 対 1 マッピングとは、あるオブジェクトが別のオブジェクトと 1 対 1 の関係を持つことを意味します。
1.1 テーブルの関係
1 対 1 マッピングは、1 つのオブジェクトが別のオブジェクトと 1 対 1 の関係を持つことを意味します。たとえば、ユーザーとアドレスの関係です。次のテーブル構造があるとします。
ユーザーテーブル:
ID (int)
名前 (varchar)
address_id (int)
アドレステーブル:
ID (int)
ストリート (varchar)
都市 (varchar)
まず、User エンティティ クラスと Address エンティティ クラスを作成します。
ユーザークラス
public class User {
private int id;
private String name;
private Address address;
// getters and setters
}
アドレス.クラス
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: 主キーのマッピング関係を設定します
result: 共通フィールドのマッピング関係を設定しますassociation
: 多対 1 のマッピング関係を設定します collection
: 1 対多のマッピング関係を設定します
サブタグ属性:
property: マッピング関係のエンティティ クラスにプロパティ名を設定します。
column: マッピング関係のテーブルにフィールド名を設定します
。 最後に、この 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 対多のマッピング (1 対多)
1 対多のマッピングは、1 つのオブジェクトが複数のオブジェクトと 1 対多の関係を持つことを意味します。たとえば、注文 (Oeder) と注文の詳細 (OrderItem) の間の関係です。次のテーブル構造があるとします。
2.1 エンティティの作成
mybatis リバース エンジニアリング(generatorConfig.xml) を使用してモデル層コードを生成します。
package com.xzs.model;
import lombok.ToString;
@ToString
public class order {
private Integer orderId;
private String orderNo;
public order(Integer orderId, String orderNo) {
this.orderId = orderId;
this.orderNo = orderNo;
}
public order() {
super();
}
public Integer getOrderId() {
return orderId;
}
public void setOrderId(Integer orderId) {
this.orderId = orderId;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
}
package com.xzs.model;
import lombok.ToString;
@ToString
public class orderItem {
private Integer orderItemId;
private Integer productId;
private Integer quantity;
private Integer oid;
public orderItem(Integer orderItemId, Integer productId, Integer quantity, Integer oid) {
this.orderItemId = orderItemId;
this.productId = productId;
this.quantity = quantity;
this.oid = oid;
}
public orderItem() {
super();
}
public Integer getOrderItemId() {
return orderItemId;
}
public void setOrderItemId(Integer orderItemId) {
this.orderItemId = orderItemId;
}
public Integer getProductId() {
return productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Integer getOid() {
return oid;
}
public void setOid(Integer oid) {
this.oid = oid;
}
}
创建 OrderVo
Order
これは、クラス を継承し、追加のプロパティを追加する値オブジェクトです orderItems
。このクラスは、アプリケーションのさまざまな層間、特にプレゼンテーション層とビジネス ロジック層の間でデータを受け渡すために使用されます。この例では、OrderVo
クラスは注文とそれに関連する品目を表します。
package com.xzs.vo;
import com.xzs.model.Order;
import com.xzs.model.OrderItem;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class OrderVo extends Order {
private List<OrderItem> orderItems = new ArrayList<>();
}
2.2 カスケードモードでのマッピング関係の処理
<resultMap id="OrderVoMap" type="com.xzs.vo.OrderVo">
<result column="order_id" property="orderId"></result>
<result column="order_no" property="orderNo"></result>
//多关系使用collection
<collection property="orderItems" ofType="com.xzs.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.xzs.mapper;
import com.xzs.model.Order;
import com.xzs.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.xzs.biz;
import com.xzs.vo.OrderItemVo;
public interface OrderItmeBiz {
OrderItemVo SelectByOitemId(Integer oid);
}
OrderBizImpl インターフェース実装クラス
package com.xzs.biz.impl;
import com.xzs.biz.OrderBiz;
import com.xzs.mapper.OrderMapper;
import com.xzs.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class OrderBizImpl implements OrderBiz {
@Autowired
private OrderMapper orderMapper;
@Override
public OrderVo SelectByOid(Integer oid) {
return orderMapper.SelectByOid(oid);
}
}
3. 多対多マッピング (多対多)
3.1 テーブルの関係
多対多マッピングとは、複数のオブジェクトと複数のオブジェクト間の多対多の関係を指します。テーブル間の多対多の関係は少し複雑で、それを表す中間テーブルが必要です。
中間テーブルには 3 つのフィールドがあり、そのうち 2 つは各サイドの主キーを指す外部キーとして使用されます。中間テーブルを通じて多対多の関係が表現され、1 対多の関係が表現されます。 1 つのテーブルと別の中間テーブルを結合することによって。
例:書籍 ID に基づいて、関連する属性カテゴリを検索します。
3.2 エンティティの作成
mybatis リバース エンジニアリング(generatorConfig.xml)を使用してモデル層コードを生成します。
package com.xzs.model;
import lombok.ToString;
@ToString
public class HCategory {
private Integer categoryId;
private String categoryName;
public HCategory(Integer categoryId, String categoryName) {
this.categoryId = categoryId;
this.categoryName = categoryName;
}
public HCategory() {
super();
}
public Integer getCategoryId() {
return categoryId;
}
public void setCategoryId(Integer categoryId) {
this.categoryId = categoryId;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
}
package com.xzs.model;
import lombok.ToString;
@ToString
public class HBookCategory {
private Integer bcid;
private Integer bid;
private Integer cid;
public HBookCategory(Integer bcid, Integer bid, Integer cid) {
this.bcid = bcid;
this.bid = bid;
this.cid = cid;
}
public HBookCategory() {
super();
}
public Integer getBcid() {
return bcid;
}
public void setBcid(Integer bcid) {
this.bcid = bcid;
}
public Integer getBid() {
return bid;
}
public void setBid(Integer bid) {
this.bid = bid;
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
}
package com.xzs.model;
import lombok.ToString;
@ToString
public class HBook {
private Integer bookId;
private String bookName;
private Float price;
public HBook(Integer bookId, String bookName, Float price) {
this.bookId = bookId;
this.bookName = bookName;
this.price = price;
}
public HBook() {
super();
}
public Integer getBookId() {
return bookId;
}
public void setBookId(Integer bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
}
HBookVo値オブジェクト(Valueオブジェクト)の作成
package com.xzs.vo;
import com.xzs.model.BookCategory;
import com.xzs.model.HBook;
import lombok.Data;
import java.util.List;
@Data
public class HBookVo extends HBook {
private List<BookCategory> bookc = new ArrayList<>();
}
3.3 マッピング関係の処理と SQL の定義
<resultMap id="HBookVoMap" type="com.xzs.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.xzs.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.xzs.biz;
import com.xzs.vo.HBookVo;
public interface HBookBiz {
HBookVo selectByBookId(Integer bid);
}
HBookBizImpl インターフェース実装クラス
package com.xzs.biz.impl;
import com.xzs.biz.HBookBiz;
import com.xzs.mapper.HBookMapper;
import com.xzs.vo.HBookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class HBookBizImpl implements HBookBiz {
@Autowired
private HBookMapper hBookMapper;
@Override
public HBookVo selectByBookId(Integer bid) {
return hBookMapper.selectByBookId(bid);
}
}