Mybatis 強大的結果集對映器resultMap
阿新 • • 發佈:2020-05-24
![](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