mybatis 的动态 SQL 语句

自闭症网瘾萝莉.ら 提交于 2020-02-10 17:25:19

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!