當前位置:成語大全網 - 書法字典 - 如何在MyBatis-Plus中使用結果映射

如何在MyBatis-Plus中使用結果映射

MyBatis-Plus對MyBatis基本無創,可以和MyBatis混用,非常好。

當涉及到添加、刪除、檢查和修改關系數據庫的業務時,我更喜歡使用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用於實體類: