[一步是咫尺,一步即天涯]
首先,請大家先回顧一下,我們前文在講述<if>時說至少有一個where 固定條件,并且在缺失固定條件是SQL的執行結果是0個符合條件的資料。可現實情況是,我們真的有時候無法确定輸入條件中是不是至少有一個有效。本文,我們就來解決這個問題。
準備工作:
a.作業系統 :win7 x64
b.基本軟體:MySQL,Mybatis,Spring,SQLyog
-------------------------------------------------------------------------------------------------------------------------------------
一。<where>标簽
1.複制上文工程,重命名為Mybatis08工程,工程結構圖如下:
2.修改UserInfoMapper.xml,具體内容如下:
<select id="findUserInfoByUnoQuantity" parameterType="Map"
resultMap="UserInfoResult">
select * from userinfo
<where>
<if test="department!=null">
<span style="white-space:pre"> </span>department like #{department}
</if>
<if test="gender!=null">
AND gender=#{gender}
</if>
<if test="position!=null">
AND position like #{position}
</if>
</where>
</select>
【解釋】
a.select之後沒有直接寫Sql語句的where,而是使用<where>标簽
b.按照标準寫法,第一個<if>标簽内的AND應該不寫,但是,就算開發中書寫也不會報錯。這就是where标簽幫助我們自動的移除了第一個AND連結。但是,第二個之後的<if>标簽内,必須有AND連結。
c.如果沒有一個條件符合,則傳回所有條目。
d.<if>标簽的其他用法請參考前文,這裡不再贅述
3.修改單元測試方法,如下:
@Test
public void testSeletOne() {
try {
Map<String, Object> map = new HashMap<String, Object>();
map.put("department", "1");
map.put("gender", "1");
map.put("position", "工程師");
Departments d = new Departments("2", "%售%");
map.put("d", d);
UserInfoDao userInfo = sqlSession.getMapper(UserInfoDao.class);
List<UserInfo> UIList = userInfo.findUserInfoByUnoQuantity(map);
for (UserInfo ui : UIList) {
System.out.println(ui.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
4.運作單元測試方法,觀察輸出即可。
5.結論:where 元素知道隻有在一個以上的<if>條件有值的情況下才去插入“WHERE”子句。而且,若内容是“AND”或“OR”開頭的,where 元素也知道如何将他們去除。
--------------------------------------------------------------------------------------------------------------------------------------------------------
二.<trim>标簽
1.該标簽的功能與<where>類似,并且額外的提供了字首字尾功能。具體用法如下:
2.修改Mapper檔案,具體内容如下:
<select id="findUserInfoByTrim" parameterType="Map"
resultMap="UserInfoResult">
select * from userinfo
<trim prefix="where" prefixOverrides="and|or">
<if test="department!=null">
AND department like #{department}
</if>
<if test="gender!=null">
AND gender=#{gender}
</if>
<if test="position!=null">
AND position like #{position}
</if>
</trim>
</select>
【解釋】
a.我們使用<trim>替代<where>标簽。
b.屬性“prefix”表示:加入字首where
c.屬性“prefixOverrides”表示:自動覆寫第一個“and”或者“or”
d.字尾的用法類似;
3.增加對應接口,修改單元測試方法調用接口,如下:
@Test
public void testSeletOne() {
try {
Map<String, Object> map = new HashMap<String, Object>();
map.put("department", "1");
map.put("gender", "1");
map.put("position", "工程師");
Departments d = new Departments("2", "%售%");
map.put("d", d);
UserInfoDao userInfo = sqlSession.getMapper(UserInfoDao.class);
List<UserInfo> UIList = userInfo.findUserInfoByTrim(map);
for (UserInfo ui : UIList) {
System.out.println(ui.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
4.運作單元測試方法,觀察控制台輸出即可。
-------------------------------------------------------------------------------------------------------------------------------------
三。<set>标簽
1.注意:此标簽用于update語句。請各位看官注意觀察書寫方法。
2.修改Mapper檔案,具體内容如下:
<update id="updateUserInfoBySet" parameterType="userInfo">
update userInfo
<set>
<if test="mobile!=null">
mobile=#{mobile},
</if>
<if test="gender!=null">
gender=#{gender},
</if>
<if test="position!=null">
position = #{position},
</if>
</set>
where userid=#{userid}
</update>
【解釋】
a.SQL語句的set被<set>标簽替代。
b.每個<if>中語句最後都帶有逗号,如果有寫過SQL語句的同學就一定知道,最後的逗号是不能有的,是以,這裡的<set>标簽能夠幫助我們自動的移除最後一個<if>中的逗号。
c.<trim>是一個非常強大的标簽,是以,我們也可以通過<trim>來實作<set>的功能,如下:【這種寫法的運作效果與<set>等價】
<update id="updateUserInfoBySet" parameterType="userInfo">
update userInfo
<trim prefix="SET" suffixOverrides=",">
<if test="mobile!=null">
mobile=#{mobile},
</if>
<if test="gender!=null">
gender=#{gender},
</if>
<if test="position!=null">
position = #{position},
</if>
</trim>
where userid=#{userid}
</update>
3.增加對應接口,修改單元測試方法調用接口,如下:
@Test
public void testUpdate() {
try {
UserInfo ui = new UserInfo("admin", "3", "經理", "77778888","0", "[email protected]", null);
UserInfoDao userInfo = sqlSession.getMapper(UserInfoDao.class);
int re = userInfo.updateUserInfoBySet(ui);
if(re==1){
System.out.println("更新成功");
}
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
4.運作單元測試方法,觀察控制台輸出即可
--------------------------------------------------------------------------------------------------------------------------------------------------------
至此,Mybatis最入門---動态查詢(choose,when,otherwise)結束
特别備注:
經過上面的叙述與使用,發現<if><where><trim><set>這幾個标簽能夠幫助我們解決絕大多數的增改删查問題。是以,請各位看官之後多多練習吧