當涉及到添加、刪除、檢查和修改關系數據庫的業務時,我更喜歡使用MyBatis-Plus,它在開發方面效率極高。具體使用可以參考官網,也可以自己感受。
讓我們簡單總結壹下如何在MyBatis-Plus中使用ResultMap。
先看壹個例子:
有如下兩個表格:
其中tb_hero中的出價與tb_book表的id相關聯。
我們先來看看Hero實體類的代碼,如下所示:
註意,我特意將tb_hero表中的bid字段映射到實體類hero中的bookId屬性。
MyBatis-Plus打印的SQL是:
沒問題,MyBatis-Plus會根據@TableField指定的映射關系生成相應的SQL。
MyBatis-Plus打印的SQL是:
沒毛病。您可以看到生成的SELECT已經將bid作為別名bookId。
例如,現在我想連接兩個表tb_hero和tb_book,如下所示:
通過查詢MyBatis-Plus打印的SQL是:
SQL沒有任何問題,過濾和分頁也很正常,但此時您會發現bookId屬性為null,如下所示:
為什麽?
未調用BaseMapper中的內置selectById()方法。
回過頭來,讓我們比較壹下我們自己在HeroMapper中定義的查詢和MyBatis-Plus附帶的selectById()之間的區別。還記得之前的測試嗎?生成的SQL有什麽區別?
原來,當MyBatis-Plus為BaseMapper中構建的方法生成SQL時,它會在SELECT子句中別名bid,而MyBatis-Plus自己編寫的查詢不會幫助您修改SELECT子句,這將導致bookId的null屬性。
這裏,tb_hero表中的bid字段映射到實體類hero中的bid屬性。這當然可以解決問題,但不是本文的重點。
請在@TableName處設置autoResultMap = true。
然後將@ResultMap註釋添加到自定義查詢中,如下所示:
這樣,問題也可以得到解決。
讓我們簡單看壹下源代碼。@ result map(“my batis-plus _ entity class name“)是怎麽來的?
有關詳細信息,請參見:com . baomi dou . mybatisplus . core . metadata . tableinfo # initresultmapifneed()。
註意上面字符串id的構成,應該能看懂。
思考:默認情況下,這種方式的結果映射與@TableName綁定在壹起。如果它是壹個聚合查詢或者查詢的結果與真實的表不對應怎麽辦?有沒有更優雅的方式?
基於以上思考,我做了以下簡單的實現:
關鍵代碼實際上只有幾行,所以耐心看完之後應該不難理解。
用例子來說明更直觀。
以下是壹個聚合查詢:
BookAgg的定義如下,註釋@AutoResultMap用於實體類: