1. 程式人生 > >mybatis中的相關概念小結

mybatis中的相關概念小結

上一篇文章中總結了mybatis的入門原始dao開發和mapper代理開發,忽略了很多概念性的東西,以及相關相似概念的區別,因此筆者在此,進行相關基本概念的總結,用於自我學習的記錄。(ps:概念性的東西是基礎,是往後理解其思想的基本必備知識)

  • parameterType:對映檔案XXXMapper.xml中指定輸入引數的型別。
  • resultType:對映檔案XXXMapper.xml中指定輸出引數的型別。
  • #{}與${}的區別:
  1. #{}表示一個佔位符,#{}接收輸入引數,型別可以是簡單型別,pojo,hashmap等。如果接收簡單型別,#{}可以寫成value或者其他名稱,如果接收的是pojo物件值,通過OGNL讀取物件中的屬性值,通過屬性.屬性.屬性....的方式獲取物件屬性值。
  2. ${}表示一個拼接符號,會引用sql注入,所以不建議使用${}。${}接收輸入引數型別可以是簡單型別,pojo,hashmap,如果接收簡單型別,${}只能寫成value,${}接收pojo物件值,通過OGNL讀取物件中的屬性值,通過屬性.屬性.屬性....的方式獲取物件屬性值。
  • selectOne和selectList的區別:selectList可以有selectOne的功能,但是selectOne不能有selectList的功能。包含於被包含的關係。
  • SqlSessionFactoryBuilder:用於得到SqlSessionFactory物件,建立該會話工廠。
  • SqlSessionFactory:會話工廠,使用者得到SqlSession物件,建立該會話。注意SqlSessionFactory是執行緒安全的。可以通過單例模式管理。
  • SqlSession:會話,面向使用者的介面,提供了很多操作資料庫的方法。注意SqlSession的執行緒不安全的,建議在區域性範圍內使用。
  • typeAliases(別名):mybatis預設支援的別名:

         當然我們不僅僅使用的就是這些型別,其中包括了自定義型別:看下面這段程式碼:

        

可以發現的是包名很長,尤其當路徑一複雜的時候,整個文件下來機會看到的都是h.l.pojo.xxx,這個是開發者所不願意看到的,因此我們可以給他取一個別名,用來標記他(就好比大家知道Is-Me-Hl指代的就是某某):

       

       

這樣整個配置檔案也就看起來“乾淨”很多。是開發者們所希望的。當然還可以批量定義別名,mybatis掃描完指定的包後,自動定義別名,雷明就是別名,不區分大小寫,都允許。

                

(ps:這裡給個提醒,也是筆者一開始學習過程中遇到的問題:mybatis的配置檔案裡面的標籤必須按照一定順序寫,如果不按順序寫,會提示或者報錯:)

The content of element type "configuration" must match"(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".

解決上述這個錯誤的方法就是按照標籤的順序在相對應的位置上寫標籤(注意:指的是標籤的前後順序),這裡給個順序參考:

<configuration>

    <properties>
        <property/>
    </properties>

    <settings>
        <setting/>
    </settings>

    <typeAliases>
        <typeAlias/>
    </typeAliases>

    <environments>
        <environment></environment>
    </environments>

    <mappers>
        <mapper/>
    </mappers>

</configuration>
  • typeHandlers:型別處理器,完成jdbc型別和Java型別之間的轉化。mybatis提供了很多的預設型別處理器讓開發者使用。關於自定義型別處理器,後面的文章總結。
  • resultType和resultMap區別:
  1. resultType:使用resultType進行輸出對映,只有查詢出來的列名和pojo中的屬性名一致,該列才可以對映成功。如果查詢出來的列名和pojo中的屬性名全部不一致,沒有建立pojo物件。只要查詢出來的列名和pojo中的屬性有一個一致,就會建立pojo物件。
  2. resultMap:完成高階輸出結果對映。如果查詢出來的列名和pojo的屬性名不一致,通過定義一個resultMap對列名和pojo屬性名之間作一個對映關係。下面就看看具體是怎麼用的:

         

  • 動態sql:mybatis的核心,對sql進行靈活的操作,通過表示式進行判斷,對sql進行靈活拼接和組裝。

        

上面的這段程式碼,就是簡單使用動態sql的一個例子:進行了sql拼接,判斷id是否為空,如果不為空的話就進行拼接,為空就不拼接。

  • sql片段:將動態sql判斷程式碼塊抽取出來,組成一個sql片段,其他的statement中就可以引用sql片段。

          

  • foreach:向sql傳遞陣列或者List,mybatis使用foreach解析

        

  • 延遲載入:mybatis預設不開啟。後面總結。
  • 查詢快取:系統預設開啟一級快取(sqlSession級別),二級需要去設定(Mapper級別),後面總結。

 注:以上文章僅是個人學習過程總結,若有不當之處,望不吝賜教。