1. 程式人生 > >MyBatis實戰之對映器 SSM框架之批量增加示例(同步請求jsp檢視解析) mybatis的批量更新例項 造成MySQL全表掃描的原因 SSM框架實戰之整合EhCache

MyBatis實戰之對映器 SSM框架之批量增加示例(同步請求jsp檢視解析) mybatis的批量更新例項 造成MySQL全表掃描的原因 SSM框架實戰之整合EhCache

對映器是MyBatis最強大的工具,也是我們使用MyBatis時用得最多的工具,因此熟練掌握它十分必要。MyBatis是針對對映器構造的SQL構建的輕量級框架,並且通過配置生成對應的JavaBean返回給呼叫者,而這些配置主要便是對映器,在MyBatis中你可以根據情況定義動態SQL來滿足不同場景的需要,它比其他框架靈活得多。MyBatis還支援自動繫結JavaBean,我們只要讓SQL返回的欄位名和JavaBean的屬性名保持一致即可(獲贈採用駝峰式命名),便可以省掉這些繁瑣的對映配置。

今天主要圍繞這麼幾個方面來講?

1.對映器的主要元素;

2.select元素

3.insert元素

4.update元素和delete元素

5.引數

6.sql元素

7.resultMap結果對映

8.快取cache

 

一、對映器的主要元素

關於對映器的主要元素,我用兩張圖概況。

圖一:

 圖一除了parameterMap之外基本上就不用,其他的都用。

 

圖二:

resultMap是我用的比較多的,至於cache或者cache-ref用的著實不是很多。一般我們在spring和ehcache整合就可以達到快取目的。當然了,有的時候覺得每次都通過ehcache在對應的方法上配置快取註解顯得麻煩,就可以通過cache的形式。

 

二、select元素

select元素是我們最常用也是功能最強大的SQL語言。select元素幫助我們從資料庫中讀出資料,組裝資料給業務人員。執行select語句前,我們需要定義引數,它可以是一個簡單的引數型別,例如int、float、String,同時也可以是一個複雜引數型別,例如Map或者JavaBean等,這些都是MyBatis接受的引數型別。執行SQL後,MyBatis也提供了強大的對映規則,甚至是自動對映來幫助我們把返回的結果繫結到JavaBean中。

 

關於select元素的配置,我用如下的圖來表示:

圖一:

圖二:

 

圖三:

 

關於select細節的東西,我不想說太多,對於初學者而言,說的太多,顯得重點不突出,對於有基礎的朋友們,說的太多,顯得繁瑣。

以下說這個常見問題?

1.關於resultType和resultMap

resultType是針對當資料表的欄位名與JavaBean中屬性名一致時,我們可以使用resultType。如果不一致的話,我們就使用resultMap。因為如果在資料表的欄位名與JavaBean的屬性不一致的前提下你還使用resultType,那麼你查詢的資料應該是為Null。

2.關於多個引數傳遞問題

如果你的資料訪問層方法中的引數大於四個以上,建議使用物件來傳輸資料。

如果是引數列表中的引數與xml中的sql查詢條件的欄位不一致,可以使用@Parm註解自定義。

例如:

 

 三、insert元素

insert元素,相對於select元素而言要簡單許多。MyBatis會在執行插入之後返回一個整數,以表示你進行操作後插入的記錄數。

insert元素配置詳解

用一張圖來表示,如下圖所示:

insert 需要注意的是引數列表中的引數與插入的資料的列名要對上,同時還有就是資料表定義的主鍵非空或自增及其其他欄位一些特殊的定義,因為同update一樣,往往因為資料表的定義導致出現小問題。

關於批量新增可以參考我的這篇文章:SSM框架之批量增加示例(同步請求jsp檢視解析)

 

 

四、update和delete

這兩個元素很簡單,所以一般情況,我們會放在一起討論。和insert元素一樣,MyBatis執行完update元素和delete元素後會返回一個整數,標出執行後影響的記錄條數。

批量修改可以參考我的這篇文章:mybatis的批量更新例項

至於批量刪除,你知道了批量更新就相當於知道了這個。

 

五、引數

雖然在MyBatis中引數大部分是像上面所描述的那樣簡單,但是我們還是有必要討論一下引數的使用。我們可以通過制定引數的型別去讓對應的typeHandler處理它們。

這裡需要強調的是關於特殊字串的替換和處理(#和$)

在MyBatis中,我們常常傳遞字串,我們設定的引數#(name)在大部分的情況下MyBatis會用建立預編譯的語句,然後MyBatis為它設值,而有時候我們需要的是傳遞SQL語句的本身,而不是SQL所需要的引數。例如,在一些動態表格(有時候經常遇到根據不同的條件產生不同的動態列)中,我們要傳遞SQL的列名,根據某些列進行排序,或者傳遞列名給SQL都是比較常見的場景,當然MyBatis也對這樣的場景進行了支援,這些都是Hibernate難以做到的。

 

六、sql元素

sql元素的意義,在於我們可以定義一串SQL語句的組成部分,其他的語句可以通過引用來使用它們。例如,你有一條SQL需要select幾十個欄位對映到JavaBean中去,我的第二條資料也是這幾十個欄位對映到JavaBean中去,顯然寫兩遍是不合適的。那麼我們就可以通過sql元素來完成。

例如,下面的這個示例,大家可以做個簡單參考。


    <!-- 通用查詢結果列 -->
    <sql id="Base_Column_List">
        user_id, login_code, user_name, password, sex, identity_card, create_time, create_by, update_time, update_by, status
    </sql>
    
    <select id="selectOne" resultMap="BaseResultMap">
        select <include refid="Base_Column_List"/>
        from `user` where user_id=#{userId}
    </select>

 

七、resultMap

resultMap是MyBatis裡面最複雜的元素。它的作用是定義對映規則、級聯的更新、定製型別轉化器等。

前面我們只是僅僅提到了它和resultType的對比。

resultMap定義的主要是一個結果集的對映關係。MyBatis現有的版本只支援resultMap查詢,不支援更新或者新增,更不要說說批量的刪除和修改了。

1.resultMap元素的構成

 

 其中constructor元素用於配置構造方法。一個POJO可能不存在沒有引數的構造方法,這個時候我們就可以使用constructor進行配置。

id元素是表示哪個列是主鍵,允許多個主鍵,多個主鍵則稱為聯合主鍵。result是配置POJO到SQL列名的對映關注。這裡的result和Id元素,如下圖所示:

 

至於級聯,例如一對一,一對多,多對多,我們可以分別使用association、collection等。

後面我會專門有程式碼示例講解的。

不過有一點需要注意的是,通常一對一或者一對多,多對多這種的,特別損耗效能,因此對於sql,最好是優化。

關於sql優化的方法,大家可以參考我的這篇部落格:造成MySQL全表掃描的原因

這篇文章不會直接告訴你這麼做,但是你看了這篇文章,你就會明白為什麼要這麼做。

在我看來,提出問題比解決問題更重要(當然了,事物都是相對的)。

 

 

八、快取

快取是網際網路系統常常用到的,其特定是將資料儲存在記憶體中。目前流行的快取伺服器有MongoDB、Redis、Ehcache等。快取是在計算機記憶體上儲存的資料,在讀取的時候無需再從磁碟讀入,因此具備快速讀取和使用的特點,如果快取命中率高,那麼可以極大地提高系統的效能。如果快取命中率低,那麼快取就不存在使用的意義,所以使用快取的關鍵在於儲存內容訪問的命中率。

關於SSM框架整合Ehcache實戰,可以參考我的這篇文章:SSM框架實戰之整合EhCache

這篇文章的重點不是快取,關於redis和memcached及其與ssm框架整合實戰及其應用場景,後面會專門有文章詳細講解。

 

小結:

本文主要參考《深入淺出MyBatis原理與實戰》和自身在實戰中的總結和歸納。希望能給大家有所幫助。