1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      Mybatis中resultMap功能怎么用

      這篇文章主要介紹了Mybatis中resultMap功能怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

      網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、微信平臺小程序開發(fā)、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了新羅免費建站歡迎大家使用!

      前言

      在Mybatis中,有一個強大的功能元素resultMap。當我們希望將JDBC ResultSets中的數(shù)據(jù),轉(zhuǎn)化為合理的Java對象時,你就能感受到它的非凡之處。正如其官方所述的那樣:

      resultMap元素是 MyBatis 中最重要最強大的元素。它可以讓你從 90% 的 JDBC ResultSets 數(shù)據(jù)提取代碼中解放出來,并在一些情形下允許你進行一些 JDBC 不支持的操作。實際上,在為一些比如連接的復雜語句編寫映射代碼的時候,一份 resultMap 能夠代替實現(xiàn)同等功能的長達數(shù)千行的代碼。ResultMap 的設計思想是,對于簡單的語句根本不需要配置顯式的結(jié)果映射,而對于復雜一點的語句只需要描述它們的關(guān)系就行了。

      一、字段映射

      在Mybatis中,最簡單的結(jié)果映射方式,就是通過類型別名typeAliases來處理。

      如果要這樣做,那么第一步需要配置實體類包的路徑:

      mybatis.type-aliases-package=com.xxx.entity

      該路徑下的所有類,就會被注冊到TYPE_ALIASES容器。我們在指定返回值類型的時候,就直接用別名即可。

      比如,我們有一個User類:

      @Datapublic class User { private String id; private String username; private String password; private String address; private String email;}

      如果數(shù)據(jù)庫中表的字段與User類的屬性名稱一致,我們就可以使用resultType來返回。

      當然,這是理想狀態(tài)下,屬性和字段名都完全一致的情況。但事實上,不一致的情況是有的,這時候我們的resultMap就要登場了。

      如果User類保持不變,但SQL語句發(fā)生了變化,將id改成了uid。

      那么,在結(jié)果集中,我們將會丟失id數(shù)據(jù)。這時候我們就可以定義一個resultMap,來映射不一樣的字段。

      然后,我們把上面的select語句中的resultType修改為resultMap="getUserByIdMap" 。

      這里面column對應的是數(shù)據(jù)庫的列名或別名;property對應的是結(jié)果集的字段或?qū)傩浴?/p>

      這就是resultMap最簡單,也最基礎(chǔ)的用法:字段映射。

      下面,我們看看其他幾種標簽都是怎么應用的。

      元素名稱描述
      constructor用于在實例化類時,注入結(jié)果到構(gòu)造方法中
      association關(guān)聯(lián)一個對象
      collection關(guān)聯(lián)多個對象

      二、構(gòu)造方法

      如果你希望將結(jié)果注入構(gòu)造方法里,就可以用到constructor元素。

      比如,我們的User類增加了一個構(gòu)造方法:

      public User(String id, String name) {this.id = id+"--------";this.username = name+"--------";}

      我們需要在resultMap中定義constructor元素:

      其中,column代表數(shù)據(jù)庫字段名稱或者別名;name則是構(gòu)造方法中的參數(shù)名稱;javaType指定了參數(shù)的類型。

      如你所想,這樣指定構(gòu)造方法后,我們結(jié)果集中的id和username屬性都會發(fā)生變化。

      { "id": "1001--------", "username": "后羿--------", "password": "123456", "address": "北京市海淀區(qū)", "email": "510273027@qq.com"}

      三、關(guān)聯(lián)

      在實際的業(yè)務中,我們的用戶一般都會有一個角色。那么在User類里面一般也是以一個實體類來表示。

      @Datapublic class User { //省略用戶屬性... //角色信息 private Role role;}

      我們在查詢用戶的時候,如果也希望看到它的角色信息,我們會這樣來寫查詢語句:

      如上,就要查詢單個用戶以及用戶的角色信息。不過在這里,我們不能用resultType=User來返回。

      畢竟,User類中只有一個Role對象,并沒有role_id和role_name字段屬性。

      所以,我們要使用association來關(guān)聯(lián)它們。

      最后我們就可以將角色信息一塊顯示出來:

      { "id": "1001", "username": "后羿", "password": "123456", "address": "北京市海淀區(qū)", "email": "510273027@qq.com", "role": { "id": "3", "name": "射手" }}

      事實上,如果你確定關(guān)聯(lián)信息是一對一的情況,有個更簡便的方法可以替代association,我們在本文的第五部分-自動填充關(guān)聯(lián)對象再看它是怎么實現(xiàn)的。

      四、集合

      1、集合的嵌套結(jié)果映射

      上面我們看到一個用戶后羿,它的角色是射手;但大部分時候,我們每個人都不可能只擁有一種角色。所以,我們需要將User類中的角色屬性的類型改成List。

      @Datapublic class User { //省略用戶屬性... //角色信息 private List roles;}

      現(xiàn)在就變成了一個用戶對應多個角色,所以就不是簡單的association。

      因為association處理的是有一個類型的關(guān)聯(lián);而我們這里是有多個類型的關(guān)聯(lián),所以就需要用到collection屬性。

      我們整體的resultMap會變成下面這樣:

      這樣的話,即便你有多個角色也可以被正確顯示:

      { "id": "1003", "username": "貂蟬", "password": "123456", "address": "北京市東城區(qū)", "email": "510273027@qq.com", "roles": [  {   "id": "1",   "name": "中單"  },  {   "id": "2",   "name": "打野"  } ]}

      2、集合的嵌套 Select 查詢

      在大部分業(yè)務系統(tǒng)中,我們都會有一個菜單的表,比如像下面這樣,一張Menu表:

      idnameurlparent_id
      1系統(tǒng)管理
      0
      1001用戶管理/user1
      1002角色管理/role1
      1003單位管理/employer1
      2平臺監(jiān)控
      0
      2001系統(tǒng)監(jiān)控/system/monitor2
      2002數(shù)據(jù)監(jiān)控/data/monitor2

      這里我們給菜單分為兩級。我們給前端返回菜單的時候,也是需要分級的,不可能將這7條數(shù)據(jù)平級展示。那么,在這里我們的Menu實體類如下:

      @Datapublic class Menu { private String id; private String name; private String url; private String parent_id; private List

      childMenu;}

      一級菜單,包含一個二級菜單的列表,這里用childMenu來表示。

      SQL語句中,如果沒有parent_id字段屬性,我們就先查所有的一級菜單:

      這個查詢語句,在不傳輸任何參數(shù)的情況下,我們會得到兩條一級菜單的數(shù)據(jù)。

      那么在只調(diào)用此方法一次的情況下,怎么把所有的菜單信息查詢出來,并按層級展示呢?

      我們來看menusMap的定義:

      重點來看collection元素:

      property="childMenu" 對應的是菜單中的子級菜單列表;

      ofType="Menu" 對應返回數(shù)據(jù)的類型;

      select="getMenus" 指定了SELECT語句的id;

      column="{parent_id=id}" 則是參數(shù)的表達式。

      這個collection整體的含義可以這樣理解:

      通過getMenus這個SELECT語句來獲取一級菜單中的childMenu屬性結(jié)果;在上面的SELECT語句中,需要傳遞一個parent_id參數(shù);這個參數(shù)的值就是一級菜單中的id。

      通過這種方式,我們就可以得到已分級的所有菜單信息。

      [ {  "id": "1",  "name": "系統(tǒng)管理",  "parent_id": "0",  "childMenu": [   {    "id": "1001",    "name": "用戶管理",    "url": "/user",    "parent_id": "1"   },   {    "id": "1002",    "name": "角色管理",    "url": "/role",    "parent_id": "1"   },   {    "id": "1003",    "name": "單位管理",    "url": "/employer",    "parent_id": "1"   }  ] }, {  "id": "2",  "name": "平臺監(jiān)控",  "parent_id": "0",  "childMenu": [   {    "id": "2001",    "name": "系統(tǒng)監(jiān)控",    "url": "/system/monitor",    "parent_id": "2"   },   {    "id": "2002",    "name": "數(shù)據(jù)監(jiān)控",    "url": "/data/monitor",    "parent_id": "2"   }  ] }]

      五、自動填充關(guān)聯(lián)對象

      我們知道,在Mybatis解析返回值的時候。

      第一步是獲取返回值類型,拿到Class對象,然后獲取構(gòu)造器,設置可訪問并返回實例,然后又把它包裝成MetaObject對象。

      從數(shù)據(jù)庫rs中拿到結(jié)果之后,會調(diào)用MetaObject.setValue(String name, Object value) 來填充對象。

      在這過程中,有趣的是,它會以.來分隔這個name屬性。

      如果name屬性中包含.符號,就找到.符號之前的屬性名稱,把它當做一個實體對象來處理。

      可能筆者在這里描述的不夠直觀,我們還是來看例子。

      在本文第三部分中,我們有一個用戶對應一個角色的例子。

      其中,User類定義如下:

      @Datapublic class User { //省略用戶屬性... //角色信息 private Role role;}

      在這里,我們無需定義resultMap,直接返回resultType=User即可。不過需要把role信息的別名修改一下,重點是.符號

      這樣,在Mybatis解析到role.id屬性的時候,以.符號分隔之后發(fā)現(xiàn),role別名對應的是Role對象,則會先初始化Role對象,并將值賦予id屬性。

      相關(guān)代碼如圖:

      Mybatis中resultMap功能怎么用

      感謝你能夠認真閱讀完這篇文章,希望小編分享的“Mybatis中resultMap功能怎么用”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!


      網(wǎng)站標題:Mybatis中resultMap功能怎么用
      URL標題:http://ef60e0e.cn/article/poogdi.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        贡觉县| 白水县| 江山市| 社会| 牟定县| 胶南市| 平昌县| 视频| 浮山县| 大厂| 克山县| 上虞市| 昔阳县| 白河县| 沾化县| 神木县| 叶城县| 资溪县| 永城市| 长白| 从化市| 景德镇市| 高阳县| 竹北市| 宜宾市| 洪湖市| 尤溪县| 澜沧| 福州市| 牟定县| 平塘县| 宁强县| 海晏县| 射阳县| 武陟县| 古丈县| 诸暨市| 舟曲县| 历史| 织金县| 绥滨县|