定义:

动态SQL就是指根据不同的条件生成不同的SQL语句

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

动态SQL之if

使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分

//如果传入的值为null,或只有title或只有author,会产生不同的结果    select * from mybatis.blog where 1=1            and title=#{title}                and author =#{author}    

动态SQL之where

where标签

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

问题:

where后没有条件直接接了[and…]显然是不对的

SELECT * FROM BLOGWHEREAND title like ‘someTitle’

这个查询也会失败。这个问题不能简单地用条件元素来解决。这个问题是如此的难以解决,以至于解决过的人不会再想碰到这种问题。

MyBatis 有一个简单且适合大多数场景的解决办法。而在其他场景中,可以对其进行自定义以符合需求。而这,只需要一处简单的改动:

  SELECT * FROM BLOG               state = #{state}                AND title like #{title}                AND author_name like #{author.name}      

动态SQL之choose

有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

    select * from mybatis.blog                                        and title=#{title}                                        and views=#{views}                        

SQL片段

有的时候,我们可能会将一些功能的部分抽取出来,方便复用

1.使用SQL标签抽取公共部分

sql>            title=#{title},                author=#{author},    

2.使用include标签引用

    update mybatis.blog                           id=#{id}