mybatis——動態sql

if

前寫的sql語句都是靜態的sql,這樣一個sql語句只能對應一個查詢,然而有的時候我們會涉及到許多類似的查詢,只是因爲條件或者插入數據的不同就需要重新寫一個字段。這樣在編寫代碼的過程中就會很麻煩,下面我們可以用if語句來書寫一個動態的sql語句;

select * from t_student where 1 = 1 
		<if test="name != ''">
			and s_name = #{name}
		</if>
		<if test="sno != ''">
			and s_no=#{sno}
		</if>
		<if test="gender != ''">
			and s_gender = #{gender}
		</if>

上面的代碼就是應用if判斷來書寫的一個用來查詢的動態語句,這個語句中涉及到三個判斷,用來判定三個查詢條件的有無,至於1=1條件的存在是爲了鏈接三個條件,以及維持語句的完整性。如果該條件沒有存在,如果查詢name,則name判斷中的and就不應存在,同理如果查詢的條件是另外兩個,則另外兩個判斷中的and也不應該存在。如果是這樣,當查詢條件是兩個的時候,第二個條件中的and又不得不存在,同理如果查詢條件是三個,後兩個條件也要加上and。因爲條件1=1是任何時候成立的,這樣就會解決了and去留的問題,這樣就可以順利的拼接查詢條件了,而且不影響查詢結果。

choose

在這裏大家先看一下jsp代碼,可以看到傳值

<form action="find" method="post">
		搜索內容:<input name="searchContent"/> 
		名稱:<input type="radio"  name="searchType" value="byname" checked="checked"/>
		學號:<input type="radio"  name="searchType" value="bysno"/>
		<input type="submit" value="搜索"/>
	</form>

下面是mapper配置文件中sql代碼

select * from t_student where 1 = 1 	
	<choose>
		<when test="param2=='byName'">
			and s_name = #{param1}
		</when>
		<otherwise>
			and s_no=#{param1}
		</otherwise>
	</choose>

where、 trim

在mapper中where元素只有在有句子插入時纔會插入where,並且會刪除額外的and和or

	select * from t_student 
		<where>
			<if test="name != ''">
				s_name = #{name}
			</if>
			<if test="sno != ''">
				and s_no=#{sno}
			</if>
			<if test="gender != ''">
				and s_gender = #{gender}
			</if>
		</where>

在這裏我是想提供一種活用sql的思想,大家不要侷限於使用了什麼軟件和代碼,要從中學會如何使用動態sql,自己拼接sql語句。

trim:如果有子句詩,會加入prefix中指定的單詞,如果prefixOverrides中制定的單詞多餘,就刪除。

<trim prefix="where" prefixOverrides="and|or">
		    <if test="name != ''">
				s_name = #{name}
			</if>
			<if test="sno != ''">
				and s_no=#{sno}
			</if>
			<if test="gender != ''">
				and s_gender = #{gender}
			</if>
	</trim>

set、trim

set元素只有在有子句時會插入set,並且會刪除額外的逗號。
必須保證set至少有一個子句。

<update id="update" parameterType="jee.pk6.Student">
update t_students
	<set>
		<if test="name != ''">
			s_name = #{name},
		</if>
		<if test="sno != ''">
			s_no = #{sno},
		</if>
		<if test="gender != ''">
			s_gender = #{gender}
		</if>
	</set>
where s_id = #{id}
</update>

trim:如果有子句時,會加入prefix中指定的單詞,如果suffixOverrides中指定的單詞有多餘,就刪除

<update id="modify" parameterType="jee.pk6.Student">
update t_students
	<trim prefix="set" suffixOverrides=",">
		<if test="name != ''">
			s_name = #{name},
		</if>
		<if test="sno != ''">
			s_no=#{sno}
		</if>
		<if test="gender != ''">
			s_gender = #{gender}
		</if>
	</trim>
	where s_id = #{id}
</update>

froeach

<delete id="delete">
	delete from t_students where s_id in
	<!-- collection是取參數,item代表每次迭代時的當前值,
	open是迭代前加到sql中的單詞,close是迭代結束後加到sql中的單詞
	separator是多個值之間的分隔符 -->
	<foreach collection="list" item="id" open="(" close=")" separator=",">
		#{id}
	</foreach>
</delete>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章