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>