mybatis 的动态 SQL 语句

动态 SQL 之 <if> 标签

  根据实体类的不同取值,使用不同的 SQL 语句来进行查询。比如在 id 如果不为空时可以根据 id 查询,
  如果 username 不为空时还要加入用户名作为条件。

  持久层 Dao 接口

    List<User> findByCondition(User user);

  持久层 Dao 映射配置

    <select id="findByCondition" parameterType="com.fgy.domain.User" resultType="com.fgy.domain.User">
      select * from user where 1=1
      <if test="username != null and username != ''">
        and username = #{username}
      </if>
      <if test="sex != null">
        and sex = #{sex}
      </if>
    </select>
  测试:
    @Test
    public void testFindByCondition() {
    User user = new User();
    user.setUsername("");
    user.setSex("男");
    List<User> users = userDao.findByCondition(user);
    // List<User> users = userDao.findByCondition(null);
    System.out.println(users);
    }
动态 SQL 之 <where> 标签:为了简化上面 where 1=1 的条件拼装,可以采用<where>标签
  持久层 Dao 映射配置
    <select id="findByCondition" parameterType="com.fgy.domain.User" resultType="com.fgy.domain.User">
      select * from user
      <where>
        <if test="username != null and username != ''">
          and username = #{username}
        </if>
        <if test="sex != null">
          and sex = #{sex}
        </if>
      </where>
    </select>
动态标签之 <foreach> 标签
  持久层 Dao 接口
    List<User> findUserInIds(QueryVo vo);
  持久层 Dao 映射配置
    <select id="findUserInIds" parameterType="com.fgy.domain.QueryVo" resultType="com.fgy.domain.User">
    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>

    <foreach>标签用于遍历集合,它的属性:
      collection:代表要遍历的集合元素,注意编写时不要写#{}
      open:代表语句的开始部分
      close:代表结束部分

      item:代表遍历集合的每个元素,生成的变量名
      sperator:代表分隔符

  测试:

    @Test
    public void testFindUserInIds() {
      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.findUserInIds(vo);
      System.out.println(users);
    }
mybatis 中简化编写的 SQL 片段:Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的。
  定义代码片段:

    <!-- 抽取重复的语句代码片段 -->
    <sql id="defaultSql">
      select * from user
    </sql>

  引用代码片段:

    <!-- 配置查询所有操作 -->
      <select id="findAll" resultType="user">
        <include refid="defaultSql"></include>
      </select>
    <!-- 根据 id 查询 -->
      <select id="findById" resultType="UsEr" parameterType="int">

        <include refid="defaultSql"></include>
        where id = #{uid}
      </select>

原文地址:https://www.cnblogs.com/roadlandscape/p/12291457.html