1. 程式人生 > >Mybatis 強大的結果集對映器resultMap

Mybatis 強大的結果集對映器resultMap

![](https://img2020.cnblogs.com/other/1739473/202005/1739473-20200524091305801-1718891610.jpg) ## 1. 前言 > `resultMap` 元素是 MyBatis 中最重要最強大的元素。它可以讓你從 90% 的 JDBC `ResultSets` 資料提取程式碼中解放出來,並在一些情形下允許你進行一些 JDBC 不支援的操作。實際上,在為一些比如連線的複雜語句編寫對映程式碼的時候,一份 `resultMap` 能夠代替實現同等功能的數千行程式碼。ResultMap 的設計思想是,對簡單的語句做到零配置,對於複雜一點的語句,只需要描述語句之間的關係就行了。 `resultMap` 可以將查詢到的複雜資料,比如多張表的資料、一對一對映、一對多對映等複雜關係聚合到一個結果集當中。日常的業務開發通常都會和它打交道,今天就對 `resultMap` 進行一個詳細講解。 ## 2. resultMap 接下來我們來看看 `resultMap` 是如何進行對映的。 ### 2.1 Getter/Setter 注入 我們宣告一個數據庫對應的實體類: ```java /** * @author felord.cn * @since 16:50 **/ @Data public class Employee implements Serializable { private static final long serialVersionUID = -7145891282327539285L; private String employeeId; private String employeeName; private Integer employeeType; } ``` 那麼它對應的 `resultMap` 為: ```xml ``` 我們來解釋這些配置的屬性: ```xml ``` 以上方式是通過 **Getter** 和 **Setter** 方法進行注入,也就是實體類必須有無參構造,對應屬性必須有**Getter** 和 **Setter** 方法。 ### 2.2 構造注入 **Getter** 和 **Setter** 方法進行注入是我們最常用的方式。但是 **Mybatis** 同樣支援構造注入,如果 `Employee` 存在如下構造方法: ```java public Employee(String employeeId, String employeeName, Integer employeeType) { this.employeeId = employeeId; this.employeeName = employeeName; this.employeeType = employeeType; } ``` 那麼對應的 `resultMap` 可以這樣寫: ```xml ``` 細心的同學發現這裡並沒有 `property` 屬性,其實當你不宣告`property` 屬性時會按照構造方法的引數列表順序進行注入。 在 **Mybatis 3.4.3** 引入了 `name` 屬性後我們就可以打亂 `constructor` 標籤內的 `arg` 元素的順序了。 ```xml ``` ### 2.3 繼承關係 像 **Java** 中的類一樣,`resultMap` 也是可以繼承的。下面是兩個有繼承關係的 **Java** 類: ![](https://img2020.cnblogs.com/other/1739473/202005/1739473-20200524091305985-777293798.png) 那麼 `RegularEmployee` 的 `resultMap` 就可以這麼寫: ```xml ``` 跟 **Java** 的繼承關鍵字一樣使用 `extends` 來進行繼承。 ### 2.4 一對一關聯 明眼人會看出來 **2.3** 最後一個 `resultMap` 示例中有一個 `association` 標籤。這個用來做什麼用呢?打個比方,每一個正式員工 `RegularEmployee`會對應一個部門 `Department`,業務中會有把這種 **一對一** 關係查詢出來的需求。所以 `association` 就派上了用場。 ```xml ``` > `association` 可以繼續巢狀下去,有可能關聯的物件中還有一對一關係。 ### 2.5 一對多關聯 有一對一關聯,自然會有一對多關聯。我們反客為主,一個部門有多個員工,我們可能需要查詢一個部門的資訊以及所有員工的資訊裝載到 `DepartmentAndEmployeeList`中去。 ```java /** * @author felord.cn * @since 15:33 **/ public class DepartmentAndEmployeeList extends Department { private static final long serialVersionUID = -2503893191396554581L; priv