MyBatis 學習記錄3 MapperMethod類

主題

  以前學習了一下MapperProxy的生產過程,自定義Mapper類的對象是經過動態代理生產的,調用自定義方法的時候其實是調用了MapperMethod的execute方法:mapperMethod.execute(sqlSession, args);因此想再簡單學習記錄下MapperMethod類java

 

組成

從上圖可知,MapperMethod只有2個成員域,都是靜態內部類,因此sql

MapperMethod ≈ SqlCommand + MethodSignatureapp

 

 

 SqlCommand ≈ name + SqlCommandType,其中name是相似於test.mapper.UserMapper.selectByPrimaryKey的字符串至關因而標識這個MapperMethod是哪一個自定義方法對應的MapperMethod學習

SqlCommandType是個枚舉翻譯

從上圖中就能夠明白就是對應於你在XML文件中寫的標籤,是select標籤仍是update標籤仍是其餘.標識這個SQL是那種DML3d

 

MethodSignature ≈ java.lang.reflect.Method的封裝,會記錄你自定義的方法的一些信息,好比返回值是集合仍是單個對象仍是Void? 方法參數是否有命名參數(@Param)?等等代理

 

查詢時

從以前的學習中我已經知道MapperProxy是Mapper的動態代理實現,他的invoke方法會調用MapperMethod的execute方法.因此咱們來看看這個execute方法對象

從圖中咱們就知道了爲啥MapperMethod須要SqlCommond和MethodSignature這2個成員域了.blog

根據SqlCommond的類型,好比insert,仍是update來決定調用sqlSession的insert仍是update等方法字符串

根據方法的返回類型,還決定是要掉selectOne仍是selectList等.

最終都是用SqlSession的對應方法來查詢的,因此無論你在自定義Mapper中寫什麼方法.最終都會轉到SqlSession的對應方法.

中途還有一些參數的包裝,好比把你自定義方法的多個參數放到一個map裏,或者收集命名參數等等.

 

小結

MapperMethod這個類的做用就是把你自定義的Mapper裏的方法和參數翻譯成sqlSession裏定義的那些selectOne呀selectMany等等方法.這樣當調用你自定義的方法的時候MethodProxy就可以執行sqlSession對應的方法了.

相關文章
相關標籤/搜索