1. 程式人生 > 程式設計 >利用MyBatis實現條件查詢的方法彙總

利用MyBatis實現條件查詢的方法彙總

SQL對映檔案

Mybatis真正強大的是在於它的SQL對映語句,也是它的流弊之處。

它的功能強大,SQL對映檔案的配置卻比較簡單。

使用SQL對映檔案可以減少50%以上的程式碼量。

Mybatis專注於SQL,對於開發人員來說可極大限度地進行SQL調優,以保證效能,下面是SQL對映檔案的幾個頂級元素配置

1、mapper 它是對映檔案的根節點,只有一個屬性就是 namespace(名稱空間)它的作用是區分不同的mapper,裡面的引數是全域性唯一的,繫結DAO層介面,即面向介面程式設計 namespace繫結某個介面之後,就可以不寫該介面的實現類,因為mybatis會根據介面的完整名稱來找到對應的mapper配置來執行SQL語句。因此namespace的命名必須跟你設定的介面同名比如

利用MyBatis實現條件查詢的方法彙總

利用MyBatis實現條件查詢的方法彙總

2.cache:配置給名稱空間的快取

<!-- cache配置 -->
<cache 
	eviction="FIFO"
 	flushInterval="60000"
 size="512" 
 	readOnly="true" />

在mapper檔案配置支援cache後如果需要對個別查詢進行調整,可以單獨設定cache,程式碼如下

	<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實現條件查詢的方法彙總

除了內建的類型別名外,還可以為自定義的類設定別名,該表格只列出了部分對映,其他的別名請參考mybatis的幫助文件,ResultType 查詢語句返回結果型別的完全限定名或別名。別名的使用方式與parameterType是一樣的

<select id="selectTest" resultType="User" parameterType="string">
  select * from text where name = #{name}
 </select>

這是一個 id為 selectTest的SQL對映語句 ,它的引數型別為 string 也可為複雜型別,返回值是 User型別,如果使用類 做返回值的話 類中的欄位設定的和資料庫表的欄位一致,這樣可以使資料庫和類中的屬性自動匹配以便開發(注意如果資料庫表和實體類的屬性命名不一樣則需要手動配置),引數型別為 #{引數名} 它會告訴Mybatis生成PreparedStatement引數 ,對於JDBC該引數會被識別成 ? 若採用JDBC來實現程式碼如下:

String sql = "select * from text where name = ? ";
PreparedStatement ps = new PreparedStatement(sql);
ps.setString(1,name);

由此看出,Mybatis可以節省大量的程式碼,如果想完成複雜一些的查詢或者讓配置檔案更簡潔些,這就需要了解select元素的屬性和mybatis配置檔案的屬性,
介紹屬性:

  • id:名稱空間中的唯一識別符號,可以被用來引用這條語句
  • parameterType:表示查詢語句傳入的引數的型別的完全限定名或別名
  • resultType:查詢語句返回結果型別的完全限定名或別名

使用SELECT完成多條查詢

上面只是對一個表進行查詢,但是在實際操作中查詢資料會有多條件,

結果也會有各種型別。

<!-- 設定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做自定義結果對映,欄位名可以不一致,並且還可以指定要顯示的列,比較靈活,應用也廣泛,推薦使用第二種方式來做結果對映。

<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)帶有引數表示事務是否提交 ,不帶引數不開啟事務

Sqlsession = factory.opSession(false);//true 為自動提交事務

commit 提交方法

Sqlsession.commit();//提交事務

rollback回滾

Sqlsession.rollback();//回滾事務

使用INSERT完成增加操作

Mybatis實現增加操作,使用的是insert 元素來對映插入語句,操作方法很簡單,先向介面定義一個方法 比如 int add(User user);

然後我們在SQL對映檔案中定義一個insert節點

<!-- 增加使用者 -->
<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類似

<!-- 修改使用者 -->
<update parameterType="User">
	update user set userName = #{userName},password =#{password}
	where id = #{id}
</update >

@Param註解實現多引數入參

假如我需要刪除 刪除 姓名 為 李XX 的資料 當資料庫有很多個同名的資料 所以需要其他的條件來 確認刪除那個李XX 資料 但我們 直接使用一個類物件作為引數的話,有點多餘,因為我們只需要2個條件,就ok了,當由於它的引數型別時採用map的方式只有一個引數時可直接 #{任意名}來使用,但有多個引數的時候就不行了 所以這時需要@Param註解

/**
*我們需要介面方法的引數裡面新增@Param註解
**/
 int update(@Param("id") int id,@Param("name") String name);

而我們在 SQL對映檔案中使用引數:

<update >
	update user set userName = #{name}
	where id = #{id}
</update >

使用delete完成刪除操作

Mybatis 實現刪除操作,是通過使用delete元素來對映刪除語句的,具體用法和update ,insert 類似

	int deleteUser(@Param("id") Integer id);

delete元素對映

<delete parameterType="Integer">
	delete from user where id = #{id}
</delete>

association

association 對映到JavaBean的某個 ‘複雜型別' 屬性 比如JavaBean類,即JavaBean 內部嵌入了一個複雜資料型別(JavaBean)屬性,這種情況就屬於複雜型別的關聯,但是需要注意:association 僅處理一對一的關聯關係

實體類

class User{
	private int id;
	private String name;
	private String password;
	private text userText;
	//省略getter和setter方法
}

我們使用association來對映 User 的text屬性

<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

<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元素一樣,我們使用巢狀查詢,或者從連線中巢狀結果集
實體類

class User{
	private int id;
	private String name;
	private String password;
	private List<text> userText;
	//省略getter和setter方法
}

我們在介面中新增 一個方法

	public List<User> getUserIDListBy(@Param("id") Integer userid);

使用 collection實現結果對映

<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引用基本一致

<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的核心配置檔案中設定

<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實現條件查詢內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!