1. 程式人生 > >Mybatis知識點回顧/總結

Mybatis知識點回顧/總結

一:mybatis基本工作流程

                         1.sqlMapConfig.xml:mybatis全域性配置檔案,配置了資料來源,事務等mybatis的執行環境,與spring整合後由spring的配置檔案接管mapper.xml對映檔案(配置sql語句等)

                         2.sqlSessionFactory(會話工廠):建立sqlSession(根據配置檔案建立)。

                                 3.sqlSession:操作資料庫(crud):是一個面向使用者的介面

                                 4.Executor(執行器):SqlSession內部通過該執行器操做資料庫(是一個介面:分為基本執行器和快取執行器)

                                 5.mapped Statement:(底層封裝物件):對操作資料庫儲存封裝:包括sql語句,輸入引數,輸出結果型別進行封裝。

二:開發細節

                        1.mybatis中sql語句的佔位符用#{}表示。

                                2.#{}中的值表示接收輸入引數,如果輸入引數型別為簡單型別,其中的名稱可以為任意值。

                                3.${}:表示拼接sql串,將接受到引數的內容不加任何修飾拼接在sql中。注意:使用${}拼接sql,會引起sql注入,${value}:接收輸入引數內容為簡單型別,必須為value.

                                4.主鍵返回策略:

                                主鍵id為自增型別:select Last_insert_ID().

配置中使用selectKey標籤,標籤屬性KeyProperty:將查詢的主鍵返回值設定到物件的哪個屬性中。order:相對於insert執行語句的執行順序。resultType:返回的結果型別。

三:mybatis與hibernate的區別

hibernate:是一個標準的ORM對映,不需要寫sql語句,sql語句會全自動生成,同時對sql語句進行優化,修改比較困難。應用場景:適用於需求變化不多的中小型專案(ORM,OA...)


mybatis:專注於sql本身,需要自己編寫sql,sql語句的修改優化比較方便,是一個不完全的ORM框架,雖然自己寫sql,也可以實現對映。應用場景:適用於需求變化較多的專案(網際網路專案)

企業進行技術選型,是以低成本,高回報作為技術選型的原則。

四:sqlSession應用場合

        sqlSession是一個面向使用者的介面,是執行緒不安全的,在SqlSession中的實現類中除了有方法,還有資料域屬性,因此是多例的。   

          sqlSession最佳應用場合是在方法體內,定義區域性變數。

五:原始dao問題總結

          1.dao介面實現類方法中存在大量模板方法,重複程式碼較多

           2.呼叫sqlsession方法statement的id硬編碼 。

           3.sqlsession傳入的變數為object型,如果引數傳遞錯誤,編譯階段會報錯

六:mapper代理方法(對原始dao的優化)

           mapper代理方法能夠省去實現類這一步驟

           使用步驟:

                    1.程式設計師需要編寫mapper.xml檔案

                    2.編寫mapper介面需要依據規範:

                              ①:在mapper,xml中namespace等於mapper介面的地址。

                              ②:mapper介面的方法名須和xml中statement的id一致

                              ③:mapper介面的方法輸入引數須和xml中parameterType型別一致。

                              ④:mapper介面方法的返回值型別須和xml中的resultType型別一致。

                    3.獲取自動生成的實現類物件

                              sqlSession.getMapper(介面名.class);

七:SqlMapConfig,xml解析

        1.properties標籤:

                   可以引用一些properties的資原始檔。注意:不建議在properties標籤裡新增屬性,可能會覆蓋掉其他相同名稱的屬性值。

           2.Setting標籤:

                   配置全域性引數:主要是跟Mybaties執行相關的一些引數,具體配置詳見mybaties-setting.xlsx檔案

           3.typeAliases

                  別名定義。在mybatis中的resultType和parameterType的型別有可能是自定義的pojo型別,地址很長,不利於開發,可以使用別名定義。

                  批量別名定義:在其中使用package標籤,name為保明,別名為類名,首字母不區分大小寫。

           4.型別處理器

                 jdbc型別與Java型別之間的相互轉換,mybatis提供了許多轉換型別,因此一般不需要我們手動配置。

           5.mapper

                class屬性載入的是通過mapper介面載入對映檔案,但需要遵循一些規範:需要將mapper介面類名和mapper.xml對映檔名稱一致,且在同一個目錄當中。

                mapper批量載入:遵循上述規範,用package標籤

八:輸入對映

            自定義包裝型別,可以將很多pojo類以及擴充套件類定義在包裝型別中,根據需求而定

九:輸出對映

           1.resultType

                 ①:使用該屬性對映,只有查詢出來的列名與pojo屬性名一致,才可以對映成功

                 ②:如果查詢出來的列名與pojo屬性名全都不一致,則不會建立對映的pojo物件,但只要有一個列與pojo屬性名稱一致,就會建立pojo物件

               2.resultMap

                  如果查詢出來的列名與pojo屬性名不一致卻還要與pojo對映,可以使用resultMap

                  首先要定義resultMap與pojo屬性的對應關係

十:動態sql

      1.主要是where標籤與if標籤的綜合使用,進行靈活的判斷後動態拼接sql語句,where標籤會自動將第一個and去掉。

        2.定義sql片段:可以將相同的sql片段提取出來,這樣其他的語句就可以引用該sql,在mapper.xml檔案中單獨使用sql標籤定義。注意:相對於單表定義可重用性才高,不要在其中定義where標籤。引用sql片段用include標籤。

        3.foreach標籤可以遍歷組裝sql語句

                   collection屬性為集合屬性名

                   items為集合屬性名稱

                   open為拼接開始語句,close為拼接結束語句,separator為拼接集合屬性的連線sql

十一:一對一查詢,一對多查詢

       1.resultType:使用較為簡單,如果pojo中沒有查詢出來的列名,只需要在pojo中增加對應的屬性即可完成對映。如無特殊要求建議使用resultType:

       2.resultMap:需要在對映檔案中單獨實現resultMap,如果對查詢結果有特殊要求,使用resultMap可以完成將關聯查詢對映到pojo屬性中,並且resultMap可以實現延遲載入,而resultType不能。

        使用association標籤將關聯的資訊對映到單個Java物件中,使用collection將關聯資訊對映到物件的集合當中。

        在查詢過程中,可以發現resultMap方式的實現相對於resultType相當複雜,因此建議使用resultType。

十二:延遲載入

      定義resultMap中配置association,通過其select標籤指定需要延遲載入的statement的id,column指定兩表關聯的外來鍵列。使用延遲載入需要在主配置檔案中開啟延遲載入,其預設是關閉狀態。

        事實上完全可以定義兩個查詢方法實現延遲載入一樣的功能。

十三:一級快取

      sqlSession級別的一級快取,在執行sqlSession.commit操作之後會被清空一級快取以防止髒讀,一級快取預設是開啟的。

十四:二級快取 

      mapper級別的二級快取是可以讓多個sqlsession公用的,區分不同的二級快取用namespace區分,開啟二級快取除了在主配置檔案中開啟之外,還需要在相應的mapper.xml中開啟,使用cache標籤,開啟二級快取之後,如果sqlsession不進行關閉操作,資料是不會被寫入二級快取當中的,如果單個的某條語句不想使用二級快取,可以userCache屬性值來控制。