SQL映射文件
Mybatis真正強大的是在于它的SQL映射語句,也是它的流弊之處。
它的功能強大,SQL映射文件的配置卻比較簡單。
使用SQL映射文件可以減少50%以上的代碼量。
Mybatis專注于SQL,對于開發人員來說可極大限度地進行SQL調優,以保證性能,下面是SQL映射文件的幾個頂級元素配置
1、mapper 它是映射文件的根節點,只有一個屬性就是 namespace(命名空間)它的作用是區分不同的mapper,里面的參數是全局唯一的,綁定DAO層接口,即面向接口編程 namespace綁定某個接口之后,就可以不寫該接口的實現類,因為mybatis會根據接口的完整名稱來找到對應的mapper配置來執行SQL語句。因此namespace的命名必須跟你設置的接口同名比如
2.cache:配置給命名空間的緩存
1
2
3
4
5
6
|
<!-- cache配置 --> <cache eviction= "FIFO" flushInterval= "60000" size= "512" readOnly= "true" /> |
在mapper文件配置支持cache后如果需要對個別查詢進行調整,可以單獨設置cache,代碼如下
1
2
3
|
< select id = "selectTest" resultType = "int" useCache = "true" > select id from text where id = 1 </ select > |
由于Mybatis框架不擅長緩存查詢結果數據集,所以不對它進一步了解,所以采用OSCahe,Memcached等專門的緩存服務器做更為合理。
3.cache-ref:從其他命名空間引用緩存
4.resultMap:用于描述數據庫結果集合對應關系
5.SQL:可以重用的SQL 塊,也可以被其他語句引用
6.insert:映射插入語句
7.delete:映射刪除語句
8.update:映射更新語句
9.映射查詢語句
使用SELECT完成單條件查詢
Select 元素的屬性 id 命名空間中唯一的標識符,可以被用來引用這條語句
ParameterType 表示查詢語句傳入參數的類型的完全限定名或別名,它支持基礎數據類型和復雜數據類型
除了內建的類型別名外,還可以為自定義的類設置別名,該表格只列出了部分映射,其他的別名請參考mybatis的幫助文檔,ResultType 查詢語句返回結果類型的完全限定名或別名。別名的使用方式與parameterType是一樣的
1
2
3
|
<select id= "selectTest" resultType= "User" parameterType= "string" > select * from text where name = #{name} </select> |
這是一個 id為 selectTest的SQL映射語句 ,它的參數類型為 string 也可為復雜類型,返回值是 User類型,如果使用類 做返回值的話 類中的字段設置的和數據庫表的字段一致,這樣可以使數據庫和類中的屬性自動匹配以便開發(注意如果數據庫表和實體類的屬性命名不一樣則需要手動配置),參數類型為 #{參數名} 它會告訴Mybatis生成PreparedStatement參數 ,對于JDBC該參數會被識別成 ? 若采用JDBC來實現代碼如下:
1
2
3
|
String sql = "select * from text where name = ? " ; PreparedStatement ps = new PreparedStatement(sql); ps.setString( 1 ,name); |
由此看出,Mybatis可以節省大量的代碼,如果想完成復雜一些的查詢或者讓配置文件更簡潔些,這就需要了解select元素的屬性和mybatis配置文件的屬性,
介紹屬性:
- id:命名空間中的唯一標識符,可以被用來引用這條語句
- parameterType:表示查詢語句傳入的參數的類型的完全限定名或別名
- resultType:查詢語句返回結果類型的完全限定名或別名
使用SELECT完成多條查詢
上面只是對一個表進行查詢,但是在實際操作中查詢數據會有多條件,
結果也會有各種類型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<!-- 設置resultMap的映射 --> <resultMap id= "TestMap" type= "text" > <id property= "id" column= "id" /> <reuslt property= "name" column= "name" /> <!-- 比如text類中有個 List<User> 的屬性 則需要使用該該標簽綁定User表 如果只是 User類型的參數的話使用 association 標簽 他們兩個標簽的屬性差不多只,是association是javaType來指定類型 而collection使用的是ofType來指定類型, 多表查詢時最好給每個id設置別名,以免插入到其他的id --> <collection property= "userList" ofType= "User" > <id property= "id" column= "u_id" /> <result property= "UserName" column= "UserName" /> <result property= "password" column= "password" /> </collection> </reusltMap> <!-- 設置多表查詢 --> <select id= "textList" resultMap= "TestMap" parameterType= "Integer" > select t.*,u.id = u_id,u.UserName,u.password from text as t,User as u where t.id = u.id and t.id = #{id} </select> |
注意Mybatis傳入參數類型可以是Java基本數據類型,但是只適用于一個參數的情況通過#{參數名}即可獲取傳入的值,如果多參入參,需要復雜數據類型來支持,包括java實體類,Map,通過#{屬性名}或#{Map 的 key}來獲取傳入的參數值。
使用resultMap完成查詢結果的展現
在Mybatis中使用resultType做自動映射,一定要注意:字段名和實體類的屬性名一致,若不一致,則需要給數據庫字段 as 起別名,保證別名與屬性名一致,我們還可以使用resultMap做自定義結果映射,字段名可以不一致,并且還可以指定要顯示的列,比較靈活,應用也廣泛,推薦使用第二種方式來做結果映射。
1
2
3
4
5
6
|
<resultMap type = "實體類或基本數據,他們的別名" id = "userList" > <result property= "id" column= "對應數據庫的id" /> <result property= "name" column= "對應數據庫的name" /> <result property= "password" column= "對應數據庫的password" /> <result property= "age" column= "對應數據庫的age" /> </resultMap> |
resultMap元素用來描述如何將結果集映射到Java對象,此處使用reusltMap對列表展示所需的必要字段來進行自由映射,resultMap元素的屬性值和子節點
- id 屬性:唯一標識,此id用于select元素resultMap屬性引用
- type 屬性: 表示該resultMap的映射結果類型
- result子節點:用于表示一些簡單的屬性 ,其中column 屬性表示從數據庫中查詢的字段名,property 則表示查詢出來的字段對應的值賦給實體對象的哪個屬性
屬性 | 說明 |
---|---|
resultType | resultType直接表示返回值類型,包括基礎數據類型和復雜數據類型 |
resultMap | resultMap則是對外部resultMao定義的引用,對應外部resultMap的id,表示返回結果映射到哪一個resultMap |
resultType和resultMap的關聯 | 在Mybatis進行查詢映射的時候,其實查詢出來的每個字段值都放在一個對應的Map里面,其中關鍵字是字段名,值是其對應的值,當select元素提供的返回值屬性是resultType的時候,Mybatis會將Map里面的鍵值對取出賦給resultType所指定對象的屬性,(即調用對應對象的屬性的setter方法進行填充), 注意在Mybatis的select元素中resultType 和resultMap本質是一樣的,都是Map數據結構,但需要明確的一點他們是不能同時存在的,只能二選一。 |
resultMap的自動映射級別 | 在Mybatis中,使用resultMap能夠進行自動映射匹配的前提是字段名和屬性名需要一致,在默認映射級別(PARTIAL)情況下,若一致,即使沒有做屬性名和字段名的匹配,也可以在后臺獲取到未匹配過的屬性值,若不一致,且在resultMap里沒有做映射,那么無法在后臺獲取并輸出 |
事務開啟回滾
在使用 sqlsessionFactory獲取sqlsession時給openSession(boolean)帶有參數表示事務是否提交 ,不帶參數不開啟事務
1
|
Sqlsession = factory.opSession( false ); //true 為自動提交事務 |
commit 提交方法
1
|
Sqlsession.commit(); //提交事務 |
rollback回滾
1
|
Sqlsession.rollback(); //回滾事務 |
使用INSERT完成增加操作
Mybatis實現增加操作,使用的是insert 元素來映射插入語句,操作方法很簡單,先向接口定義一個方法 比如 int add(User user);
然后我們在SQL映射文件中定義一個insert節點
1
2
3
4
5
|
<!-- 增加用戶 --> <insert parameterType= "User" > insert user into(userName,password) values(#{userName},#{password}) </insert> |
insert 的屬性
- id :與 select元素的id一樣,是命名空間中唯一的標識碼,可以被引用這條語句
- parameterType :與select元素的parameterType一樣,是傳入的參數的類型完全限定名,別名和select元素的解釋一致
對于增刪改(insert,delete,update),這類數據庫更新操作,需要注意:
1.該類型的操作本身默認返回默認返回執行SQL影響的行數,所以DAO層接口方法的方法值最好為int,不要為boolean類型
2.insert,delete,update元素中均沒有resultType屬性,只有查詢需要對返回結果類型(resultType,resultMap)進行相應的指定
使用update完成修改操作
Mybatis 實現修改操作,使用的是 update元素來映射修改語句,具體用法和insert類似
1
2
3
4
5
|
<!-- 修改用戶 --> <update parameterType= "User" > update user set userName = #{userName} ,password =#{password} where id = #{id} </update > |
@Param注解實現多參數入參
假如我需要刪除 刪除 姓名 為 李XX 的數據 當數據庫有很多個同名的數據 所以需要其他的條件來 確認刪除那個李XX 數據 但我們 直接使用一個類對象作為參數的話,有點多余,因為我們只需要2個條件,就ok了,當由于它的參數類型時采用map的方式只有一個參數時可直接 #{任意名}來使用,但有多個參數的時候就不行了 所以這時需要@Param注解
1
2
3
4
|
/** *我們需要接口方法的參數里面添加@Param注解 **/ int update( @Param ( "id" ) int id, @Param ( "name" ) String name); |
而我們在 SQL映射文件中使用參數:
1
2
3
4
|
<update > update user set userName = #{name} where id = #{id} </update > |
使用delete完成刪除操作
Mybatis 實現刪除操作,是通過使用delete元素來映射刪除語句的,具體用法和update ,insert 類似
1
|
int deleteUser( @Param ( "id" ) Integer id); |
delete元素映射
1
2
3
|
<delete parameterType= "Integer" > delete from user where id = #{id} </delete> |
association
association 映射到JavaBean的某個 ‘復雜類型' 屬性 比如JavaBean類,即JavaBean 內部嵌入了一個復雜數據類型(JavaBean)屬性,這種情況就屬于復雜類型的關聯,但是需要注意:association 僅處理一對一的關聯關系
實體類
1
2
3
4
5
6
7
|
class User{ private int id; private String name; private String password; private text userText; //省略getter和setter方法 } |
我們使用association來映射 User 的text屬性
1
2
3
4
5
6
7
8
9
10
|
<resultMap type = "User" > <result property= "id" column= "id" /> <result property= "name" column= "name" /> <result property= "password" column= "password" /> <association property= "userText" javaType= "Text" > <id property= "id" cloumn= "t_id" /> <result property= "tname" column= "tname" /> <result property= "text" column= "text" /> </association> </resultMap> |
association 的屬性
屬性 | 說明 |
---|---|
javaType | 完整的Java類名或者別名,若映射到一個JavaBean,則MyBatis通常會自行檢測到其類型;若映射到一個HashMap,則應該明確指定javaType,來確保所需行為 |
property | 映射數據庫列的實體對象的屬性 |
resultMap | 用于引用外部的resultMap映射 |
resultMap 引用外部 resultMap
1
2
3
4
5
6
7
8
9
10
11
|
<resultMap type = "User" > <result property= "id" column= "id" /> <result property= "name" column= "name" /> <result property= "password" column= "password" /> <association property= "userText" javaType= "Text" resultMap= "TextEntity" /> </resultMap> <resultMap type = "Text" > <id property= "id" cloumn= "t_id" /> <result property= "tname" column= "tname" /> <result property= "text" column= "text" /> </resultMap> |
association處理一對一的關聯關系,那么對于一對多的關聯關系的處理這就需要用到collection元素來實現了
collection
collection 元素的作用和association元素的作用差不多一樣,事實上,它們非常類似,也是映射到JavaBean的某個復雜類型 屬性,只不過這個屬性是一個集合列表,即 JavaBean內部嵌套一個復雜數據類型(集合)屬性,和使用association元素一樣,我們使用嵌套查詢,或者從連接中嵌套結果集
實體類
1
2
3
4
5
6
7
|
class User{ private int id; private String name; private String password; private List<text> userText; //省略getter和setter方法 } |
我們在接口中添加 一個方法
1
|
public List<User> getUserIDListBy( @Param ( "id" ) Integer userid); |
使用 collection實現結果映射
1
2
3
4
5
6
7
8
9
10
|
<resultMap type = "User" > <result property= "id" column= "id" /> <result property= "name" column= "name" /> <result property= "password" column= "password" /> <collection property= "userText" ofType= "Text" > <id property= "id" cloumn= "t_id" /> <result property= "tname" column= "tname" /> <result property= "text" column= "text" /> </collection> </resultMap> |
collection 的屬性
屬性 | 說明 |
---|---|
ofType | 完整的Java類名或者別名,若映射到一個JavaBean,則MyBatis通常會自行檢測到其類型;若映射到一個HashMap,則應該明確指定javaType,來確保所需行為 |
property | 映射數據庫列的實體對象的屬性 |
resultMap | 用于引用外部的resultMap映射 |
collection 引用外部映射和association引用基本一致
1
2
3
4
5
6
7
8
9
10
11
|
<resultMap type = "User" > <result property= "id" column= "id" /> <result property= "name" column= "name" /> <result property= "password" column= "password" /> <collection property= "userText" ofType= "Text" resultMap= "textList" /> </resultMap> <resultMap type = "Text" > <id property= "id" cloumn= "t_id" /> <result property= "tname" column= "tname" /> <result property= "text" column= "text" /> </resultMap> |
resultMap自動映射級別
設置 reultMap的自動映射級別我們需要在mybatis的核心配置文件中設置
1
2
3
4
|
<settings> <!-- 設置resultMap的自動映射級別為FULL(自動匹配所有) --> <setting name= "autoMappingBehavior" value= "FULL" /> </settings> |
屬性 | 說明 |
---|---|
NONE | 禁止自動匹配 |
PARTIAL(默認) | 自動匹配所有的屬性,但有內部嵌套的(association和collection)的除外 |
FULL | 自動匹配所有 |
在使用時 如果沒有設置映射級別,對于復雜類型他們是不會自動匹配的,需要手動匹配,復雜類型需要自己對association和collection的進行設置
總結
MyBatis的SQL映射文件提供 select,insert,update,delete等元素來實現SQL語句的映射
SQL映射文件的根節點是mapper元素,需要指定namespace來區別其他的mapper,保證全局唯一,并且其名稱必須和接口同名,作用是綁定接口,即面向接口編程
關于MyBatis的SQL語句參數入參,對于經基礎數據類型的參數數據,使用@Param注解來實現 ,復雜類型的參數直接入參即可
resultMap的association和collection都可以實現高級映射
SQL 映射文件的select的返回結果類型的映射可以使用resultMap和resultType,但它們不能同時使用
到此這篇關于利用MyBatis實現條件查詢的文章就介紹到這了,更多相關MyBatis實現條件查詢內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/LiuLiangLONG/article/details/108009854