什麼是延遲加載:java
resultMap中的association和collection標籤具備延遲加載的功能。延遲加載就是在咱們關聯查詢的時候李勇延遲加載,先加載主信息,使用到關聯信息的時候再去加載關聯信息。通俗一點講就是一個類裏面引用另外一個類,當使用到另外一個類的時候另外一個類再去賦值。算法
設置延遲加載:sql
在myabtis的全局配置文件裏面配置全局加載 lazyLoadingEnabled、aggressiveLazyLoading數據庫
<!-- 開啓延遲加載 --> <settings> <!-- lazyLoadingEnabled:延遲加載啓動,默認是false --> <setting name="lazyLoadingEnabled" value="true"/> <!-- aggressiveLazyLoading:積極的懶加載,false的話按需加載,默認是true --> <setting name="aggressiveLazyLoading" value="false"/> </settings>
一級緩存:緩存
mybatis對緩存提供了支持,可是在沒有配置的狀況下,他只是默認的開啓了第一緩存,一級緩存只是相對於SqlSession而言,因此在參數和SQL徹底同樣的狀況下,咱們使用同一個SqlSession對象調用一個Mapper方法,每每只執行一次SQL,由於使用SqlSession第一次查詢後,Mybatis會把結果放到緩存中,下次查詢只要沒有聲明刷新,沒有作更新操做,而且緩存沒有超時的狀況下,SqlSession都會取出當前緩存的數據,而不會再次發送SQL到數據庫。安全
一級緩存注意一下幾點:mybatis
1.一級緩存何時會清空:app
a.MyBatis在開啓一個數據庫會話時,會建立一個新的SqlSession對象,SqlSession對象中會有一個新的Executor對象。Executor對象中持有一個新的PerpetualCache對象,當會話結束時,SqlSession對象及其內部的Executor對象還有PerpetualCache對象也一併釋放掉。性能
b.若是SqlSession調用了close()方法,會釋放掉一級緩存PerpetualCache對象,一級緩存將不可用。spa
c.若是SqlSession調用了clearCache(),會清空PerpetualCache對象中的數據,可是該對象仍可以使用。
d.SqlSession中執行了任何一個update操做(update()、delete()、insert()) ,都會清空PerpetualCache對象的數據,可是該對象能夠繼續使用.
2.在什麼狀況下會用調用緩存:
當知足下列條件後,mybatis會認爲兩次查詢爲同一個查詢,則會到緩存裏面調用緩存。
a. 傳入的statementId是相同的
b. 查詢條件是相同的(查詢時要求的結果集中的結果範圍)
c. 此次查詢所產生的最終要傳遞給JDBC java.sql.Preparedstatement的Sql語句字符串(boundSql.getSql() )
d. 傳遞給java.sql.Statement要設置的參數值
二級緩存:
MyBatis的二級緩存是Application級別的緩存,它能夠提升對數據庫查詢的效率,以提升應用的性能。
SqlSessionFactory 層面上的二級緩存默認是不開啓的,耳機華潤的開啓須要進行配置。實現二級緩存的時候,Mybatis要求返回的POJO必須是序列化的。配置主須要在xml裏面開啓緩存就能夠了:
1.1 全局配置文件
<!-- 開啓延遲加載 --> <settings> <!-- 開啓二級緩存,默認是false --> <setting name="cacheEnabled" value="true"/> </settings>
1.2 本身的 mapper 文件
<mapper namespace="cm.mbs.dao.BlogMapper"> <!-- 開啓不本mapper的namespace下的二級緩存 --> <cache/>
第一次調用mapper下的SQL去查詢用戶信息。查詢到的信息會存到該mapper對應的二級緩存區域內。
第二次調用相同namespace下的mapper映射文件中相同的SQL去查詢用戶信息。會去對應的二級緩存內取結果。
若是調用相同namespace下的mapper映射文件中的增刪改SQL,並執行了commit操做。此時會清空該namespace下的二級緩存。
二級緩存注意的點: