最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于mybatis高級(jí)映射多對(duì)多查詢的實(shí)現(xiàn)

 更新時(shí)間:2017年10月24日 09:48:09   作者:代江平  
下面小編就為大家?guī)硪黄趍ybatis高級(jí)映射多對(duì)多查詢的實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

1.同以前一樣,首先給一個(gè)使用多對(duì)多的需求,

要查詢用戶以及用戶所購買的商品信息,經(jīng)過分析用戶和商品數(shù)據(jù)庫級(jí)別沒有任何關(guān)系,用戶和商品需要建立關(guān)系,要通過訂單,訂單明細(xì)建立關(guān)系。根據(jù)這個(gè)需求,可以分析出需要查詢的主表為:

查詢主表:用戶表

查詢關(guān)聯(lián)表:由于商品和用戶沒有關(guān)系,通過訂單和訂單明細(xì)進(jìn)行關(guān)聯(lián),所以得出關(guān)聯(lián)表是:orders訂單表,orderDetail訂單明細(xì)表,items商品表。這樣的話,sql該如何去寫?這樣寫:

select
      orders.*,
      t_user.id user_id,
      t_user.address,
      t_user.name,
      t_user.brithday,
      orderdetail.id orderdetail_id,
      orderdetail.orderid,
      orderdetail.itemsid,
      items.id items_id,
      items.name items_name,
      items.price items_price
      from
      orders,
      t_user,
      orderdetail,
      items
      where
      orders.userid=t_user.id AND orderdetail.orderid=orders.id AND orderdetail.itemsId = items.id

為了方便映射,適當(dāng)加上別名,上面就是寫好的大sql,這sql語句是越來越大了,但不要害怕,待會(huì)做映射一個(gè)個(gè)來做,只要方法得提是很簡(jiǎn)單的。

2.編寫映射文件分析:

現(xiàn)在的主表是user,所以將用戶 的信息映射到user中,一個(gè)用戶可以創(chuàng)建多個(gè)訂單,所以在user屬性中添加List<Orders> orderlist 屬性,這和hibernate越來越像了哈,然后將用戶創(chuàng)建的訂單映射到orderlist,中一個(gè)訂單可以包括多個(gè)訂單明細(xì),所以在orderS中添加訂單明細(xì)列表屬性:List<OrderDetail> orderdetails ,一個(gè)訂單明細(xì)只包括一個(gè)商品信息,所以在OrderSDetail中添加商品items 屬性。

User.java代碼如下:

public class User {
  private int id;
  private String name;
  private String pwd;
  private String address;
  private Date brithday;
  private List<Orders> ordersList;//看這里 用戶創(chuàng)建的訂單列表
}

Orders.java代碼如下:

public class Orders {
  private int id;
  private String note;
  private Date dateTime;
  private String number;
  private int userId;
  private User user;
  private List<OrdersDetail> ordersDetails;//一個(gè)訂單包括多個(gè)訂單明細(xì)

OrdersDetail.java代碼如下:

public class OrdersDetail {
  private int id;
  private int orderId;
  private int itemsId;
  private Items items;//一條訂單明細(xì)包括一條商品信息  

到這里,pojo類之間的關(guān)系就搭建好了,接下來寫mapper.xml

代碼如下(注意看代碼里的注釋):

<!--查詢用戶所購買的商品信息resultMap-->
  <resultMap id="UserAndItemsResultMap" type="com.djp.pojo.User">
    <!--配置用戶信息-->
    <id column="user_id" property="id"/>
    <result column="address" property="address"/>
    <result column="name" property="name"/>
    <result column="brithday" property="brithday"/>
    <!--配置用戶創(chuàng)建的訂單信息,一個(gè)用戶創(chuàng)建了多個(gè)訂單-->
    <collection property="ordersList" ofType="com.djp.pojo.Orders">
      <id column="id" property="id"/>
      <result column="note" property="note"/>
      <result column="dateTime" property="dateTime"/>
      <result column="userId" property="userId"/>
      <result column="number" property="number"/>
      <!--配置訂單明細(xì)信息 一個(gè)訂單包含多個(gè)訂單明細(xì)-->
      <collection property="ordersDetails" ofType="com.djp.pojo.OrdersDetail">
        <id column="orderdetail_id" property="id"/>
        <result column="orderId" property="orderId"/>
        <result column="itemsid" property="itemsId"/>
        <!--配置商品信息 一個(gè)明細(xì)包括一個(gè)商品-->
        <association property="items" javaType="com.djp.pojo.Items">
          <id column="items_id" property="id"/>
          <result column="items_name" property="name"/>
          <result column="items_price" property="price"/>
        </association>
      </collection>
    </collection>
  </resultMap>
  <!--查詢用戶所購買的商品信息-->
  <select id="findUserAndItemsResultMap" resultMap="UserAndItemsResultMap">
    select
      orders.*,
      t_user.id user_id,
      t_user.address,
      t_user.name,
      t_user.brithday,
      orderdetail.id orderdetail_id,
      orderdetail.orderid,
      orderdetail.itemsid,
      items.id items_id,
      items.name items_name,
      items.price items_price
      from
      orders,
      t_user,
      orderdetail,
      items
      where
      orders.userid=t_user.id AND orderdetail.orderid=orders.id AND orderdetail.itemsId = items.id
  </select>

有了之前一對(duì)多的映射,類比寫這個(gè)就比較簡(jiǎn)單了;這里不能使用繼承,因?yàn)槟惆l(fā)現(xiàn)使用繼承沒法套用了。所以只能老實(shí)的寫完。

接下來在接口中添加一個(gè)方法,為查詢用戶所購買商品信息

public interface OrdersCustomMapper {
  /**
   * 查詢用戶所購買的商品
   * @return
   * @throws Exception
   */
  List<User> findUserAndItemsResultMap() throws Exception;

最后一步,寫測(cè)試類:

/**findUserAndItemsResultMap
   * 查詢用戶所購買的商品信息
   */
  @Test
  public void testfindUserAndItemsResultMap() {
    try {
      System.out.println("start.................");
      //通過得到的SqlSessionFactory打開回話sqlSession
      SqlSession sqlSession = SqlSessionFactory.openSession();
      //通過會(huì)話得到用戶的代理
      OrdersCustomMapper ordersCustomMapper = sqlSession.getMapper(OrdersCustomMapper.class);
      List<User> list = ordersCustomMapper.findUserAndItemsResultMap();
      System.out.println("end.................");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

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

用戶商品.png可以看到我展開的列表,是不是想要的數(shù)據(jù)都出來了;

總結(jié):

到這里可能有人會(huì)覺得這個(gè)怎么比hibernate中的多對(duì)多還麻煩,那么,現(xiàn)在如果有這么一個(gè)需求,查詢用戶所購買的商品信息明細(xì)清單(用戶名,用戶地址,購買商品名稱,購買商品時(shí)間,購買商品數(shù)量),這個(gè)時(shí)候應(yīng)該使用resultMap還是resulType,這個(gè)時(shí)候會(huì)發(fā)現(xiàn),針對(duì)上面的需求,就是用resultType將查詢到的信息映射到一個(gè)擴(kuò)展的pojo中,很好用,加屬性就行了,這樣的話就可以很簡(jiǎn)單地實(shí)現(xiàn)明細(xì)清單的功能,比如話費(fèi)賬單,張三幾點(diǎn)幾分給誰打電話,張三幾點(diǎn)幾分打電話給誰,沒必要去重復(fù)記錄。所以,要根據(jù)需求來,并非所有的一對(duì)多都是上面的resultMap那種查詢。使用resultMap是針對(duì)那些查詢結(jié)果有特殊要求的功能,比如映射成list中還包括多個(gè)list。

一對(duì)多是多對(duì)多的特咧:查詢用戶購買商品信息,用戶和商品是多對(duì)多關(guān)系。

需求1:查詢字段:用戶賬號(hào),用戶名稱,用戶性別,商品名稱,商品價(jià)格(最常見)。企業(yè)開發(fā)中常見的明細(xì)表,用戶購買商品明細(xì)表等。

方法:使用resultType將上面商品輸出

需求2:查詢字段:用戶賬號(hào),用戶名稱,購買商品數(shù)量,商品明細(xì)(鼠標(biāo)移動(dòng)到上面顯示明細(xì))

方法:使用resultMap將用戶所購買的商品明細(xì)映射到user中。

對(duì)resultMap的大總結(jié):

resultType:

作用:將查詢結(jié)果按照sql列名和pojo屬性名一致映射到pojo中

場(chǎng)合:常見的一些明細(xì)記錄的展示,比如用戶購買商品的明細(xì),將關(guān)聯(lián)查詢的信息全部展示在頁面時(shí),此時(shí)用resultType將每一條記錄映射到pojo中,在前端頁面遍歷list即可。

resultMap:

使用association和collection完成一對(duì)一和一對(duì)多的高級(jí)映射(對(duì)結(jié)果有特殊要求)。

association:

作用:將關(guān)聯(lián)查詢的信息映射到一個(gè)pojo中

場(chǎng)合:為了方便查詢關(guān)聯(lián)信息可以使用association將關(guān)聯(lián)訂單信息映射為用戶對(duì)象的pojo屬性中,比如:查詢訂單關(guān)聯(lián)查詢用戶信息。

collection:

作用:將關(guān)聯(lián)查詢用戶信息映射到一個(gè)list集合中

場(chǎng)合:為了方便查詢遍歷關(guān)聯(lián)信息可以使用collection將關(guān)聯(lián)信息映射到list集合中,比如:查詢用戶權(quán)限范圍模塊以及模塊下的菜單,可以使用collection將模塊映射到list中,將菜單列表遍歷即可!

以上這篇基于mybatis高級(jí)映射多對(duì)多查詢的實(shí)現(xiàn)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot整合Java DL4J實(shí)現(xiàn)文本分類系統(tǒng)

    SpringBoot整合Java DL4J實(shí)現(xiàn)文本分類系統(tǒng)

    在當(dāng)今信息爆炸的時(shí)代,自然語言處理領(lǐng)域中的文本分類顯得尤為重要,文本分類能夠高效地組織和管理海量的文本數(shù)據(jù),隨著互聯(lián)網(wǎng)的飛速發(fā)展,我們每天都被大量的文本信息所包圍,本文將介紹如何使用 Spring Boot 整合 Java Deeplearning4j 來構(gòu)建一個(gè)文本分類系統(tǒng)
    2024-10-10
  • springboot + swagger 實(shí)例代碼

    springboot + swagger 實(shí)例代碼

    本篇文章主要介紹了springboot + swagger 實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 詳細(xì)分析Java內(nèi)存模型

    詳細(xì)分析Java內(nèi)存模型

    Java虛擬機(jī)規(guī)范中定義了Java內(nèi)存模型(Java Memory Model,JMM),用于屏蔽掉各種硬件和操作系統(tǒng)的內(nèi)存訪問差異,以實(shí)現(xiàn)讓Java程序在各種平臺(tái)下都能達(dá)到一致的并發(fā)效果,JMM規(guī)范了Java虛擬機(jī)與計(jì)算機(jī)內(nèi)存是如何協(xié)同工作的,以及在必須時(shí)如何同步的訪問共享變量
    2021-06-06
  • 聊聊spring繼承的問題

    聊聊spring繼承的問題

    這篇文章主要介紹了spring繼承的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java圖片格式轉(zhuǎn)換的三段代碼

    java圖片格式轉(zhuǎn)換的三段代碼

    這篇文章主要分享了java圖片格式轉(zhuǎn)換的三段代碼,小編查找資料整理了java圖片格式轉(zhuǎn)換的三段不同代碼,推薦給大家。
    2015-11-11
  • 搭建JavaWeb服務(wù)器步驟詳解

    搭建JavaWeb服務(wù)器步驟詳解

    本篇文章主要給大家詳細(xì)分享了搭建JavaWeb服務(wù)器的詳細(xì)步驟以及用到的代碼,對(duì)此有需要的朋友可以跟著學(xué)習(xí)下。
    2018-02-02
  • Java實(shí)現(xiàn)快速排序算法的完整示例

    Java實(shí)現(xiàn)快速排序算法的完整示例

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)快速排序算法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java圖像處理教程之正片疊底效果的實(shí)現(xiàn)

    Java圖像處理教程之正片疊底效果的實(shí)現(xiàn)

    正片疊底效果是我們平時(shí)在Photoshop中會(huì)見到的一種效果,下面這篇文章主要給大家介紹了關(guān)于利用Java如何實(shí)現(xiàn)正片疊底的效果,分享出來供大家參考學(xué)習(xí),文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友可以參考借鑒,下面來一起看看詳細(xì)的介紹吧。
    2017-09-09
  • MyBatis與Spring中的SqlSession詳解

    MyBatis與Spring中的SqlSession詳解

    在MyBatis中,你可以使用SqlSessionFactory來創(chuàng)建SqlSession,使用MyBatis-Spring之后,你不再需要直接使用SqlSessionFactory了,接下來通過示例代碼講解MyBatis與Spring中的SqlSession,需要的朋友可以參考下
    2024-05-05
  • Java中使用JavaScript腳本的方法步驟

    Java中使用JavaScript腳本的方法步驟

    這篇文章主要介紹了Java中使用JavaScript腳本的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06

最新評(píng)論

常山县| 平乐县| 闽侯县| 邵武市| 泸定县| 宝清县| 宁远县| 长葛市| 通化县| 冕宁县| 景东| 即墨市| 丰宁| 五莲县| 长岛县| 红河县| 刚察县| 法库县| 历史| 定西市| 额敏县| 凉城县| 宜兰市| 平度市| 德惠市| 五台县| 观塘区| 昔阳县| 林甸县| 巴楚县| 孝义市| 濮阳县| 灵璧县| 石阡县| 涞水县| 阿图什市| 大化| 扶沟县| 彝良县| 阜平县| 门头沟区|