<choose>、<when>、<otherwise>? 相當于java中的switch…case…default,用于多分支的條件判斷,從多個選項中選擇一個
<foreach> 循環,常和sql的in語句搭配使用
<where>、<trim>、<set>? 輔助元素,用于一些處理sql拼裝、特殊字符的問題
<select id=”queryUser” parameterType=”user” resultType=”user”>
SELECT * FROM user_tb
<where>
<if test=”name!=null and name!=””>
name=#{name}
</if>
<if test=”tel!=null and tel!=””>
AND tel=#{tel}
</if>
</where>
</select>
<if>中的test表示條件,條件成立就把元素體中的字符串拼接到sql語句中,否則不拼接。
> test屬性的注意點
> 相等判斷:==,!=
> 邏輯與:只能用and,不能用&&
> 邏輯或:or、||均可
tel不進行數學運算,使用字符串類型。
<where>中有<if>成立時,<where>才會在sql語句中添加WHERE關鍵字,否則不添加。
<where>會自動剔除元素體中多余的AND、OR。
比如傳入的User對象只設置了tel,拼接的sql語句是:SELECT ?*? FROM ?user_tb ?WHERE ?AND ?tel=#{tel},<where>會自動剔除多余的AND。
xml
<select id=”queryUser” parameterType=”user” resultType=”user”>
SELECT * FROM user_tb? WHERE 1=1
<if test=”name!=null and name!=””>
AND name=#{name}
</if>
<if test=”tel!=null and tel!=””>
AND tel=#{tel}
</if>
</select>
<where>會自動去掉多余的AND,但不會自動加上缺少的AND,我們通常在每個<if>中都加上AND,防止把AND寫掉了。
xml
<select id=”queryUser” parameterType=”user” resultType=”user”>
SELECT * FROM user_tb
<trim prefix=”WHERE” prefixOverrides=”AND”>
<if test=”name!=null and name!=””>
name=#{name}
</if>
<if test=”tel!=null and tel!=””>
AND tel=#{tel}
</if>
</trim>
</select>
prefix會在這段字符串之前加上指定的前綴,如果里面的<if>都不滿足條件,則不加前綴。
prefixOverrides指定要去除的多余的字符串。
xml
<select id=”queryPwd” parameterType=”user” resultType=”string”>
SELECT password FROM user_tb WHERE name=#{name}
<choose>
<when test=”role==’admin'”>
AND role=’admin’
</when>
<when test=”role==’teacher'”>
AND role=’teacher’
</when>
<when test=”role==’student'”>
AND role=’student’
</when>
</choose>
</select>
xml
<select id=”queryPwd” parameterType=”user” resultType=”string”>
SELECT password FROM user_tb WHERE name=#{name} AND role=#{role}
</select>
如果不一致,比如性別,傳入的是male、female,數據庫中存儲的是0、1,就需要使用<choose>轉換一下。
xml
<choose>
<when test=””>
</when>
<when test=””>
</when>
<otherwise>
</otherwise>
</choose>
<choose>相當于switch,<when>相當于case,<otherwise>相當于default。
<set>可解決此問題:
xml
<select id=”updateUser” parameterType=”user”>
UPDATE user_tb
<set>
<if test=”name!=null and name!=””>
name=#{name},
</if>
<if test=”tel!=null and tel!=””>
tel=#{tel},
</if>
<if test=”address!=null and address!=””>
name=#{name},
</if>
</set>
where id=#{id}
</select>
<set>用于傳入pojo類型,更新數據表的多個字段。先判斷字段是否有值,有值才更新該字段。
<set>用于更新操作,會自動在這段字符串前面加sql關鍵字“SET”(里面有<if>為真),并自動去除多余的逗號(一般自己寫第一個<if>,然后copy下來改,最后面往往會多一個逗號)。
如果里面的<if>都為假,即沒有要更新的字段,不會自動在前面加”SET”,此時這個update語句有語法錯誤,會報錯,所以要保證至少有一個字段需要更新。
示例:按照手機號隨機抽取3位幸運觀眾(根據手機號碼查詢用戶信息)——批量查。
xml
<select id=”queryUser” parameterType=”list” resultType=”user”>
SELECT * FROM user_tb WHERE tel IN
<foreach collection=”list” index=”index” item=”item” open=”(” separator=”,” close=”)”>
#{item}
</foreach>
</select>
java
ArrayList<String> telList = new ArrayList<>();
telList.add(“110”);
telList.add(“119”);
telList.add(“120”);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.queryUser(telList);
System.out.println(userList);
index? ?本次迭代的下標,指定一個臨時變量表示下標
item? ?本次迭代的元素,指定一個臨時變量表示本次迭代的元素
open? ?拼接這段字符串時以什么開頭
close? 拼接這段字符串以什么結尾
separator? ?迭代的元素之間用什么連接(分隔)
collection是必需的,其余均可選。
xml
<select id=”queryUser” parameterType=”list” resultType=”user”>
SELECT * FROM user_tb WHERE tel IN
<if test=”list!=null and list.size>0″>
<foreach collection=”list” index=”index” item=”item” open=”(” separator=”,” close=”)”>
#{item}
</foreach>
</if>
</select>
如果傳入的是List類型,要使用List對象本身時,約定使用list表示List對象本身。
文/云和數據高級JAVA開發工程師