激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - mybatis一對一查詢功能

mybatis一對一查詢功能

2020-08-13 12:04精品唯居 Java教程

所謂的一對一查詢,就是說我們在查詢一個表的數據的時候,需要關聯查詢其他表的數據。這篇文章主要介紹了mybatis一對一查詢功能,需要的朋友可以參考下

所謂的一對一查詢,就是說我們在查詢一個表的數據的時候,需要關聯查詢其他表的數據。

 需求

    首先說一個使用一對一查詢的小需求吧:假設我們在查詢某一個訂單的信息的時候,需要關聯查詢出創建這個訂單對應的用戶信息。表模型如下(

mybatis一對一查詢功能

 resulttype

  sql語句的書寫

    首先,我們要對我們的需求進行分析。1.我們需要確定這個需求需要涉及到哪兩張表,其中哪個是主表,哪個是關聯表。具體怎么確定,還是看需求——我們的需求是說,在查詢訂單的時候,順帶著查出創建這個訂單的用戶。那么,已經很顯然了。我們的主表是訂單表(orders)。而我們的關聯表則是用戶表(user)。

    這個時候,我們就可以寫出來如下sql語句了:

?
1
select * from orders

    這個時候,我們就應該考慮這個問題了:我們在關聯查詢的時候應該使用內鏈接?還是外鏈接?對于搞不清內鏈接外鏈接的區別的同學,我這里先簡單的介紹一下,等以后有時間了,再詳細寫一篇博客說明:內連接是只顯示滿足條件的。外鏈接分為左外和右外鏈接:左連接顯示左邊全部的再加上右邊與左邊相同的;右連接顯示右邊全部的和左邊與右邊相同的。

  我們的需求是通過訂單去關聯用戶,而由于在orders表中有一個外鍵(userid)。通過外鍵的去查關聯表user表的數據時,userid是user表的主鍵。這時,只能查到一條user的信息,而這條記錄不會導致我們的主查詢結果發生改變。所以,我們選擇內鏈接查詢。這時候,我們的sql語句是這樣的:

?
1
select * from orders,user where orders.user_id = user.id

    查詢完成后,出現結果如下:

mybatis一對一查詢功能

    這時,問題來了,我們發現,這個時候出現了兩個id,這就會導致我們的數據在輸出的時候封裝到對象時會出現問題。而且,user_id 這一列和我們的用戶id數據是重復的。我們需要改造我們的sql。怎么改造呢?

    因為我們的主表數據是要全部查詢的,而用戶表我們只需要username,sex,adress這三個信息(這里是假設,沒必要糾結需要的是啥信息)。那么我們就需要手動指定我們的sql語句的查詢字段了:    

?
1
2
3
4
5
6
7
8
9
select
 orders.*,
 user.username,
 user.sex,
 user.address
from
 orders,
 user
where orders.user_id = user.id

    前面的這些都是在我們的sql鏈接工具上進行查詢的,當可以顯示我們需要的數據庫后,我們的sql語句就確定了。這時我們該開始下一步了:

   創建pojo

    我們需要將查詢到的結果,通過mybatis框架將數據封裝到對應的對象。那么,問題來了,這個查詢到的數據由誰來接收?我們如果要將上邊sql查詢的結果映射到pojo中,pojo中必須包括所有查詢列名。但是不管是原來的orders類還是user類,都沒有辦法映射全部的字段。這時,我們有一個很簡單的解決辦法:根據返回的字段,專門寫一個類,讓它包含所有的查詢結果,然后讓這個類去接收這個返回的結果集。

    這時有個小技巧,我們的新的pojo中,不需要將所有的字段全部都寫上,我們可以讓新pojo去繼承我們的包含結果集中查詢字段較多的一個類,然后將其他需要的數據寫到這個子類中即可。

mybatis一對一查詢功能

    創建pojo完成后,我們就需要根據規范去創建我們的映射文件和寫對應的接口中的方法:

    mapper.xml

mybatis一對一查詢功能

    mapper.java中的接口:

mybatis一對一查詢功能

 resultmap

    sql語句上,resulttype 和resulemap實現的方式一樣,這里就直接跳過了。

  使用resultmap映射的思路

    我們知道,使用pojo的時候,我們可以將一些數據封裝到pojo的對象屬性中,他的屬性可以是簡單類型,也可以是另外一個pojo。這時,我們可以這么做:

    使用resultmap將查詢結果中的訂單信息映射到orders對象中,在orders類中添加user屬性,將關聯查詢出來的用戶信息映射到orders對象中的user屬性中。

    orders類中添加user屬性

mybatis一對一查詢功能

  mapper.xml

    用resultmap的方法將結果集進行映射的時候,我們需要進行兩個操作,一個是定義resultmap,設置每個查到的結果集中的列相對應的對象的屬性。這個比較麻煩但是不難。二就是定義我們的statement。

   resultmap

    resultmap實現的基本思路我們剛才已經說了。而且也在orders的pojo類中增加了相應的屬性了。接下啦,就是寫一個resultmap,將整個查詢的結果映射到orders中在這里面,首先是order訂單的映射。就是直接用id 和result標簽將兩者相互對應即可。然后就是,關聯的用戶信息的映射,這時候需要用到一個association的標簽,將在orders類中的user字段與user類進行映射,然后在其內部還是用id和result標簽,將查詢的數據和user的屬性相映射。

    具體代碼如下:   

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!-- 訂單查詢關聯用戶的resultmap
 將整個查詢的結果映射到cn.mybatis.po.orders中
  -->
 <resultmap type="cn.mybatis.po.orders" id="ordersuserresultmap">
  <!-- 配置映射的訂單信息 -->
  <!-- id:指定查詢列中的唯 一標識,訂單信息的中的唯 一標識,如果有多個列組成唯一標識,配置多個id
   column:訂單信息的唯 一標識 列
   property:訂單信息的唯 一標識 列所映射到orders中哪個屬性
   -->
  <id column="id" property="id"/>
  <result column="user_id" property="userid"/>
  <result column="number" property="number"/>
  <result column="createtime" property="createtime"/>
  <result column="note" property=note/>
  
  <!-- 配置映射的關聯的用戶信息 -->
  <!-- association:用于映射關聯查詢單個對象的信息
  property:要將關聯查詢的用戶信息映射到orders中哪個屬性
   -->
  <association property="user" javatype="cn.mybatis.po.user">
   <!-- id:關聯查詢用戶的唯 一標識
   column:指定唯 一標識用戶信息的列
   javatype:映射到user的哪個屬性
    -->
   <id column="user_id" property="id"/>
   <result column="username" property="username"/>
   <result column="sex" property="sex"/>
   <result column="address" property="address"/>
  
  </association>
 </resultmap>

   statement

    statement比較簡單,就是將返回結果集的映射方式改成resultmap。然后將返回類型只想我們剛完成的resultmap就可以了。

mybatis一對一查詢功能

  mapper.java    

mybatis一對一查詢功能

 兩者的區別

    實現一對一查詢的方法說完了,接下來分析下它們的不同之處,和優劣之處。

    首先,都需要對pojo進行修改,一個是增加一個pojo類另外一個則是修改pojo的字段。個人感覺,根據設計模式中的開閉原則。resulttype要比resultmap更好一些。

    其次,簡易程度上來說,使用resulttype實現較為簡單。從這點講,resulttype也要比resultmap更好一些。

    不過resultmap可以實現延遲加載,resulttype無法實現延遲加載。這方面resulttype就不如resultmap更好了。

    所以:建議大家,如果沒有查詢結果的特殊要求的話使用resulttype。

以上所述是小編給大家介紹的mybatis一對一查詢功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://www.cnblogs.com/liyasong/p/mybatis_ydycx.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91午夜在线观看 | 免费国产视频大全入口 | 日韩精品久久久久久久电影99爱 | 色七七亚洲 | 精品人成 | 国产99页| 亚洲午夜激情网 | 欧美一级毛片美99毛片 | 亚洲综合中文 | 一级毛片看 | 看国产毛片 | 免费国产在线视频 | 日韩黄在线观看 | 欧美日韩国产综合网 | 欧美成人精品h版在线观看 国产一级淫片在线观看 | 亚洲激情91 | 久久午夜国产 | www.com超碰 | 中文在线观看www | 99亚洲伊人久久精品影院红桃 | 黄污在线看 | 国产小视频在线 | 国产在线精品一区二区夜色 | 日本爽快片100色毛片视频 | 国产亚洲精品综合一区91 | 精品国产看高清国产毛片 | 91美女福利视频 | 亚洲影院在线 | 性生活视频软件 | 九九精品影院 | 羞羞视频免费网站男男 | 成人午夜免费在线观看 | 国产精品久久久久久久久久久天堂 | 亚洲骚综合 | 精品久久久久久久久久久久久久 | 91网页在线观看 | 久久国产午夜 | 日韩视频―中文字幕 | 狠狠撸电影 | 欧美精品成人一区二区三区四区 | 91成人在线网站 |