你不得不知道的MyBatis基礎知識之<resultMap>(4)

TomLazy發表於2020-10-21


簡述

   resultMap 元素是 MyBatis 中最重要最強大的元素。它可以讓你從 90% 的 JDBC ResultSets 資料提取程式碼中解放出來,並在一些情形下允許你進行一些 JDBC 不支援的操作。實際上,在為一些比如連線的複雜語句編寫對映程式碼的時候,一份 resultMap 能夠代替實現同等功能的數千行程式碼。ResultMap 的設計思想是,對簡單的語句做到零配置,對於複雜一點的語句,只需要描述語句之間的關係就行了。
resultMap

一些注意事項

  • MyBatis 屬於持久層 主要寫的就是sql
  • 非查詢一定要手動的使用commit()!
  • 產品依賴著產品型別 一個產品對應著一種產品型別

<//resultMap>是Maybatis的結果集封裝,搭配<//select><//association>等標籤的resultMap屬性使用

  • 必須有id
  • 必須是一個已存在的類
  • <//association>標籤只能放在<//resultMap>標籤中的最後面

程式碼示例

  我們這裡以山科超市的訂單模組為例:
  訂單表的大致邏輯是:orderid, uid, orderprice, addtime, ordersdetails,一個訂單隻對應一個使用者,一個訂單可以對應多個訂單詳情;一個訂單詳情表中對應了一個產品,一個產品又對應了一個產品類別

OrdersMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lazy.mappers.OrdersMapper">

    <sql id="orderSql"> o.orderid,u.uname,o.orderprice,o.addtime,p.pcode,p.pname,od.pnum</sql>
    <sql id="orderUserSql">u.uname, o.orderid,o.orderprice,o.addtime,p.pcode,p.pname,od.pnum</sql>

    <insert id="addOrder">
        INSERT INTO orders (orderid,uid,orderprice) VALUES(#{orders.orderid},#{orders.uid.uid},#{orders.orderprice})
    </insert>


    <resultMap id="resOrder" type="com.lazy.domain.Orders">
        <id property="orderid" column="orderid"/>
        <result property="orderprice" column="orderprice"/>
        <result property="addtime" column="addtime"/>
        <association property="uid" javaType="com.lazy.domain.Users">
            <id property="uid" column="uid"/>
            <result property="uname" column="uname"/>
        </association>
        <!-- 一對多 -->
        <collection property="details" ofType="com.lazy.domain.OrderDetails">
            <id property="oddid" column="oddid"/>
            <result property="pnum" column="pnum"/>
            <association property="pid" javaType="com.lazy.domain.Products">
                <id property="pid" column="pid"/>
                <result property="pcode" column="pcode"/>
                <result property="pname" column="pname"/>
                <association property="ptid" javaType="com.lazy.domain.PType">
                    <id property="ptid" column="ptid"/>
                    <result property="ptname" column="ptname"/>
                </association>
            </association>
        </collection>
    </resultMap>

    <select id="findByOrderId" resultMap="resOrder">
        SELECT <include refid="orderSql"/>
        FROM orders o
        INNER JOIN orderdetails od ON o.orderid = od.orderid
        INNER JOIN products p ON p.pid = od.pid
        INNER JOIN ptype pt ON p.ptid = pt.ptid
        INNER JOIN users u ON  u.uid = o.uid
        WHERE o.orderid = #{orderId,jdbcType=VARCHAR}
    </select>

    <select id="findByUserId" resultMap="resOrder">
        SELECT <include refid="orderUserSql"/>
        FROM orders o
        INNER JOIN orderdetails od ON o.orderid = od.orderid
        INNER JOIN products p ON p.pid = od.pid
        INNER JOIN ptype pt ON p.ptid = pt.ptid
        INNER JOIN users u ON  u.uid = o.uid
        WHERE u.uid = #{uid,jdbcType=VARCHAR}
    </select>

</mapper>

OrdersMapper.java

  這裡一共定義了三個介面,分別用於以訂單id查詢、以使用者id查詢,以及新增訂單

package com.lazy.mappers;

import com.lazy.domain.Orders;
import org.apache.ibatis.annotations.Param;

public interface OrdersMapper {
    Orders findByOrderId(@Param("orderId") String orderId);
    Orders findByUserId(@Param("uid") String uid);
    int addOrder(@Param("orders") Orders orders);
}

相關文章