<font id="tbtdb"></font>

        <sub id="tbtdb"><delect id="tbtdb"></delect></sub>

          <progress id="tbtdb"></progress>
          <address id="tbtdb"></address><thead id="tbtdb"></thead>
          <font id="tbtdb"></font>

          <meter id="tbtdb"><cite id="tbtdb"><dl id="tbtdb"></dl></cite></meter>

          好程序員-千鋒教育旗下高端IT職業教育品牌

          400-811-9990
          我的賬戶
          好程序員

          專注高端IT職業培訓

          親愛的猿猿,歡迎!

          已有賬號,請

          如尚未注冊?

          [JavaEE] 好程序員Java學習路線分享MyBatis之關聯查詢

          [復制鏈接]
          245 0
          葉子老師 發表于 2019-9-20 15:36:34 | 只看該作者 |只看大圖 |閱讀模式 打印 上一主題 下一主題
            好程序員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集合時,就會調用OrderDAOselectByGoodsId按商品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對象時,就調用GoodsDAOselectById按商品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中配置collectionassociation標簽
          collection配置的是一對多關系,property屬性是集合的名稱,select配置的是查詢集合的方法,column配置查詢方法的參數對應的列名
          association配置的是一對一關系,property屬性是對應對象的名稱,select配置的是查詢集合的方法,column配置查詢方法的參數對應的列名
          好程序員Java培訓官網:http://www.xn122.com/

          精彩內容,一鍵分享給更多人!
          收藏
          收藏0
          轉播
          轉播
          分享
          淘帖0
          支持
          支持0
          反對
          反對0
          回復

          使用道具 舉報

          您需要登錄后才可以回帖

          本版積分規則

          關注我們
          好程序員
          千鋒好程序員

          北京校區(總部):北京市海淀區寶盛北里西區28號中關村智誠科創大廈

          深圳西部硅谷校區:深圳市寶安區寶安大道5010號深圳西部硅谷B座A區605-619

          杭州龍馳智慧谷校區:浙江省杭州市下沙經濟技術開發區元成路199號龍馳智慧谷B座7層

          鄭州校區:鄭州市二七區航海中路60號海為科技園C區10層、12層

          Copyright 2007-2019 北京千鋒互聯科技有限公司 .All Right

          京ICP備12003911號-5 京公安網11010802011455號

          請您保持通訊暢通1對1咨詢馬上開啟

          电影韩国三级2019在线观看