<choose>、<when>、<otherwise>? 相當(dāng)于java中的switch…case…default,用于多分支的條件判斷,從多個(gè)選項(xiàng)中選擇一個(gè)
<foreach> 循環(huán),常和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屬性的注意點(diǎn)
> 相等判斷:==,!=
> 邏輯與:只能用and,不能用&&
> 邏輯或:or、||均可
tel不進(jìn)行數(shù)學(xué)運(yùn)算,使用字符串類型。
<where>中有<if>成立時(shí),<where>才會(huì)在sql語句中添加WHERE關(guān)鍵字,否則不添加。
<where>會(huì)自動(dòng)剔除元素體中多余的AND、OR。
比如傳入的User對(duì)象只設(shè)置了tel,拼接的sql語句是:SELECT ?*? FROM ?user_tb ?WHERE ?AND ?tel=#{tel},<where>會(huì)自動(dòng)剔除多余的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>會(huì)自動(dòng)去掉多余的AND,但不會(huì)自動(dòng)加上缺少的AND,我們通常在每個(gè)<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會(huì)在這段字符串之前加上指定的前綴,如果里面的<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,數(shù)據(jù)庫中存儲(chǔ)的是0、1,就需要使用<choose>轉(zhuǎn)換一下。
xml
<choose>
<when test=””>
</when>
<when test=””>
</when>
<otherwise>
</otherwise>
</choose>
<choose>相當(dāng)于switch,<when>相當(dāng)于case,<otherwise>相當(dāng)于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類型,更新數(shù)據(jù)表的多個(gè)字段。先判斷字段是否有值,有值才更新該字段。
<set>用于更新操作,會(huì)自動(dòng)在這段字符串前面加sql關(guān)鍵字“SET”(里面有<if>為真),并自動(dòng)去除多余的逗號(hào)(一般自己寫第一個(gè)<if>,然后copy下來改,最后面往往會(huì)多一個(gè)逗號(hào))。
如果里面的<if>都為假,即沒有要更新的字段,不會(huì)自動(dòng)在前面加”SET”,此時(shí)這個(gè)update語句有語法錯(cuò)誤,會(huì)報(bào)錯(cuò),所以要保證至少有一個(gè)字段需要更新。
示例:按照手機(jī)號(hào)隨機(jī)抽取3位幸運(yùn)觀眾(根據(jù)手機(jī)號(hào)碼查詢用戶信息)——批量查。
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? ?本次迭代的下標(biāo),指定一個(gè)臨時(shí)變量表示下標(biāo)
item? ?本次迭代的元素,指定一個(gè)臨時(shí)變量表示本次迭代的元素
open? ?拼接這段字符串時(shí)以什么開頭
close? 拼接這段字符串以什么結(jié)尾
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對(duì)象本身時(shí),約定使用list表示List對(duì)象本身。
文/云和數(shù)據(jù)高級(jí)JAVA開發(fā)工程師