天天看點

Mybatis最入門---動态查詢(where,trim,set) 一。<where>标簽二.<trim>标簽三。<set>标簽

[一步是咫尺,一步即天涯]

首先,請大家先回顧一下,我們前文在講述<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>這幾個标簽能夠幫助我們解決絕大多數的增改删查問題。是以,請各位看官之後多多練習吧

繼續閱讀