一。<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();
- }
- }
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();
- }
- }
-------------------------------------------------------------------------------------------------------------------------------------
三。<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();
- }
- }