我们使用Mybatis进行数据库查询的时候,有时需要构建很多的查询条件,但是这些条件时有时无,因此我们需要使用动态的方式来构建SQL语句,以满足查询条件的不确定性。动态SQL的创建需要依赖一些新的标签,接下来我们一一讲解。

1.if标签

1.1 新增DAO方法

在DAO接口中,我们新增一个通过查询条件进行数据查询的方法,查询条件不确定,有可能是姓名,有可能是性别,也有可能是地址:

/**
 * 根据不确定的查询条件查询用户
 * @param user
 * @return
 */
List<User> findByCondition(User user);

1.2 修改映射配置文件

<!--根据动态的查询条件进行查询-->
<select id="findByCondition" resultMap="user" parameterType="user">
    select * from user where 1=1 
    <if test="username != null">
       and username = #{username}
    </if>
</select>

test属性里是判断条件,判断关键字需要按照SQL里面的规则来写,比如and不能写成&&

1.3 测试

/**
 * 根据查询条件来进行数据查询
 */
@Test
public void testFindByCondition(){
    User user = new User();
    user.setUsername("xiangdong");
    List<User> users = userDao.findByCondition(user);
    for(User u : users){
        System.out.println(u);
    }
}

2.where标签

if标签固然很好用,但是架不住条件多,条件太多写起来也不方便,因此引出where标签,有了它我们就不需要写where 1= 1了:

<!--根据动态的查询条件进行查询-->
<select id="findByCondition" resultType="user" parameterType="user">
    select * from user
    <where>
        <if test="username != null">
           and username = #{username}
        </if>
        <if test="sex != null">
            and sex = #{sex}
        </if>
    </where>
</select>

3.foreach标签

有时我们需要依赖子查询进行数据获取,比如下面这条SQL语句:

select * from user where id in { 41, 42, 43 }

这时,我们就需要使用foreach标签完成我们的需求。

3.1 新增DAO方法

/**
 * 根据queryVo中提供的id集合查询用户的信息
 * @param vo
 * @return
 */
List<User> findByInIds(QueryVo vo);

3.2 修改QueryVo类

在其中加一个整数集合的属性,并生成器其get、set方法

public class QueryVo {
    private User user;
    private List<Integer> ids;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public List<Integer> getIds() {
        return ids;
    }

    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }
}

3.2 修改配置文件

<!--根据queryVo中的ids属性就行查询-->
<select id="findByIds" resultType="user" parameterType="queryvo">
    select * from user
    <where>
        <if test="ids != null and ids.size() >0">
            <foreach collection="ids" open="and id in (" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </if>
    </where>
</select>

需要注意的是item的值id,要和标签内的#{id}占位符一样,统一成一样的。

3.3 测试

/**
 * 测试根据集合ids查询
 */
@Test
public void testFindByids(){
    QueryVo vo = new QueryVo();
    List<Integer> ids = new ArrayList<Integer>();
    ids.add(41);
    ids.add(42);
    ids.add(45);
    vo.setIds(ids);

    List<User> users = userDao.findByIds(vo);

    for(User u : users){
        System.out.println(u);
    }
}

输出结果正常。