好程式設計師Java學習路線分享MyBatis之關聯查詢

好程式設計師IT發表於2019-09-23

  好程式設計師Java 學習路線分享 MyBatis 之關聯查詢,我們進行資料庫查詢時往往需要的不止一張表的資料,需要將多張表的資料一起查詢出來,大家學習過資料庫的連線查詢,那麼在 MyBatis 中如何將有關係的多張表資料進行關聯查詢呢。

表的結構

商品和訂單是典型的一對多關係,下面的案例我們將以商品表和訂單表作為示例,演示如何配置最常見的一對多關係,下面是兩張表的結構:

商品表:


訂單表:


實體類的設計

一種商品有多個訂單,每個訂單對應一種商品,在實體類中體現這個關係。

訂單實體類:

/**
 *  訂單類
  */
public class Order {

    private Integer id;
    private Integer num;
    private Integer goodsId;
    private String time;
     /**
     *  訂單對應的商品物件
      */
    private Goods goods;

商品實體類:

/**
 *  商品類
  */
public class Goods {

    private Integer id;
    private String name;
    private Double price;
    private String address;
     /**
     *  訂單集合
      */
    private List<Order> orders;

 

Mapper 介面設計

這裡我們只介紹關聯查詢,所以只定義了基本的查詢方法

/**
 *  商品介面
  */
public interface GoodsDAO{
    // 根據編號查詢商品
    Goods selectById(int id);
}

 

/**
 *  訂單介面
  */
public interface OrderDAO{
    // 根據訂單id 查詢訂單
    Order selectById(int orderId);
    // 根據商品id 查詢訂單
    List<Order> selectByGoodsId(int goodsId);
}

 

collection 標籤

接下來就是重點了,我們在商品類中定義了訂單集合屬性orders ,那麼這個集合的資料如何進行查詢呢?這就需要我們在 mapper 檔案中使用 collection 標籤。

collection 標籤用在 resultMap 標籤中,用於配置集合的查詢,用法是:

<collection property=" 集合屬性名 " column=" 傳入查詢方法的列名 " select=" 查詢集合所呼叫的方法 "/>

示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "
<!--mapper 是對映,namespace 是設定對應的DAO 介面-->
<mapper namespace="com.qianfeng.mybatis01.dao.GoodsDAO">

<!-- 配置資料庫返回結果對映-->
    <resultMap id="goodsMap" type="com.qianfeng.mybatis01.entity.Goods">
        <!--id 用於配置主鍵,property 是實體類的屬性名,column 是表中的欄位名-->
        <id property="id" column="goods_id"></id>
        <!--result 配置主鍵外其他列-->
        <result property="name" column="goods_name"></result>
        <result property="price" column="goods_price"></result>
        <result property="address" column="goods_address"></result>
        <!-- 配置訂單集合-->
        <collection property="orders" column="goods_id"
                    select="com.qianfeng.mybatis01.dao.OrderDAO.selectByGoodsId"/>
    </resultMap>
    <select id="selectById" parameterType="int" resultMap="goodsMap">
        select * from tb_goods where goods_id = #{id}
    </select>
</mapper>

collection 的意思是:

當商品物件需要orders 集合時,就會呼叫 OrderDAO selectByGoodsId 按商品 id 查詢所有訂單,商品 id 就是當前商品的 goods_id 值。

association 標籤

association 標籤的用法類似於 collection ,用於配置一對一的關係,每個訂單中有一個商品物件 goods ,這個物件查詢可以用 association 來進行配置。

用法:

<association property=" 物件屬性名 " column=" 傳入查詢方法的列名 " select=" 查詢物件所呼叫的方法 "/>

示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "
<!--mapper 是對映,namespace 是設定對應的DAO 介面-->
<mapper namespace="com.qianfeng.mybatis01.dao.OrderDAO">
    <!-- 配置資料庫返回結果對映-->
    <resultMap id="orderMap" type="com.qianfeng.mybatis01.entity.Order">
        <!--id 用於配置主鍵,property 是實體類的屬性名,column 是表中的欄位名-->
        <id property="id" column="order_id"></id>
        <!--result 配置主鍵外其他列-->
        <result property="num" column="order_num"></result>
        <result property="goodsId" column="order_goods_id"></result>
        <result property="time" column="order_time"></result>
        <!-- 配置商品物件對映-->
        <association property="goods" column="order_goods_id"
                     select="com.qianfeng.mybatis01.dao.GoodsDAO.selectById"/>
    </resultMap>

    <select id="selectById" parameterType="int" resultMap="orderMap">
        select * from tb_order where order_id = #{id}
    </select>

    <select id="selectByGoodsId" parameterType="int" resultMap="orderMap">
        select * from tb_order where order_goods_id = #{goodsId}
    </select>
</mapper>

association 的意思是:

當訂單物件需要goods 物件時,就呼叫 GoodsDAO selectById 按商品 id 查詢商品,此商品 id 就是訂單中的外來鍵列 order_goods_id

單元測試

@Test
public void testGoodsAndOrders(){
    GoodsDAO goodsDAO = MyBatisUtils. getSession().getMapper(GoodsDAO.class);
    // 查詢商品
    Goods goods = goodsDAO.selectById(1);
    System. out.println(" 查詢商品:"+goods);
    // 獲得商品所有的訂單
    goods.getOrders().stream().forEach((order)->System. out.println(" 商品的訂單"+order));
    OrderDAO orderDAO = MyBatisUtils. getSession().getMapper(OrderDAO.class);
    // 查詢訂單
    Order order = orderDAO.selectById(4);
    System. out.println(" 查詢訂單"+order);
    // 獲得訂單對應的商品
    System. out.println(" 訂單的商品:" + order.getGoods());
}

執行結果:

查詢商品:Goods{id=1, name='小米9手機', price=2000.0, address='上海'}

商品的訂單Order{id=1, num=2, goodsId=1, time='2019-9-12'}

商品的訂單Order{id=4, num=4, goodsId=1, time='2019-9-14'}

查詢訂單Order{id=4, num=4, goodsId=1, time='2019-9-14'}

訂單的商品:Goods{id=1, name='小米9手機', price=2000.0, address='上海'}

 

總結

MyBatis 中配置表的關聯關係,需要在 resultMap 中配置 collection association 標籤

collection 配置的是一對多關係, property 屬性是集合的名稱, select 配置的是查詢集合的方法, column 配置查詢方法的引數對應的列名

association 配置的是一對一關係, property 屬性是對應物件的名稱, select 配置的是查詢集合的方法, column 配置查詢方法的引數對應的列名

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2657923/,如需轉載,請註明出處,否則將追究法律責任。

相關文章