我们根据实体类的不同取值,使用不同的 SQL 语句来进行查询。比如在 id 如果不为空时可以根据 id 查询,如果 username 不为空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。 1.dao层接口
List<User> findUser(User user);
2.映射文件编写
<select id="findUser" resultType="User" parameterType="User">
select * from user where 1=1
<if test="username!=null">
and username=#{username}
</if>
<if test="sex!=null">
and sex=#{sex}
</if>
</select>
3.测试类编写
@Test
public void testFindUser() {
User u1= new User();
u1.setUsername("张三");
u1.setSex("男");
//6.执行操作
List<User> users = userDao.findByUser(u1);
for(User user : users) {
System.out.println(user);
}
}
为了简化上面 where 1=1 的条件拼装,我们可以采用标签来简化开发 1、映射配置文件编写
<select id="findUser" resultType="User" parameterType="User">
select * from user
<where>
<if test="username!=null">
and username=#{username}
</if>
<if test="sex!=null">
and sex=#{sex}
</if>
<if test="address!=null">
and address=#{address}
</if>
</where>
</select>
2、测试类编写
@Test
public void testFindUser() {
User u1 = new User();
u1.setUsername("老王");
u1.setSex("女");
List<User> users = userDao.findUser(u1);
for (User user : users) {
System.out.println(user);
}
}
三、动态SQL----froeach标签
传入多个 id 查询用户信息,用下边两个 SQL语句 实现: SELECT * FROM USERS WHERE username LIKE ‘%王%’ AND (id =10 OR id =89 OR id=16) SELECT * FROM USERS WHERE username LIKE ‘%王%’ AND id IN (10,89,16) 这样我们在进行范围查询时,就要将一个集合中的值,作为参数动态添加进来。 这样我们将如何进行参数的传递? 1、 在pojo中加入加入一个 List 集合用于封装参数
private List<Integer> ids;
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
}
2、编写DAO层接口
List<User> findIds(QueryVo vo);
3、编写映射文件
<select id="findIds" resultType="user" parameterType="user">
select * from user
<where>
<if test="ids != null and ids.size()>0">
<foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>
SQL 语句: select 字段 from user where id in (?) foreach标签用于遍历集合,它的属性: collection:代表要遍历的集合元素,注意编写时不要写#{} open:代表语句的开始部分 close:代表结束部分