Springboot04 - Mybatis 多表查詢中的多對一(注解方式)

在開發(fā)中箱锐,我遇到這樣一種情況:每個種類(Categoy)中有多個屬性(Property),每個Category和Property都擁有自己的id屬性嘉汰。這種時候皿曲,我就需要使用到多對一的方式:多個屬性對應(yīng)一個種類(種類 為 屬性對象 的屬性)。

以下為開發(fā)中的相關(guān)記錄(注解方式實現(xiàn))

一粤铭、相關(guān)注解

1. @Results

  • 代替映射文件中的<resultMap>
  • 當(dāng)做select語句時挖胃,返回一個多對一的JavaBean時,需要用到Results來將數(shù)據(jù)庫的相關(guān)id映射成對象保存在Bean中(后面有實例)
  • 該注解中可以使用單個 @Result 注解梆惯,也可以使用一個 @Result注解集合
  • 用法:@Results( {@Result( ), @Result( ) } )

2. @Result

  • 代替了映射文件中中的<id> 和 <result>

  • 屬性介紹:

    • property:字符串酱鸭,JavaBean中需要映射的屬性,這里是 "Category"
    • column:字符串垛吗,數(shù)據(jù)庫的列名凛辣,可以看做 @One 中sql語句的參數(shù),這里是 "cid"
    • one:需要使用 @One 职烧,one = @One( )
    • many: 需要使用 @Many 扁誓,many=@Many( )
  • 用于實現(xiàn)Results中的具體映射:什么映射成什么,使用了什么Sql語句

3. @One (一對一)

  • 代替了<assocation>, 多表查詢的關(guān)鍵蚀之,在注解中用來指定子查詢返回艙單一對象給@Result前面的 property

  • 屬性介紹

    • select:指定用來多表查詢的 SqlMapper蝗敢,mapper包路徑+方法名
  • 使用:@Result(column=" ",property="",one=@One(select="") )

4. @Many (多對一)

  • 代替了<colletion>
  • 和@One用法類似,例如:一個Categorry 中包含很多個Property
  • 使用:@Result(property="",column="",many=@Many(select=""))

二足删、運行原理

從SQL查詢結(jié)果集到JavaBean或POJO實體的過程:

  1. 通過JDBC查詢得到一個ResultSet對象寿谴,里面包含了數(shù)據(jù)庫表的item
  2. 遍歷ResultSet對象,并將每行item保存到HashMap實例中失受,以數(shù)據(jù)庫中的字段名或設(shè)置的字段別名為鍵讶泰,以字段值為值
  3. 根據(jù)ResultMap(在注解中就是這里的Results)中的類型,這里是應(yīng)用注解時下方的函數(shù)返回類型拂到,通過反射實例化數(shù)據(jù)模型痪署,即實例化一個Property對象
  4. Property對象中的Category對象,通過@Result中的屬性實例化兄旬。這里是將參數(shù)column="cid"傳遞到@One中的sql語句中狼犯,返回的對象實例賦給category ( 通過 property="category" 設(shè)置 )

三、具體實現(xiàn)

@Select("select * from property where cid=#{category.id}")
    @Results({
            @Result(property = "category", column = "cid",
                    one = @One(select = "com.shan.tianmao.mapper.CategoryMapper.get"))
    })
    List<Property> findByCategory(@Param("category") Category category);
  • 此為PropertyMapper中的findByCategory方法领铐,用于利用Category查找對應(yīng)的Property

  • java類結(jié)構(gòu)為:Property中有一個Category屬性

    表結(jié)構(gòu)為:Property中有一個cid屬性

  • 特別注意:當(dāng)向函數(shù)傳遞對象參數(shù)時悯森,需要使用@Param( " 別名")注解,同時使用 category.id 調(diào)用

  • 原理講解:

    1. 通過JDBC查詢得到一個ResultSet對象绪撵,里面包含了數(shù)據(jù)庫表的property{id, cid, name }瓢姻,cid為Category的id

      @Select("select * from property where cid=#{category.id}")
      
    2. 通過遍歷ResultSet對象,并將每行property保存到HashMap實例中音诈,以數(shù)據(jù)庫中的字段名或設(shè)置的字段別名為鍵幻碱,以字段值為值

    3. 根據(jù)下方的函數(shù)返回類型 List<Property>续膳,通過反射實例化Property模型

    4. Property對象中的category屬性,通過@Result中的屬性實例化收班。這里是將參數(shù)column="cid"傳遞到@One中的sql語句中坟岔,返回的對象實例賦給category ( 通過 property="category" 設(shè)置 )

      @Result(property = "category", column = "cid",
                          one = @One(select = "com.shan.tianmao.mapper.CategoryMapper.get"))
      

附兩個實體類代碼:

  • Category

    package com.shan.tianmao.pojo;
    
    public class Category {
        private int id;
        private String name;
    
        public Category() {
        }
    
        public Category(int id, String name) {
            this.id = id;
            this.name = name;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    
  • Property

    package com.shan.tianmao.pojo;
    
    public class Property {
        private int id;
        private String name;
        private Category category;
    
        public Property() {
        }
    
        public Property(int id, String name, Category category) {
            this.id = id;
            this.name = name;
            this.category = category;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Category getCategory() {
            return category;
        }
    
        public void setCategory(Category category) {
            this.category = category;
        }
    }
    
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市摔桦,隨后出現(xiàn)的幾起案子社付,更是在濱河造成了極大的恐慌,老刑警劉巖邻耕,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸥咖,死亡現(xiàn)場離奇詭異,居然都是意外死亡兄世,警方通過查閱死者的電腦和手機啼辣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來御滩,“玉大人鸥拧,你說我怎么就攤上這事∠鹘猓” “怎么了富弦?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長氛驮。 經(jīng)常有香客問我腕柜,道長,這世上最難降的妖魔是什么矫废? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任盏缤,我火速辦了婚禮,結(jié)果婚禮上蓖扑,老公的妹妹穿的比我還像新娘唉铜。我一直安慰自己,他們只是感情好赵誓,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布打毛。 她就那樣靜靜地躺著,像睡著了一般俩功。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碰声,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天诡蜓,我揣著相機與錄音,去河邊找鬼胰挑。 笑死蔓罚,一個胖子當(dāng)著我的面吹牛椿肩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豺谈,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼郑象,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了茬末?” 一聲冷哼從身側(cè)響起厂榛,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丽惭,沒想到半個月后击奶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡责掏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年柜砾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片换衬。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡痰驱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瞳浦,到底是詐尸還是另有隱情萄唇,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布术幔,位于F島的核電站另萤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏诅挑。R本人自食惡果不足惜四敞,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拔妥。 院中可真熱鬧忿危,春花似錦、人聲如沸没龙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硬纤。三九已至解滓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筝家,已是汗流浹背洼裤。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留溪王,地道東北人腮鞍。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓值骇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親移国。 傳聞我的和親對象是個殘疾皇子吱瘩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容