Mybatis-07——【Mybatis之动态sql使用】

11、动态SQL

什么是动态SQL:动态SQL作用就是根据不同的条件拼接不同的SQL语句。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

if

if的使用时最简单的、

<select id="queryBlogIF" resultType="blog" parameterType="map">
  select * from blog where 1=1
  <if test="title != null">
    and title = #{title}
  </if>
</select>

如果if标签中的title不等于null就把标签的SQL语句拼接在SQL后面

如不等于null

-- 拼接后的SQL
select * from blog where 1=1 and title = #{title}

简单理解if的使用就是if标签中的test的值为成立就把if标签中的SQL拼接到if标签外的sql后面

choose (when, otherwise)

MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

如第一个条件成立将不在成立其他条件、只满足第一次成立的条件

<select id="queryBlogChoose" resultType="blog" parameterType="map">
  select * from blog
  <where>
    <choose>
      <when test="title != null">
        title = #{title}
      </when>
      <when test="author != null">
        and author = #{author}
      </when>
      <otherwise>
        and views = #{views}
      </otherwise>
    </choose>
  </where>
</select>

这个就是像 Java 中的 switch 语句。 如条件成立就执行本次条件、下面的条件不在执行、如条件都不成立、将拼接的是otherwise标签中的SQL语句、

小结: 就是when标签中的条件成立就拼接when标签中的sql、条件只能成立一个、如多个when标签中的条件不成立时、将拼接的是otherwise标签中的sql

trim (where, set)

where标签

<select id="queryBlogIF" resultType="blog" parameterType="map">
  select * from blog
  <where>
    <if test="title != null">
      title = #{title}
    </if>
    <if test="author != null">
      and title = #{author}
    </if>
  </where>
</select>

where标签的作用、官网解释: where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。

简单理解就是、如上面的SQL、第一个条件不成立时、第二个条件成立时此时的SQl将会是

select * from blog where and title = #{author}

如加了where标签时、此时的SQL将会变成

select * from blog where title = #{author}

由此可以得出一个结论、就是where的子句(跟在where的的SQL)、如有and或or的情况下将and或or去除、拼接正常可以执行的SQL语句、如不是where的子句、将正常拼接if标签中的SQL语句

如上面的SQL两个条件都不成立执行的将是:

select * from blog

他不会在后面拼接where语句、此时可以看出where标签的强大之处。

where标签总结

  • 简单理解就是、有条件成立时会将where 和 成立条件中(if标签中的)的sql语句 一起拼接在、如成立的条件语句中有and或or会智能的去除、去除的条件在where的子句(子句就是where后的第一句SQL)中有and或or会智能的去除保证SQL执行成功、如所有条件都不成立时、where也将会不拼接

set标签

set标签的作用、官网解释: set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号

<update id="updateBlog" parameterType="map">
        update blog
        <set>
            <if test="title != null">
                title = #{title},
            </if>
            <if test="author != null">
                author = #{author}
            </if>
        </set>
  			where  id = #{id}
    </update>

如加了set标签的话、他会自动拼接 set关键字 还会自动去除逗号。去除什么逗号、就是set后面字段做分割时的逗号、假上面的SQL语句只有一个条件成立时、他会将title = #{title}, 的逗号去除、并且拼接set关键字

trim标签

trim标签可以做完成where标签和set标签所完成的任务、trim标签简单来说就是一个自定义的标签、可以设置前缀、后缀、前缀去除什么、后缀去除的什么

<trim prefix="" prefixOverrides="" suffix="" suffixOverrides=""></trim>

prefix:前缀

prefixOverrides:前缀去除的什么

suffix:前缀

suffixOverrides:后缀去除的什么

一般不会使用这种自定义、使用where和set标签足够了。

sql片段

什么是sql片段? 就是把公共的、重复使用的、出现频率高的sql写到sql片段里面、方便复用、因此提高开发效率

sql片段的使用

1、使用SQL标签提取公共部分

<sql id="if-title-author">
  <if test="title != null">
    title = #{title}
  </if>
  <if test="author != null">
    and title = #{author}
  </if>
</sql>

2、引用、将公共部分引用进来

<select id="queryBlogIF" resultType="blog" parameterType="map">
  select * from blog
  <where>
    <include refid="if-title-author"/>
  </where>
</select>

使用sql标签来定义重复使用的sql语句、然后使用<include refid="if-title-author"/>将sql片段的sql引用到当前引用的地方、

foreach

动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)

测试运行结果

1、接口

 // 查询1、2、3用户信息
List<Blog> queryBlogForeach(List<Integer> list);

2、*Mapper.xml

<select id="queryBlogForeach" resultType="blog" parameterType="list">
  select * from blog
  <where>
    id in
    <foreach collection="list" item="id" index="index" open="(" close=")" separator=",">
      #{id}
    </foreach>
  </where>
</select>

3、测试

@org.junit.Test
  public void queryBlogForeach(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);

    List<Integer> list = new ArrayList<Integer>();
    //        list.add(1);
    //        list.add(2);
    //        list.add(3);
    List<Blog> blogs = mapper.queryBlogForeach(list);
    for (Blog blog : blogs) {
      System.out.println(blog);
    }

    sqlSession.close();
}

4、执行后的sql

select * from blog WHERE id in ( ? , ? , ? ) 

小结:

  • foreach的使用并不是很广、它通常用来把list/set/map集合或数组、做为遍历的数据项、
  • 标签
    • foreach:用来做数据遍历的、作用就是方便拼接sql、
  • 属性
    • collection:对应的值是、接口中@param中的值
    • item :对应的值是、 本次迭代获取到的元素值
    • index :对应的值是、当前迭代的序号
    • open :对应的值是、开始拼接的符号
    • close :对应的值是、最后拼接的符号
    • separator :对应的值是、中间的分割符

官网说明

foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符,看它多智能!

ps: 你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

动态SQL总结

  • 什么是动态sql?

    • 动态sql : 根据字面理解、就是根据不同的条件、生成不同的sql语句、
    • 动态sql的本质就是拼接字符串、根据不同的条件拼接不同的sql、应用更广、避免了在java层面拼接sql、有可能还拼接有误、导致程序无法执行。
  • 动态sql有什么好处?

    • 方便、简洁、高效、快捷、易学、快速入手。
    • 之前没学框架前、肯定也有过拼接sql的经历、麻烦、代码量多、易出错、动态sql完完全全解决了这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值