1. 程式人生 > >Mybatis入門篇之結果對映,你射準了嗎?

Mybatis入門篇之結果對映,你射準了嗎?

### 目錄 - 前言 - 什麼是結果對映? - 如何對映? - 別名對映 - 駝峰對映 - 配置檔案開啟駝峰對映 - 配置類中開啟駝峰對映 - 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 ``` - 其實很簡單,就是創