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

Mybatis一對多查詢的兩種姿勢(值得收藏)

 更新時間:2021年05月12日 09:23:12   作者:臭小子帥  
這篇文章主要給大家介紹了關于Mybatis一對多查詢的兩種姿勢,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

最近碰到了Mybatis一對多查詢的場景,在這里總結對比下常見的兩種實現方式。

本文以常見的訂單表和訂單詳情表來舉例說明;

數據庫表準備

訂單表 tbl_order

訂單詳情表 tlb_order_detail

ps: 一個訂單關聯多個訂單詳情,通過order_no訂單號關聯;

實例演示

方法一:聯合查詢ResultMap映射

sql直接關聯查詢,然后結果集通過resultMap的collection映射

例如 查詢訂單列表,包括訂單詳情

Order.java 中新增字段orderDetailList,用于存詳情列表

public class Order {
    private Integer id;

    private String orderNo;

    private Date orderTime;

    private Date payTime;

    private String remark;
    /**訂單詳情*/
    private List<OrderDetail> orderDetailList;
    //省略get、set

OrderMapper.java 新增查詢方法

    List<Order> queryOrderList(Map map);

OrderMapper.xml

<resultMap id="BaseResultMap" type="com.chouxiaozi.mybatisdruid.entity.Order" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="order_no" property="orderNo" jdbcType="VARCHAR" />
    <result column="order_time" property="orderTime" jdbcType="TIMESTAMP" />
    <result column="pay_time" property="payTime" jdbcType="TIMESTAMP" />
    <result column="remark" property="remark" jdbcType="VARCHAR" />
    <collection property="orderDetailList" ofType="com.chouxiaozi.mybatisdruid.entity.OrderDetail">
      <id column="d_id" property="id" jdbcType="INTEGER" />
      <result column="d_order_no" property="orderNo" jdbcType="VARCHAR" />
      <result column="good_name" property="goodName" jdbcType="VARCHAR" />
      <result column="good_id" property="goodId" jdbcType="INTEGER" />
      <result column="good_count" property="goodCount" jdbcType="INTEGER" />
    </collection>
  </resultMap>
  
<select id="queryOrderList" resultMap="BaseResultMap">
    SELECT
      o.*, d.id as d_id,d.order_no as d_order_no,d.good_name,d.good_id,d.good_count
    FROM
      tbl_order o
        LEFT JOIN tbl_order_detail d ON d.order_no = o.order_no
    where 1=1
    <if test="orderNo != null and orderNo != ''">
      and o.order_no = #{orderNo}
    </if>
    ORDER BY o.order_time desc
  </select>

查詢結果展示

[
  {
    "id": 2,
    "orderNo": "DD000002",
    "orderTime": "2021-05-09 12:25:57",
    "payTime": "2021-05-09 12:25:59",
    "remark": "2號訂單",
    "orderDetailList": [
      {
        "id": 5,
        "orderNo": "DD000002",
        "goodName": "耳機",
        "goodId": 5,
        "goodCount": 1
      },
      {
        "id": 4,
        "orderNo": "DD000002",
        "goodName": "手機",
        "goodId": 4,
        "goodCount": 1
      }
    ]
  },
  {
    "id": 1,
    "orderNo": "DD000001",
    "orderTime": "2021-05-09 12:25:37",
    "payTime": "2021-05-09 12:25:41",
    "remark": "1號訂單",
    "orderDetailList": [
      {
        "id": 2,
        "orderNo": "DD000001",
        "goodName": "飲料",
        "goodId": 2,
        "goodCount": 2
      },
      {
        "id": 1,
        "orderNo": "DD000001",
        "goodName": "瓜子",
        "goodId": 1,
        "goodCount": 1
      },
      {
        "id": 3,
        "orderNo": "DD000001",
        "goodName": "礦泉水",
        "goodId": 3,
        "goodCount": 2
      }
    ]
  }
]

原理:sql直接關聯查詢,然后結果集通過resultMap的collection映射,將order_detail表對應的字段映射到orderDetailList字段中。

優(yōu)點:條件查詢方便;無論是訂單表還是詳情表如果要進行一些條件過濾的話,非常方便,直接寫在where中限制就行。
不足:因為是先關聯查詢,后映射;如果需要進行分頁查詢的話,這種方式就無法滿足。主表2條數據,詳情表5條數據,關聯之后就是10條,無法得主表進行分頁;解決方法,就是先給主表套個子查詢limit分頁后,然后結果集再跟詳情表進行關聯查詢;

方法二:子查詢映射

通過resultMap中collection標簽的select屬性去執(zhí)行子查詢

還以查詢訂單列表為例

OrderMapper.java

    List<Order> queryOrderList2(Map map);

OrderMapper.xml

<!--主查詢的resultMap-->
  <resultMap id="BaseResultMap2" type="com.chouxiaozi.mybatisdruid.entity.Order" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="order_no" property="orderNo" jdbcType="VARCHAR" />
    <result column="order_time" property="orderTime" jdbcType="TIMESTAMP" />
    <result column="pay_time" property="payTime" jdbcType="TIMESTAMP" />
    <result column="remark" property="remark" jdbcType="VARCHAR" />
    <!--select子查詢, column 傳給子查詢的參數-->
    <collection property="orderDetailList" ofType="com.chouxiaozi.mybatisdruid.entity.OrderDetail"
                select="queryDetail" column="order_no">
    </collection>
  </resultMap>
  <!--主查詢的sql-->
  <select id="queryOrderList2" resultMap="BaseResultMap2">
    SELECT
    o.*
    FROM
    tbl_order o
    where 1=1
    <if test="orderNo != null and orderNo != ''">
      and o.order_no = #{orderNo}
    </if>
    ORDER BY o.order_time desc
  </select>
  <!--子查詢的resultMap-->
  <resultMap id="detailResuleMap" type="com.chouxiaozi.mybatisdruid.entity.OrderDetail">
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="order_no" property="orderNo" jdbcType="VARCHAR" />
    <result column="good_name" property="goodName" jdbcType="VARCHAR" />
    <result column="good_id" property="goodId" jdbcType="INTEGER" />
    <result column="good_count" property="goodCount" jdbcType="INTEGER" />
  </resultMap>
  <!--子查詢的sql-->
  <select id="queryDetail" resultMap="detailResuleMap">
    SELECT
      *
    FROM
      `tbl_order_detail` where order_no = #{order_no}
  </select>

查詢結果同上個例子一樣;

原理:通過collection的select方法去調用子查詢;所需參數通過column傳遞;

優(yōu)點:無論是分頁還是普通查詢都能滿足;主表增加過濾條件也很方便,直接在主查詢的sql中增加where條件就行

缺點:子查詢不好增加過濾條件;column只能傳遞主表已有的字段。下面提供解決方式;
ps:column傳遞多個參數 column=“{prop1=col1,prop2=col2}”

例如:實際場景中,詳情表有個狀態(tài)字段,只展示狀態(tài)正常的詳情,需要過濾詳情記錄。

本例子沒有狀態(tài)字段,就查詢訂單列表,詳情中不展示瓜子,即詳情記錄中過濾掉good_id = 1的;

在上個例子基礎上修改如下:

調用層傳參

	Map map = new HashMap();
    map.put("goodId", 1);
    orderMapper.queryOrderList2(map);

orderMapper.xml中增加傳參過濾

展示結果如下:詳情中已成功過濾掉瓜子;記住,過濾子查詢不會影響主表記錄;

[
  {
    "id": 2,
    "orderNo": "DD000002",
    "orderTime": "2021-05-09 12:25:57",
    "payTime": "2021-05-09 12:25:59",
    "remark": "2號訂單",
    "orderDetailList": [
      {
        "id": 4,
        "orderNo": "DD000002",
        "goodName": "手機",
        "goodId": 4,
        "goodCount": 1
      },
      {
        "id": 5,
        "orderNo": "DD000002",
        "goodName": "耳機",
        "goodId": 5,
        "goodCount": 1
      }
    ]
  },
  {
    "id": 1,
    "orderNo": "DD000001",
    "orderTime": "2021-05-09 12:25:37",
    "payTime": "2021-05-09 12:25:41",
    "remark": "1號訂單",
    "orderDetailList": [
      {
        "id": 2,
        "orderNo": "DD000001",
        "goodName": "飲料",
        "goodId": 2,
        "goodCount": 2
      },
      {
        "id": 3,
        "orderNo": "DD000001",
        "goodName": "礦泉水",
        "goodId": 3,
        "goodCount": 2
      }
    ]
  }
]

總結

方式 聯合查詢映射 子查詢映射
原理 sql查詢完成后再通過resultmap映射結果 主表的數據集循環(huán)調用子查詢
分頁 不支持分頁查詢,主表套子查詢也能實現 支持分頁
條件過濾 方便條件過濾 傳參也能實現,復雜參數例如list不好傳遞給子查詢 ;子查詢過濾不影響主表數據

到此這篇關于Mybatis一對多查詢的文章就介紹到這了,更多相關Mybatis一對多查詢內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Android設備如何保證數據同步寫入磁盤的實現

    Android設備如何保證數據同步寫入磁盤的實現

    這篇文章主要介紹了Android設備如何保證數據同步寫入磁盤的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Java import導入及訪問控制權限修飾符原理解析

    Java import導入及訪問控制權限修飾符原理解析

    這篇文章主要介紹了Java import導入及訪問控制權限修飾符過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Java語法基礎之運算符學習筆記分享

    Java語法基礎之運算符學習筆記分享

    這篇文章主要為大家分享了Java語法基礎之運算符學習筆記,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • java虛擬機運行時數據區(qū)分析

    java虛擬機運行時數據區(qū)分析

    這篇文章主要介紹了java虛擬機運行時數據區(qū)分析,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java隨機值設置(java.util.Random類或Math.random方法)

    Java隨機值設置(java.util.Random類或Math.random方法)

    在編程中有時我們需要生成一些隨機的字符串作為授權碼、驗證碼等,以確保數據的安全性和唯一性,這篇文章主要給大家介紹了關于Java隨機值設置的相關資料,主要用的是java.util.Random類或Math.random()方法,需要的朋友可以參考下
    2024-08-08
  • Java Swing 只關閉當前窗體的實現

    Java Swing 只關閉當前窗體的實現

    這篇文章主要介紹了Java Swing 只關閉當前窗體的實現,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • SpringBoot自定義FailureAnalyzer詳解

    SpringBoot自定義FailureAnalyzer詳解

    這篇文章主要介紹了SpringBoot自定義FailureAnalyzer詳解,FailureAnalyzer是一種在啟動時攔截?exception?并將其轉換為?human-readable?消息的好方法,包含在故障分析中,需要的朋友可以參考下
    2023-11-11
  • Spring @Scheduled的坑及解決

    Spring @Scheduled的坑及解決

    這篇文章主要介紹了Spring @Scheduled的坑及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Springboot整合freemarker和相應的語法詳解

    Springboot整合freemarker和相應的語法詳解

    FreeMarker是一款Spring官方推薦使用的模板引擎。接下來通過本文給大家介紹Springboot整合freemarker和相應的語法,感興趣的朋友一起看看吧
    2021-09-09
  • Java編程實現暴力破解WIFI密碼的方法分析

    Java編程實現暴力破解WIFI密碼的方法分析

    這篇文章主要介紹了Java編程實現暴力破解WIFI密碼的方法,結合具體實例形式分析了java暴力破解WiFi密碼的原理、操作步驟、實現技巧與相關注意事項,需要的朋友可以參考下
    2018-12-12

最新評論