MyBatis框架之SQL映射和動態SQL
使用MyBatis實現條件查詢
1.SQL映射文件:
MyBatis真正的強大之處就在於SQL映射語句,MyBatis專註於SQL,對於開發人員來說也是極大限度的進行SQL調優,以保證性能。下面是SQL映射文件的幾個頂級元素的配置:
1.mapper:映射文件的根節點,只有一個屬性namespace(命名空間),作用如下:
(1)用於區分不同的mapper,全局唯一。
(2)綁定DAO介面,即面向介面編程,當綁定一個介面,就不用寫此介面的實現類,會通過介面的完全限定名找到對應的mapper配置來執行SQL語句,所以,namespace的命名必須要寫介面的完全限定名。
2.cache:配置給定命名空間的緩存。
3.cache-ref:從其他命名空間引用緩存配置。
4.resultMap:用來描述資料庫結果集和對象的對應關係。
5.sql:可以重用的SQL塊,也可以被其他語句引用。
6.insert:映射插入語句。
7.update:更新映射語句。
8.delete:刪除映射語句。
9.select:映射查詢語句。
2.使用select完成單條件查詢
select * from user where name like concat("%",#,"%") //按照姓名模糊查詢。
這是一個id為GetUserByName的映射語句,參數類型為string,返回類型為User。
#:告訴MyBatis生成的PreparedStatement參數,相對於JDBC,改參數被標識為『?』。
id:命名空間的唯一標識符,可以被用來引用這條語句。
parameterType:表示查詢語句傳入參數的類型和完全限定名或別名。支持基礎數據類型和複雜數據類型。上述實例中傳入的參數是一個別名,代表String。
別名與Java類型映射
resultType:查詢語句返回結果類型的完全限定名或別名。別名使用方式和parameterType是一樣的。
2.使用select完成多條件查詢
使用複雜數據類型,把條件參數封裝為對象、Map進行入參。
不管什麼類型的參數,或者多少個參數,都可以封裝為一個Map進行入參,通過Map的key進行獲取傳入的值。
1
2parameterType="map">
3?select *from smbms_user where userName like
4CONCAT("%",#,"%")
5and userRole =#
6
3.使用resultMap完成查詢結果的展現
resultMap:做自定義映射,實體類屬性名和資料庫列名不一致的情況下,並且可以指定要顯示的列,使用靈活 應用廣泛。
1
2??
3? //欄位名和屬性名不一致的情況下。
4
屬性和子節點:
id:唯一標識,此id值用於select元素resultMap屬性的引用。
type:標識該resultMap的映射結果類型。
result子節點:標識一些簡單屬性,其中column屬性代表資料庫的欄位名,property代表查詢出來的欄位名映射到pojo類的某個屬性。
id子節點:與result子節點作用一樣,一般表示資料庫的主鍵列。
-------------------------------------------------------------------------------------------------------
resultType和resultMap的對比如下 :
1.resultType:直接表示返回類型, 包括基本數據類型和複雜數據類型。
2.resultMap:外部resultMap定義的引用,通過對應的外部resultMap的id,表示結果映射到哪個resultMap上,一般用於欄位名和屬性名不一致的情況,或者需要做複雜的聯合查詢以便自由控制映射結果。
3.兩者的關聯
當進行查詢時,查詢出來的每個欄位都會放在一個Map里,當查詢元素返回屬性是resultType的時候,會將鍵值對取出賦所指定的屬性。其實MyBatis的每個查詢映射的返回類型都是resultMap,只是當我們使用resultType的時候,會自動把對應的值賦給所指定的對象屬性,當使用resultMap時候,因為map不是很好的表示領域,我們就進一步的轉化為對應的實體對象。resultMap主要作用於複雜的聯合查詢上。
注意:resultType和resultMap本質是一樣的,都是Map數據結構,但是二者不能同時存在。
4.resultMap的自動映射級別:默認級別為PARTIAL,也可以在settings更改值。
1
2????
3??
4
4.使用MyBatis實現增刪改操作
1.使用insert完成增加操作
INSERT INTO user(userName,userCode) VALUES(#,#)
2.使用update完成修改操作
UPDATE user SET userName= #,userCode= # WHERE id = #
3.使用delete完成刪除操作
delete from user where id=#
元素中的屬性:
id:與select元素id一樣,命名空間的唯一標識符。
parameterType:傳入參數的類型的完全限定名或者別名。
對於增刪改操作的注意事項:
(1)該類型的操作本身默認返回執行SQL影響的行數,所以DAO層的介面方法返回值一般為int類型,最好不要boolean類型。
(2)insert、update、delete元素中均沒有resultType屬性,只有查詢操作需要對返回結果類型(resultType/resultMap)進行相應的指定。
5.使用@param註解實現多參數入參
使用註解用來傳入多個參數,相當於給該參數重命名,在SQL映射文件中需要使用#來傳入參數。
publicuser GetUserByIdAndName(@Param("id") Integer id,@Param("Name") String Name);
當參數為基礎類型時,無論是多參數還是單參數,都使用@param註解進行參數的傳遞為好!
使用resultMap實現高級結果映射
1.association:
映射到JavaBean的某個複雜的」數據類型」屬性,僅處理一對一的關聯關係。
association的屬性節點:
property:映射資料庫列的實體對象屬性名。
javaType:完整的java類名和限定名。propert所映射的屬性的類型。
子元素:id:一般為映射主鍵,可以提高性能。
result:
column:映射的資料庫的欄位名。
property:映射的數據列對應的實體對象屬性。
2.collection:
映射到JavaBean的某個複雜的」數據類型」屬性,這個屬性是一個集合列表,處理一對多的關聯關係。
ofType:完整的java類名和限定名。propert所映射的屬性的類型。
其餘和association基本一致。
MyBatis緩存
1.一級緩存:基於PerpetualCache(MyBatis自帶)的HashMap本地緩存。作用域在Session域內,當session flush或者close之後,該緩存被清空。
2.二級緩存:global Cache,超出session範圍之外,可以被所有SqlSession共享。開啟它只需在MyBatis的核心配置文件 settings 設置即可。
補充:一級緩存緩存的是SQL語句,二級緩存緩存的是結果對象。
3.二級緩存配置:
(1)開啟二級緩存;
(2)mapper文件中設置緩存,默認是沒有開啟緩存的。作用域是針對namespace而言的,只在namespace內的查詢才能共享這個cache。
(3)對個別查詢進行緩存,單獨設置cache:
...........
補充:對MyBatis的緩存了解就可以了,對結果集做緩存並不是MyBatis所擅長的,而且性能也不是很好,它專心做的應該是SQL映射。
-----------------------------------------------------------------------------------------------------------------------
動態SQL
一、使用動態SQL完成多條件查詢。
動態SQL基於OGNL的表達式,我們可以方便的在SQL語句中實現某些邏輯,用於實現動態SQL元素如下:
if:利用if實現簡單的條件選擇。
choose(when,otherwise):相當於java中的switch語句,通常與when和otherwise搭配。
set:解決動態更新語句。
trim:靈活的去除多餘的關鍵字。
foreach:迭代一個集合,通常用於in條件。
二、if+where實現多條件查詢
where元素可以智能的處理and 和 or 的多餘問題, 不需擔心多餘關鍵字導致語法錯誤。
if元素的test用於判斷表達式是否符合,符合則繼續拼接SQL語句。
三、if+trim+foreach實現多條件查詢
(1)trim的屬性:
prefix:前綴: 作用是通過自動識別是否有返回值後,在trim包含的內容上加上前綴,如上述示例的where。
suffix:後綴: 作用是在trim包含的內容上加上後綴。
prefixOverrides: 對於trim包含內容的首部進行指定內容,(如上述示例的 and | or) 的忽略(去余);
suffixOverrides: 對於trim包含內容的首位部進行指定內容的忽略。
(2)foreach的屬性:
item:表示集合中每一個元素進行迭代時的別名。
index: 指定一個名稱,表示在迭代的過程中,每次迭代到的位置。
open:表示該語句以什麼開始(既然是in條件語句,必然是 " ( " 開始)
separator: 表示每次進行迭代的時候以什麼符號作為分隔符(既然是in條件語句,必然是 " , " 分隔)
close: 表示該語句以什麼結束(既然是in條件語句,必然是 " ) " 結束)
collection:最關鍵,並且最容易出錯的屬性。需注意,該屬性必須指定,不同情況下,該屬性值是不同的,主要有三種情況:
若傳入的參數是單參數且類型為一個List的時候,屬性值為list;
若傳入的參數是單參數且類型為一個數組的時候,屬性值為array;
若傳入的參數為多參數時,就需要封裝為一個map集合進行處理。屬性值為Map的key;
使用set更新操作,類似於上述示例使用方法:
三、choose(when、otherwise)
when元素:當test屬性中的條件滿足時,就會輸出when元素中的內容,並且當when中一旦有條件滿足時,就會跳出choose,所以只有一個條件會被輸出。
otherwise元素:當when中的所有條件都不滿足時,則會輸出此元素的內容。
四、MyBatis實現分頁功能
1.使用聚合函數獲得總記錄數-
2.實現分頁通過limit(起始位置,頁面顯示量)
補充:起始位置的下標 = (當前頁碼 - 1 ) * 頁面顯示量


TAG:java高級開發 |