欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis自定義resultMap三種映射關(guān)系示例詳解

 更新時(shí)間:2023年08月30日 11:36:10   作者:云村小威  
這篇文章主要介紹了MyBatis自定義resultMap三種映射關(guān)系,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、一對一映射(One-to-One)

1.1 表關(guān)系

         一對一映射是指一個(gè)對象與另一個(gè)對象具有一對一的關(guān)系。例如,一個(gè)用戶(User)與一個(gè)地址(Address)之間的關(guān)系。假設(shè)我們有以下表結(jié)構(gòu):

user 表:

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

address 表:

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

首先,創(chuàng)建 User 和 Address 實(shí)體類:

User.java

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

Address.java

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

接下來,創(chuàng)建一個(gè) resultMap 進(jìn)行一對一映射:

1.2 resultMap設(shè)置自定義映射 

UserMapper.xml

<resultMap id="UserAddressResultMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    //一對一關(guān)系使用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:表示自定義映射的唯一標(biāo)識
  • type:查詢的數(shù)據(jù)要映射的實(shí)體類的類型

子標(biāo)簽:

  • id:設(shè)置主鍵的映射關(guān)系
  • result:設(shè)置普通字段的映射關(guān)系
  • association :設(shè)置多對一的映射關(guān)系
  • collection:設(shè)置一對多的映射關(guān)系

子標(biāo)簽屬性:

  • property:設(shè)置映射關(guān)系中實(shí)體類中的屬性名
  • column:設(shè)置映射關(guān)系中表中的字段名

最后,編寫一個(gè)查詢方法來使用這個(gè) resultMap: 

UserMapper.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>

        最后實(shí)現(xiàn)接口findUserWithAddress方法測試即可,通過以上簡單的案例,我相信你已經(jīng)明白自定義關(guān)系映射了。往往實(shí)際開發(fā)中數(shù)據(jù)和表是要復(fù)雜的多,進(jìn)階用法請看以下示例:

二、一對多映射(One-to-Many)

        一對多映射是指一個(gè)對象與多個(gè)對象具有一對多的關(guān)系。例如,一個(gè)訂單(Oeder)與一個(gè)訂單詳情(OrderItem)之間的關(guān)系。假設(shè)我們有以下表結(jié)構(gòu):

2.1 創(chuàng)建實(shí)體

 利用mybatis逆向工程(generatorConfig.xml)生成模型層代碼 :

   創(chuàng)建 OrderVo  它是一個(gè)值對象(Value Object),繼承  Order  類并添加了一個(gè)額外的屬性  orderItems 。該類用于在應(yīng)用程序的各個(gè)層之間傳遞數(shù)據(jù),尤其是在表示層和業(yè)務(wù)邏輯層之間。在這個(gè)例子中, OrderVo  類用于表示一個(gè)訂單及其關(guān)聯(lián)的訂單項(xiàng)。

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 級聯(lián)方式處理映射關(guān)系

    <resultMap id="OrderVoMap" type="com.ycxw.vo.OrderVo">
        <result column="order_id" property="orderId"></result>
        <result column="order_no" property="orderNo"></result>
        //多關(guān)系使用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 編寫業(yè)務(wù)邏輯層

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 接口實(shí)現(xiàn)類

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);
        //獲取訂單項(xiàng)信息
        orderVo.getOrderItems().forEach(System.out::println);
    }
}

運(yùn)行結(jié)果:

三、多對多映射(Many-to-Many)

3.1 表關(guān)系

        多對多映射是指多個(gè)對象與多個(gè)對象具有多對多的關(guān)系。表之間的多對多關(guān)系稍微復(fù)雜,需要一個(gè)中間表來表示:

        中間表有三個(gè)字段,其中兩個(gè)字段分別作為外鍵指向各自一方的主鍵,由此通過中間表來表示多對多關(guān)系,通過一個(gè)表聯(lián)合另一個(gè)中間表可以表示為一對多關(guān)系。

 如:根據(jù)書籍id查找關(guān)聯(lián)屬性類別:

3.2 創(chuàng)建實(shí)體

利用mybatis逆向工程(generatorConfig.xml)生成模型層代碼 :

創(chuàng)建 HBookVo 值對象(Value Object)

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 處理映射關(guān)系、定義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>
  <!--根據(jù)書籍的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 編寫業(yè)務(wù)邏輯層

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 接口實(shí)現(xiàn)類

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);
        //數(shù)據(jù)所有信息
        System.out.println(hBookVo);
        //書籍有關(guān)的類別
        System.out.println(hBookVo.getBookc());
    }
}

 反之亦然,如:根據(jù)類別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>

測試運(yùn)行:

到此這篇關(guān)于MyBatis自定義resultMap三種映射關(guān)系的文章就介紹到這了,更多相關(guān)MyBatis自定義resultMap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot文件上傳時(shí)maxPostSize設(shè)置大小失效問題及解決

    springboot文件上傳時(shí)maxPostSize設(shè)置大小失效問題及解決

    這篇文章主要介紹了springboot文件上傳時(shí)maxPostSize設(shè)置大小失效問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 詳解poi+springmvc+springjdbc導(dǎo)入導(dǎo)出excel實(shí)例

    詳解poi+springmvc+springjdbc導(dǎo)入導(dǎo)出excel實(shí)例

    本篇文章主要介紹了poi+springmvc+springjdbc導(dǎo)入導(dǎo)出excel實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2017-01-01
  • SpringBoot部署SSL證書(JKS格式)

    SpringBoot部署SSL證書(JKS格式)

    文將介紹如何在Spring Boot應(yīng)用中部署SSL證書,以實(shí)現(xiàn)安全傳輸和保護(hù)數(shù)據(jù)隱私,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • java實(shí)現(xiàn)簡單的俄羅斯方塊

    java實(shí)現(xiàn)簡單的俄羅斯方塊

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡單的俄羅斯方塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java對象的內(nèi)存布局詳細(xì)介紹

    Java對象的內(nèi)存布局詳細(xì)介紹

    這篇文章主要介紹了Java對象的內(nèi)存布局,我們知道在Java中基本數(shù)據(jù)類型的大小,例如int類型占4個(gè)字節(jié)、long類型占8個(gè)字節(jié),那么Integer對象和Long對象會占用多少內(nèi)存呢?本文介紹一下Java對象在堆中的內(nèi)存結(jié)構(gòu)以及對象大小的計(jì)算
    2023-02-02
  • SpringBoot中實(shí)現(xiàn)Redis?Stream隊(duì)列的代碼實(shí)例

    SpringBoot中實(shí)現(xiàn)Redis?Stream隊(duì)列的代碼實(shí)例

    本文介紹了如何在Spring?Boot中使用Redis?Stream隊(duì)列進(jìn)行消息的生產(chǎn)和消費(fèi),涉及到的主要內(nèi)容包括添加Redis依賴、配置RedisTemplate、創(chuàng)建生產(chǎn)者和消費(fèi)者監(jiān)聽器等,需要的朋友可以參考下
    2024-09-09
  • Java使用正則表達(dá)式刪除所有HTML標(biāo)簽的方法示例

    Java使用正則表達(dá)式刪除所有HTML標(biāo)簽的方法示例

    這篇文章主要介紹了Java使用正則表達(dá)式刪除所有HTML標(biāo)簽的方法,結(jié)合完整實(shí)例形式分析了java針對HTML頁面元素script標(biāo)簽、style標(biāo)簽、html標(biāo)簽等的正則匹配相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • java WebSocket實(shí)現(xiàn)聊天消息推送功能

    java WebSocket實(shí)現(xiàn)聊天消息推送功能

    這篇文章主要為大家詳細(xì)介紹了java WebSocket實(shí)現(xiàn)聊天消息推送功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java?IO之流的分類詳解

    Java?IO之流的分類詳解

    這篇文章主要為大家介紹了Java?IO之流的分類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Spring5路徑匹配器PathPattern解析

    Spring5路徑匹配器PathPattern解析

    這篇文章主要介紹了Spring5路徑匹配器PathPattern,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論