可以利用动态SQL摆脱凭借SQL语句的痛苦。
MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。

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

if

动态 SQL 通常要做的事情是根据条件包含 where 子句的一部分。

<select id="findActiveBlogWithTitleLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null">AND title like #{title}</if>
</select>

如果希望通过“title”和“author”两个参数进行可选搜索该怎么办呢?首先,改变语句的名称让它更具实际意义;然后只要加入另一个条件即可。

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if>
</select>

choose, when, otherwise

有点像java的switch,只能选一项。
下面的例子说明要么按title查找,要么按author查找。

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’<choose><when test="title != null">AND title like #{title}</when><when test="author != null and author.name != null">AND author_name like #{author.name}</when><otherwise>AND featured = 1</otherwise></choose>
</select>

trim, where, set

在上面例子中,如果没有一个匹配上,则sql会变成:

SELECT * FROM BLOG
WHERE

或仅仅第二个条件匹配会变成:

SELECT * FROM BLOG
WHERE
AND title like ‘someTitle’

Mybatis的 where 标签 可以解决这样的问题。

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG <where> <if test="state != null">state = #{state}</if> <if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if></where>
</select>

where 元素只会在至少一个子素的条件下才会插入“where”子句,若语句开头为“and”或“or”,where元素也会将其去除。

trim 元素用来定制 where 元素的功能。

<trim prefix="WHERE" prefixOverrides="AND |OR ">...
</trim>

类似的用于动态更新语句的解决方案叫做 set

<update id="updateAuthorIfNecessary">update Author<set><if test="username != null">username=#{username},</if><if test="password != null">password=#{password},</if><if test="email != null">email=#{email},</if><if test="bio != null">bio=#{bio}</if></set>where id=#{id}
</update>

set 元素会动态前置 SET 关键字,同时也会删掉无关的逗号。比如,低四条没有时会余留逗号。

set的trim写法如下

<trim prefix="SET" suffixOverrides=",">...
</trim>

注意这里我们删去的是后缀值,同时添加了前缀值。

foreach

动态 SQL 的另外一个常用的操作需求是对一个集合进行遍历,通常是在构建 IN 条件语句的时候。

<select id="selectPostIn" resultType="domain.blog.Post">SELECT *FROM POST PWHERE ID in<foreach item="item" index="index" collection="list"open="(" separator="," close=")">#{item}</foreach>
</select>

foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及在迭代结果之间放置分隔符。

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

bind

bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。比如:

<select id="selectBlogsLike" resultType="Blog"><bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />SELECT * FROM BLOGWHERE title LIKE #{pattern}
</select>

多数据库支持

一个配置了“_databaseId”变量的 databaseIdProvider 可用于动态代码中,这样就可以根据不同的数据库厂商构建特定的语句。

<insert id="insert"><selectKey keyProperty="id" resultType="int" order="BEFORE"><if test="_databaseId == 'oracle'">select seq_users.nextval from dual</if><if test="_databaseId == 'db2'">select nextval for seq_users from sysibm.sysdummy1"</if></selectKey>insert into users values (#{id}, #{name})
</insert>

动态SQL中的可插拔脚本语言

MyBatis 从 3.2 开始支持可插拔脚本语言,这允许你插入一种脚本语言驱动,并基于这种语言来编写动态 SQL 查询语句。
详情:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html

Mybatis3(3)动态 SQL相关推荐

  1. Mybatis学习日记(四)——动态SQL第一部分

    Mybatis的强大特性之一是它的动态SQL,在进行项目开发的时候,我们对数据库的操作不可能全部是定式的,当对数据库的操作根据不同情况发生变化时,就可以用到Mybatis的动态SQL.而Mybatis ...

  2. mybatis的注解开发之三种动态sql

    脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...

  3. MyBatis4:动态SQL

    什么是动态SQL MyBatis的一个强大特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件串联SQL字符串在一起是多么地痛苦,确保不能忘了空格或者在列表的最后的 ...

  4. MyBatis-11MyBatis动态SQL之【if】

    动态SQL概述 if概述 在WHERE条件中使用if 需求 1.UserMapper接口中增加接口方法 2.UserMapper.xml配置动态SQL 3.单元测试 在UPDATE条件中使用if 需求 ...

  5. Mybatis的第三章动态sql总结

    我们来讲一下为什么要使用Mybatis的动态sql ? *因为动态sql之所以是Mybatis 的强大特性是因为我们在使用JDBC操作数据库的时候如果查询特别的多,将条件串联成sql字符串是一件很痛苦 ...

  6. MyBatis mapper 注解过程中通过 LanguageDriver 实现动态 SQL

    使用前,可以先看一下 链接: http://www.mybatis.org/mybatis-3/dynamic-sql.html 详细说明了 mybatis 的动态 sql 实现方式,这里将重点关注 ...

  7. 最常用的动态sql语句梳理Mybatis(转)

    公司项目中一直使用Mybatis作为持久层框架,自然,动态sql写得也比较多了,最常见的莫过于在查询语句中使用if标签来动态地改变过滤条件了.Mybatis的强大特性之一便是它的动态sql,免除了拼接 ...

  8. mybatis_user_guide(5) 动态 SQL

    [-1]README 1)本文全文总结于 http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html [0]动态 SQL 元素和使用 JSTL 或其他类似 ...

  9. mybatis动态sql中的where标签的使用

    From: https://blog.csdn.net/wobuaizhi/article/details/81874664 在使用mybatis的动态sql时,有时候遇到根据条件判断添加where后 ...

最新文章

  1. 读大叔深入理解javascript(2)
  2. 码栈开发手册(三)---编码方式开发(高级课程①)
  3. 【数理知识】神仙文章(回忆大学所学)常微分方程
  4. python中与时间有关的对象-datetime、time、date
  5. Mac版Endnote X9在word中无法插入文献怎么办?
  6. android资源包混淆,Android---andresguard资源混淆
  7. 网络基础:分享几个路由器设置小技巧,总有用得到的一天!
  8. 配置Windows Server2008故障转移集群
  9. 企业微信添加机器人播报天气
  10. 先装ubuntu后装windows时遇到的问题的解决办法
  11. 这一篇彻底说清楚了!乐高,编程,机器人到底要不要学?
  12. Nuvoton I91200 语音MCU入门教程
  13. linux学习(跟着b站尚硅谷老师学习)
  14. 淘宝详情页设计要点有哪些 优秀淘宝详情页面多少屏合适
  15. 您选择的不是数据库安装目录_您不是您的数据,但您的数据仍然是您
  16. 浏览器无法访问gitlab.nicky.com解决办法
  17. 如何对web系统开展无障碍测试
  18. 搜狗推送软件搜狗收录详细教程
  19. Unity中的Object和object的区别
  20. 用直接分解法求方程组的C语言程序,c语言编程求解线性方程组论文

热门文章

  1. CF1592E Bored Bakry
  2. Alice and Bob
  3. Triangle HDU - 5914
  4. 2021-09-211547G - How Many Paths?
  5. 倍增:喷泉 深度解析(洛谷P7167)
  6. YbtOJ-方格填写【插头dp】
  7. jzoj2700-数字【数论,LCM】
  8. P2278-[HNOI2003]操作系统【堆】
  9. 【数学】数列(jzoj 2752)
  10. [NOI2019] 序列(模拟费用流)