MyBatis動態SQL(一)


MyBatis 的強大特性之一便是它的動態 SQL。動態 SQL 元素和 JSTL 或基於類似 XML 的文本處理器相似。在 MyBatis 之前的版本中,有很多元素需要花時間了解。MyBatis 3 大大精簡了元素種類,現在只需學習原來一半的元素便可。MyBatis 采用功能強大的基於 OGNL 的表達式來淘汰其它大部分元素。

1.if標簽

映射文件配置:

  	<select id="query" resultMap="baseMap" parameterType="user">
		select * from t_user
		<!-- 這里的1=1方便測試 -->
		 where 1=1
		 <!-- 條件if標簽通過判斷name參數是否為空決定是否使用這個SQL語句 -->
		<if test="name!=null" >
			and name=#{name}
		</if>
	</select>

測試代碼name=null的情況下:

@Test
	public void test() {
		List<User> list = mapper.query(new User());
		for (User user : list) {
			System.err.println("在name=null的情況下"+user);
		}
	}

測試結果:
在這里插入圖片描述
測試代碼name!=null的情況下:

@Test
	public void test() {
		User testUser = new User();
		testUser.setName("zhangsan");
		List<User> list = mapper.query(testUser);
		for (User user : list) {
			System.err.println("在name=null的情況下"+user);
		}
	}

在這里插入圖片描述

2. choose,when,otherwise

choose選擇語句,差不多等同於java語句中的switch語句。通過創建多個標簽元素來選擇符合要求的元素。when表示在滿足某種情況下調用該內容,otherwise表示在所有情況都不滿足的情況下調用的內容。
配置標簽代碼使用方式:

<select id="query" resultMap="baseMap" parameterType="user">
		select * from t_user
		 where 1=1
		 <!-- 如果滿足其中的條件就調用其中的SQL語句 -->
		<choose>
			<when test="no!=null">
				and no=#{no}
			</when>
			<when test="name!=null">
				and name=#{name}
			</when>
			<otherwise>
				<if test="age!=null" >
					and age=#{age}
				</if>
			</otherwise>
		</choose>
	</select>

3.where

上述配置代碼中為了方便測試我都在where后面添加1=1來方便測試,但是有時候我們對where是否使用也需要動態決定。這個時候就可以使用where標簽來解決這個問題。

<select id="queryById" resultType="user" parameterType="int">
		select * 
		from t_user 
		<where>
			<if test="no!=null" >
					 no=#{no}
				</if>
		</where>
	</select>

這里滿足條件就會自動添加where並調用其中的SQL代碼。

4.set

set標簽主要用於SQL更新UPDATE代碼中,用法如下代碼:

<update id="update" parameterType="user">
		update t_user 
		<!-- 通過set來動態設置更新的參數 -->
		<set>
			<if test="name!=null">name=#{name}</if>
			<if test="age!=null">age=#{age}</if>
		</set>
		where no = #{no} 
	</update>

5.trim

trim標簽是一個格式化標簽,可以用來代替set或者where標簽的功能。具體用法如下代碼:

<update id="update" parameterType="user">
		update t_user 
		<!-- <set>
			<if test="name!=null">name=#{name}</if>
			<if test="age!=null">age=#{age}</if>
		</set> -->
		<!-- prefix表示調用SQL語句時在最前面添加的前綴
			prefixOverrides表示調用SQL語句時去掉的第一個指定內容
			suffix表示調用SQL語句時在最后面添加的后綴
			suffixOverride表示調用SQL語句時去掉的最后一個指定內容
		 -->
		<trim prefix="set" prefixOverrides="and | or">
			<if test="name!=null"> and name=#{name}</if>
			<if test="age!=null"> or age=#{age}</if>
		</trim>
		where no = #{no} 
	</update>

通過這個trim獲得了跟set一樣的效果,不過更具有靈活性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM