關於Mybatis框架的個人總結

一:什麼是Mybatis?
剛學會jdbc的時候,對數據庫進行增刪改差,都要事先先寫一個連接工具類,用來加載驅動、獲取數據庫連接還有用完關閉連接這些通用操作,就像下面這張圖

這裏寫圖片描述

然後操作dao層,增刪改差方法每個還要封裝一遍,代碼重複枯燥,很沒意思。
所以爲了解決這個問題,由ibatis改進的Mybatis出現了,他讓我這樣的瓜皮程序員能夠不因爲太多繁雜重複的代碼粗心犯低級錯誤,直接把jdbc對數據庫操作的過程封裝起來,只需要寫一寫SQL語句,配置一下連接信息,萬事大吉。

下面是mybatis的內部架構:
這裏寫圖片描述

1.最頂上的SqlMapConfig.xml
就是前面說的要配置連接信息之類的文件,我們把數據庫連接等信息放在這裏,還有就是mybatis的運行環境之類的

2.SqlSessionFactory
意思是會話工廠(這裏可以小小的涉及一下設計模式的工廠模式),沒錯,工廠工廠,就是生產東西的,這裏也就是生產了會話SqlSession買這個SqlSession拿來做什麼呢,接下來看。(順便說一下,這個工廠是重量級的,用單例模式創建)

3.SqlSession和Executor
我印象裏記得只有SqlSession,其實SqlSession只是打開了數據庫,真正與數據庫交互的也就是真正操作數據庫的是Executor
mybatis底層自定義了Executor執行器接口操作數據庫,Executor接口有兩個實現,一個是基本執行器、一個是緩存執行器

4.Mapped Statement
Mapped Statement也是mybatis一個底層封裝對象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個sql對應一Mapped Statement對象,sql的id即是Mapped statement的id

二:常見配置

1.自定義別名

在SqlMapConfig.xml中配置:
<typeAliases>
    <!-- 單個別名定義 -->
    <typeAlias alias="user" type="com.mybatis.po.User"/>
    <!-- 批量別名定義,掃描整個包下的類,別名爲類名(首字母大寫或小寫都可以) -->
    <package name="com.mybatis.po"/>
    <package name="其它包"/>
</typeAliases>

2.寫SQL語句中,#{}與${}的區別

使用佔位符#{}可以有效防止sql注入,在使用時不需要關心參數值的類型,mybatis會自動進行java類型和jdbc類型的轉換。#{}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。

和#{}不同,通過${}可以將parameterType 傳入的內容拼接在sql中且不進行jdbc類型轉換, ${}可以接收簡單類型值或pojo屬性值,如parameterType傳輸單個簡單類型值,${}括號中只能是value。使用${}不能防止sql注入,但是有時用${}會非常方便,如下的例子:

<!-- 根據名稱模糊查詢用戶信息 -->
    <select id="selectUserByName" parameterType="string" resultType="user">
       select * from user where username like '%${value}%'
    </select>

如果本例子使用#{}則傳入的字符串中必須有%號,而%是人爲拼接在參數中,顯然有點麻煩,如果採用${}在sql中拼接爲%的方式則在調用mapper接口傳遞參數就方便很多。

3.動態SQL
這裏引用網上大佬的網站
http://www.cnblogs.com/dongying/p/4092662.html

4.延遲加載(懶加載)

需要查詢關聯信息時,使用mybatis延遲加載特性可有效的減少數據庫壓力,首次查詢只查詢主要信息,關聯信息等用戶獲取時再加載。

作用:
當需要查詢關聯信息時再去數據庫查詢,默認不去關聯查詢,提高數據庫性能。
只有使用resultMap支持延遲加載設置。

場合:
當只有部分記錄需要關聯查詢其它信息時,此時可按需延遲加載,需要關聯查詢時再向數據庫發出sql,以提高數據庫性能。
當全部需要關聯查詢信息時,此時不用延遲加載,直接將關聯查詢信息全部返回即可,可使用resultType或resultMap完成映射。

那麼,不使用mybatis提供的延遲加載功能是否可以實現延遲加載?

實現方法:
針對訂單和用戶兩個表定義兩個mapper方法。
1、訂單查詢mapper方法
2、根據用戶id查詢用戶信息mapper方法
默認使用訂單查詢mapper方法只查詢訂單信息。
當需要關聯查詢用戶信息時再調用根據用戶id查詢用戶信息mapper方法查詢用戶信息。

所以,感覺平時用到延遲加載的地方不多,瞭解知道這個知識應該就好吧

5.查詢緩存

mybatis框架、一二級緩存

這裏寫圖片描述

從這個圖也可以看出來
Mybatis一級緩存的作用域是同一個SqlSession,在同一個sqlSession中兩次執行相同的sql語句,第一次執行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效率。當一個sqlSession結束後該sqlSession中的一級緩存也就不存在了。Mybatis默認開啓一級緩存。

一級緩存區域是根據SqlSession爲單位劃分的。
每次查詢會先從緩存區域找,如果找不到從數據庫查詢,查詢到數據將數據寫入緩存。
Mybatis內部存儲緩存使用一個HashMap,key爲hashCode+sqlId+Sql語句。value爲從查詢出來映射生成的java對象
sqlSession執行insert、update、delete等操作commit提交後會清空緩存區域。

Mybatis二級緩存是多個SqlSession共享的,其作用域是mapper的同一個namespace,不同的sqlSession兩次執行相同namespace下的sql語句且向sql中傳遞參數也相同即最終執行相同的sql語句,第一次執行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效率。Mybatis默認沒有開啓二級緩存需要在setting全局參數中配置開啓二級緩存。

二級緩存區域是根據mapper的namespace劃分的,相同namespace的mapper查詢數據放在同一個區域,如果使用mapper代理方法每個mapper的namespace都不同,此時可以理解爲二級緩存區域是根據mapper劃分。
每次查詢會先從緩存區域找,如果找不到從數據庫查詢,查詢到數據將數據寫入緩存。
Mybatis內部存儲緩存使用一個HashMap,key爲hashCode+sqlId+Sql語句。value爲從查詢出來映射生成的java對象
sqlSession執行insert、update、delete等操作commit提交後會清空緩存區域。

開啓二級緩存:

<setting name="cacheEnabled" value="true"/>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章