MyBatis笔记(二)

动态SQL语句

1.<if>标签

<if>标签用来有条件地执行标签内的SQL语句,例如当username不为空时将用户名作为匹配条件。
UserDao.java

/**
 * 根据QueryVo中的条件查询用户
 * @param vo
 * @return
 */
List<User> findByVo(QueryVo vo);

UserDao.xml

<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>

MyBatisTests.java

@Test
public void testFindByUser() {
    User user = new User();
    user.setUsername("%g%");
    user.setAddress("%黄%");
    List<User> users = userDao.findByUser(user);
    for (User u : users) {
        System.out.println(u);
    }
}

2.<where>标签

为了简化上面 where 1=1 的条件拼装,我们可以采用<where>标签来简化开发。
UserDao.xml

<select id="findByUser" resultType="User" parameterType="User">
    select * from user
    <where>
        <if test="username != null and username != '' ">
            and username like #{username}
        </if>
        <if test="address != null">
            and address like #{address}
        </if>
    </where>
</select>

3.<foreach>标签

当需要用多个id查询用户时,SQL是这样的:select * from user where id in (1, 2, 3);
这样我们在进行范围查询时,就要将一个集合中的值,作为参数动态添加进来。
QueryVo.java中加入一个List集合用于封装参数

private List<Integer> ids;

UserDao.java

/**
 * 根据id集合查询用户列表
 * @param vo
 * @return
 */
List<User> findInIds(QueryVo vo);

UserDao.xml

<select id="findInIds" resultType="User" parameterType="QueryVo">
    select * from user
    <where>
        <if test="ids != null and ids.size() > 0">
            <foreach collection="ids" open="id in ( " close=")" item="id" separator=",">
                #{id}
            </foreach>
        </if>
    </where>
</select>

MyBatisTests.java

@Test
public void testFindInIds() {
    QueryVo vo = new QueryVo();
    List<Integer> ids = new ArrayList<>();
    ids.add(1);
    ids.add(2);
    ids.add(3);
    vo.setIds(ids);
    List<User> users = userDao.findInIds(vo);
    for (User user : users) {
        System.out.println(user);
    }
}

<foreach>标签用于遍历集合,它的属性:

  • collection: 代表要遍历的集合元素,注意编写时不要写#{}
  • open: 代表SQL的开始部分
  • close: 代表SQL的结束部分
  • item: 代表遍历集合的每个元素,生成的变量名
  • sperator: 代表分隔符

4.<sql>标签和<include>标签

Mapper中可将重复的SQL提取出来,使用<include>引用即可,最终达到SQL重复使用的目的。
UserDao.xml

<sql id="defaultSql">
    select * from user
</sql>

<select id="findById" resultType="User" parameterType="int">
    <include refid="defaultSql"></include>
    <where>
        <if test="username != null and username != '' ">
            and username like #{username}
        </if>
        <if test="address != null">
            and address like #{address}
        </if>
    </where>
</select>
posted @ 2021-08-11 15:59  阿松0919  阅读(49)  评论(0)    收藏  举报