标签

UserInfoMapper.xml 内容如下:

<select id="findUserInfoByUnoQuantity" parameterType="Map"  
resultMap="UserInfoResult">
select * from userinfo
<where>
<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>
</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 元素也知道如何将他们去除。

标签

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"​​​ 表示:加前缀 ​​where​​。

c.属性​​prefixOverrides="and|or"​​​ 表示:自动覆盖第一个​​and​​​或者​​or​​.

d.后缀的用法类似;