当前位置 > it书童 > java > 正文

Mybatis 动态 sql 语句查询

java it书童 2020-08-17 15:04:42 0赞 0踩 52阅读 0评论

本文在 Mybatis 基于代理 Dao 实现 CRUD 操作 基础上进行扩展

QueryVo 新增成员变量

新增 ids ,表示可查询多个用户 id

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

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

IUserDao 接口新增方法

/**
 * 根据传入参数条件查询用户
 * 条件不确定,可能是某个字段,也可能是多个字段
 * @param user
 * @return
 */
List<User> findUserByCondition(User user);

/**
 * 根据 queryvo 提供的 id 集合查询用户
 * @param vo
 * @return
 */
List<User> findUserInIds(QueryVo vo);

IUserDao.xml 配置文件新增映射

<!--    抽取重复的 sql 语句-->
<sql id="defaultUser">
    select * from user
</sql>

<!--    根据条件查询-->
<select id="findUserByCondition" resultMap="userMap" parameterType="user">
    select * from user
    <where>
        <if test="username != null">
            and username = #{username}
        </if>
        <if test="sex != null">
            and sex = #{sex}
        </if>
    </where>
</select>

<!--    根据 queryvo 中的 id 集合实现查询用户列表-->
<select id="findUserInIds" resultMap="userMap" parameterType="queryvo">
    <include refid="defaultUser"/>
    <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>

调用

MybatisTest

@Test
public void testFindByCondition() {
    User u = new User();
    u.setUsername("章北海");
    List<User> users = userDao.findUserByCondition(u);
    for (User user : users) {
        System.out.println(user);
    }
}

@Test
public void testFindInIds() {
    QueryVo vo = new QueryVo();
    List<Integer> list = new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    list.add(3);
    vo.setIds(list);

    List<User> users = userDao.findUserInIds(vo);
    for (User user : users) {
        System.out.println(user);
    }
}

小结

动态语句,顾名思义,参数是不确定的。因此在 xml 配置文件中需要引入模板标签进行简单的判断或者循环输出,最终拼装成完整的 sql 语句

源码

转载须注明出处:https://www.itshutong.com/articles/621/mybatis-dynamic-sql-query
关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
发表评论
我有句话,不知当讲不当讲?
要讲之前请先 登录