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屬性值來控制。