在执行查询操作时查询条件可能比较复杂,比如查询条件包括:username、sex、address。此时需要在sql语句中加上这三个查询条件。但是这三个条件来自用户输入,可能会缺少某些条件,可能只输入了一个,也可能输入了三个,此时使用动态SQL语句就可以解决这个问题,动态SQL语句会根据条件拼接sql语句。
if标签
if
标签主要是判断某个条件是否存在,如下的示例中表示根据username
和address
查询用户,示例中使用别名:
<select id="findByUser" resultType="user" parameterType="user">
select * from user where 1=1
<if test="username!=null and username != '' ">
and username like #{username}
</if>
<if test="address != null">
and address like #{address}
</if>
</select>
详解:
test
属性:判断条件,其值为参数对象的属性名,如果参数是包装类的对象要使用OGNL表达式的写法,例如user.username
。1=1
的作用:防止出现类似where and id=1
或者只有where
而其后没有条件的情况发生。
在持久层接口(UserDao)中添加findByUser
方法,如下:
/**
* 根据用户信息,查询用户
* @param user
* @return
*/
List<User> findByUser(User user);
在测试类中添加如下测试方法,运行该测试方法即可看效果:
/**
* 测试根据用户信息,查询用户
*/
@Test
public void testFindByUser() {
User u = new User();
u.setUsername("%王%");
List<User> users = userDao