ssm之MyBatis(三)

日誌

日誌的作用是能在運行時提供詳細信息,如下圖所示在這裏插入圖片描述
圖中圈起來的內容就是數據庫執行語句,下面的Parameters是變量個數。它會根據相應的執行語句產生不同的日誌,從中我們能更簡單的識別到錯誤所在。
下面就開始正式介紹怎麼配置日誌
首先需要導入jar包,log4j.jar,這個jar包在下載的mybatis文件中的子目錄lib裏,不用去網上下載。
然後開啓日誌(如果是使用的是idea就不需要自己開啓,它已經默認配置好了),在conf.xml文件中的setting標籤裏配置

<settings>
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
    <!--value中可以填以下元素SLF4J  LOG4J  LOG4J2 
    JDK_LOGGING  COMMONS_LOGGING  STDOUT_LOGGING 
    NO_LOGGING-->

如果不指定,MyBatis就會根據以下順序尋找日誌
SLF4J -> Apache Commons Logging -> Log4j 2 -> Log4j ->JDK logging
最後,我們需要編寫配置日誌輸出文件。
在根目錄裏創建log4j.properties文件,並在文件中配置以下內容

log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

第一行中的DEBUG爲日誌級別,只打印選擇的級別及以上級別的信息,從高往低:ERROR–錯誤、WARN–警告、INFO–提示、DEBUG–調試;stdout表示在控制檯輸出
第二行表示日誌顯示方式爲控制檯普通方式
第三行的PatternLayout表示打印的方式爲平鋪方式
第四行表示打印的格式爲%5p [%t] - %m%n

延遲加載

延遲加載也被稱爲懶加載,顧名思義,它是有延遲的加載。如我們在查詢班級時,首先先查班級,然後在按需查詢學生,而不是在查詢班級時也把學生都查詢了。
在使用延遲加載前,我們需要先在conf文件中配置

<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

配置好後我們還需要新建一個mapper文件,裏面存放需要延遲加載的部分
下面以一對一爲例。
首先在原mapper文件寫入普通加載的語句,然後在新mapper文件中寫入要延遲加載的語句,最後把使用延遲加載的部分現在原mapper文件中定義好,通過association的子標籤select和新建的mapper文件要延遲加載的部分連接起來。

<--原mapper文件-->

<select id="queryStudentWithOO3" parameterType="int" resultMap="student_card_lazyLoad_map">
    <!-- 先查學生 -->
        select * from student
    </select>
    <resultMap id="student_card_lazyLoad_map" type="student">
        <id property="stuNo" column="stuNo"/>
        <result property="stuName" column="stuName"/>
        <result property="stuAge" column="stuAge"/>
        
        <!-- 使用延遲加載的部分,在查詢學生時,不立即加載學生證 -->
        <association property="studentCard" javaType="StudentCard" select="chern.cn.StudentCardMapper.queryCardById" column="cardId">
        </association>
    </resultMap>
    
    <!-- 新建的mapper文件 -->
    
     <select id="queryCardById" parameterType="int" resultType="StudentCard">
        <!-- 查詢學生對應的學生證 -->
        select * from StudentCard where cardid = #{cardId}
    </select>

一、二級緩存

一級緩存

同一個SqlSession對象,使用它能提高效率
具體爲在第一次查詢時創建一個SqlSession對象並訪問數據庫獲取數據,然後查詢的內容會放在該SqlSession對象中(作爲緩存的存在),之後再用相同的SqlSession對象進行查詢時不需要再訪問數據庫獲取數據,而是直接從緩存中獲取。(執行commit()方法後會直接清理所有緩存對象,對象中的數據也會被清理)
MyBatis默認開啓了一級緩存

二級緩存

作用範圍:同一個namespace 生成的mapper對象,緩存時將對象放入硬盤文件中

MyBatis自帶的二級緩存 ,由於MyBatis默認情況沒有開啓二級緩存,所以需要我們手工打開
首先需要配置conf.xml文件

<setting name="cacheEnabled" value="true"/>

然後配置mapper文件

<cache/>

最後我們要實現序列化接口。由於緩存是存在硬盤中,所以我們需要把準備緩存的對象的類實現序列化接口(級聯屬性和父類也需要實現),接口名爲 Serializable。
這樣mybatis自身的二級緩存就開啓了。

第三方提供的二級緩存
如ehcache、memcache等
整合三方提供的二級緩存(或者自定義二級緩存),必須實現Cache接口,該接口的默認實現類是PerpetualCache(由於第三方提供的二級緩存,例如ehcache有一些已經實現過了, 所以我們不需要在寫一遍)

整合ehcache二級緩存:
導入三個jar包:Ehcache-core.jar、mybatis-Ehcache.jar、slf4j-api.jar(當出現SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder報錯時,導入slf4j-nop.jar, slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar , logback-classic.jar中的任意一個即可)

編寫ehcache配置文件Ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
    <diskStore path="F:\develop\ehcache" />
    <defaultCache
        maxElementsInMemory="1000"
        maxElementsOnDisk="10000000"
        eternal="false"
        overflowToDisk="false"
        diskPersistent="true"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
    </defaultCache>
</ehcache>
該配置文件配置的值是默認值,是所有mapper通用的。如果要在指定的mapper文件修改參數值,需要在mapper文件中另行配置
diskStore:當二級緩存的對象超過內存限制(maxElementsInMemory)時,存放入的硬盤文件的目錄 地址
maxElementsInMemory:設置在內存中緩存對象的個數
maxElementsOnDisk:設置在硬盤中緩存對象的個數
eternal:設置緩存是否永不過期
overflowToDisk:當內存中緩存的對象個數超過maxElementsInMemory的時候,是否轉移到硬盤中
timeToIdleSeconds:當兩次訪問超過該值的時候,使緩存對象失效
timeToLiveSeconds:一個緩存對象最多存放的時間(生命週期)
diskExpiryThreadIntervalSeconds:設置每隔多長時間,通過一個線程來清理硬盤中的緩存
memoryStoreEvictionPolicy:當超過緩存對象的最大值時,處理的策略(LRU:從緩存對象中清理最少使用的對象,再把新對象放進去;FIFO;LFU)

在mapper.xml文件中開啓ehcache緩存

<cache type="org.mybatis.caches.ehcache.EhcacheCache">
        <property name="maxElementsInMemory" value="2000"/>
    </cache>

可通過property來修改ehcache默認的參數值

清理:
a、與清理一級緩存的方法相同(查詢語句除外),使用commit()方法(設計的原因是爲了防止髒數據)
b、在select標籤中 增加屬性 flushCache=“true”

發佈了8 篇原創文章 · 獲贊 3 · 訪問量 420
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章