Mybatis入門篇之結果對映,你射準了嗎?
阿新 • • 發佈:2020-09-04
### 目錄
- 前言
- 什麼是結果對映?
- 如何對映?
- 別名對映
- 駝峰對映
- 配置檔案開啟駝峰對映
- 配置類中開啟駝峰對映
- resultMap對映
- 總結
- 高階結果對映
- 關聯(association)
- 例子
- 關聯的巢狀 Select 查詢
- 關聯的巢狀結果對映
- 總結
- 集合collection
- 集合的巢狀 Select 查詢
- 集合的巢狀結果對映
- 總結
## 前言
- 上一篇文章介紹了Mybatis基礎的CRUD操作、常用的標籤、屬性等內容,如果對部分不熟悉的朋友可以看[Mybatis入門之基本操作](https://mp.weixin.qq.com/s/KdrEvlShnVoYA8nr0qLSNw)。
- 本篇文章繼續講解Mybatis的結果對映的內容,想要在企業開發中靈活的使用Mybatis,這部分的內容是必須要精通的。
## 什麼是結果對映?
- 簡單的來說就是一條`SQL查詢語句`返回的欄位如何與`Java實體類`中的屬性相對應。
- 如下一條SQL語句,查詢患者的使用者id,科室id,主治醫生id:
```xml
```
- Java實體類`PatientInfo`如下:
```java
@Data
public class PatientInfo{
private String userId;
private String deptId;
private String docId;
}
```
- 程式設計師寫這條SQL的目的就是想查詢出來的`user_id`,`dept_id`,`doc_id`分別賦值給實體類中的`userId`,`deptId`,`docId`。這就是簡單的結果對映。
## 如何對映?
- Myabtis中的結果對映有很多種方式,下面會逐一介紹。
### 別名對映
- 這個簡單,保持查詢的SQL返回的欄位和Java實體類一樣即可,比如上面例子的SQL可以寫成:
```xml
```
- 這樣就能和實體類中的屬性對映成功了。
### 駝峰對映
- Mybatis提供了駝峰命名對映的方式,比如資料庫中的`user_id`這個欄位,能夠自動對映到`userId`屬性。那麼此時的查詢的SQL變成如下即可:
```xml
```
- 如何開啟呢?與SpringBoot整合後開啟其實很簡單,有兩種方式,一個是配置檔案中開啟,一個是配置類開啟。
#### 配置檔案開啟駝峰對映
- 只需要在`application.properties`檔案中新增如下一行程式碼即可:
```properties
mybatis.configuration.map-underscore-to-camel-case=true
```
#### 配置類中開啟駝峰對映【簡單瞭解,後續原始碼章節著重介紹】
- 這種方式需要你對原始碼有一定的瞭解,上一篇入門教程中有提到,Mybatis與Springboot整合後適配了一個starter,那麼肯定會有自動配置類,Mybatis的自動配置類是`MybatisAutoConfiguration`,其中有這麼一段程式碼,如下:
![](https://gitee.com/chenjiabing666/Blog-file/raw/master/Mybatis-%E7%BB%93%E6%9E%9C%E6%98%A0%E5%B0%84/1.png)
- `@ConditionalOnMissingBean`這個註解的意思就是當IOC容器中沒有`SqlSessionFactory`這個Bean物件這個配置才會生效;`applyConfiguration(factory)`這行程式碼就是建立一個`org.apache.ibatis.session.Configuration`賦值給`SqlSessionFactoryBean`。原始碼分析到這,應該很清楚了,無非就是自己在容器中建立一個`SqlSessionFactory`,然後設定屬性即可,如下程式碼:
```java
@Bean("sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
//設定資料來源
sqlSessionFactoryBean.setDataSource(dataSource);
//設定xml檔案的位置
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATOIN));
//建立Configuration
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
// 開啟駝峰命名對映
configuration.setMapUnderscoreToCamelCase(true);
configuration.setDefaultFetchSize(100);
configuration.setDefaultStatementTimeout(30);
sqlSessionFactoryBean.setConfiguration(configuration);
//將typehandler註冊到mybatis
sqlSessionFactoryBean.setTypeHandlers(typeHandlers());
return sqlSessionFactoryBean.getObject();
}
```
- **注意**:如果對`SqlSessionFactory`沒有特殊定製,不介意重寫,因為這會自動覆蓋自動配置類中的配置。
### resultMap對映
- 什麼是`resultMap`?簡單的說就是一個類似Map的結構,將資料庫中的欄位和JavaBean中的屬性欄位對應起來,這樣就能做到一一映射了。
- 上述的例子使用resultMap又會怎麼寫呢?如下:
```xml
```
- 其實很簡單,就是創