请选择 进入手机版 | 继续访问电脑版

[MsSql] mybatis动态sql常用场景总结

[复制链接]
查看66 | 回复22 | 2021-9-17 11:43:07 | 显示全部楼层 |阅读模式
目次

媒介

平常 在开发 中,针对动态sql这块现在 是薄缺点 ,本身 根据官网在对应项目边测试边写博客,此篇只是为了加深动态sql的纯熟 度,有不到之处敬请品评 指正!

1.if

利用 动态 SQL 最常见情形 是根据条件包含 where 子句的一部分。比如:

  1. <select id="findActiveBlogWithTitleLike"
  2. resultType="Blog">
  3. SELECT * FROM BLOG
  4. WHERE state = ‘ACTIVE'
  5. <if test="title != null">
  6. AND title like #{title}
  7. </if>
  8. </select>
复制代码

这条语句提供了可选的查找文本功能。假如 不传入 “title”,那么全部 处于 “ACTIVE” 状态的 BLOG 都会返回;假如 传入了 “title” 参数,那么就会对 “title”
一列举行 含糊 查找并返回对应的 BLOG 结果 (仔细 的读者大概 会发现,“title” 的参数值必要 包含查找掩码或通配符字符)。
假如 渴望 通过 “title” 和 “author” 两个参数举行 可选搜刮 该怎么办呢?起首 ,我想先将语句名称修改成更名副着实 的名称;接下来,只必要 加入另一个条件即可。

  1. <select id="findActiveBlogLike"
  2. resultType="Blog">
  3. SELECT * FROM BLOG WHERE state = ‘ACTIVE'
  4. <if test="title != null">
  5. AND title like #{title}
  6. </if>
  7. <if test="author != null and author.name != null">
  8. AND author_name like #{author.name}
  9. </if>
  10. </select>
复制代码

2. choose、when、otherwise

偶然 间 ,我们不想利用 全部 的条件,而只是想从多个条件中选择一个利用 。针对这种环境 ,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
还是上面的例子,但是策略变为:传入了 “title” 就按 “title” 查找,传入了 “author” 就按 “author” 查找的环境 。若两者都没有传入,
就返回标记为 featured 的 BLOG(这大概 是管理员以为 ,与其返回大量的偶然 义随机 Blog,还不如返回一些由管理员精选的 Blog)。

  1. <select id="findActiveBlogLike"
  2. resultType="Blog">
  3. SELECT * FROM BLOG WHERE state = ‘ACTIVE'
  4. <choose>
  5. <when test="title != null">
  6. AND title like #{title}
  7. </when>
  8. <when test="author != null and author.name != null">
  9. AND author_name like #{author.name}
  10. </when>
  11. <otherwise>
  12. AND featured = 1
  13. </otherwise>
  14. </choose>
  15. </select>
复制代码

3. trim、where、set

前面几个例子已经方便地办理 了一个臭名昭著的动态 SQL 标题 。如今 回到之前的 “if” 示例,这次我们将 “state = ‘ACTIVE'” 设置成动态条件,看看会发生什么。

  1. <select id="findActiveBlogLike"
  2. resultType="Blog">
  3. SELECT * FROM BLOG
  4. WHERE
  5. <if test="state != null">
  6. state = #{state}
  7. </if>
  8. <if test="title != null">
  9. AND title like #{title}
  10. </if>
  11. <if test="author != null and author.name != null">
  12. AND author_name like #{author.name}
  13. </if>
  14. </select>
复制代码

假如 没有匹配的条件会怎么样?终极 这条 SQL 会变成如许 :

  1. SELECT * FROM BLOG
  2. WHERE
复制代码

这会导致查询失败。假如 匹配的只是第二个条件又会怎样?这条 SQL 会是如许 :

  1. SELECT * FROM BLOG
  2. WHERE
  3. AND title like ‘someTitle'
复制代码

这个查询也会失败。这个标题 不能简单地用条件元向来 办理 。这个标题 是云云 的难以办理 ,以至于办理 过的人不会再想遇到 这种标题 。
MyBatis 有一个简单且得当 大多数场景的办理 办法。而在其他场景中,可以对其举行 自定义以符合需求。而这,只必要 一处简单的改动:

  1. <select id="findActiveBlogLike"
  2. resultType="Blog">
  3. SELECT * FROM BLOG
  4. <where>
  5. <if test="state != null">
  6. state = #{state}
  7. </if>
  8. <if test="title != null">
  9. AND title like #{title}
  10. </if>
  11. <if test="author != null and author.name != null">
  12. AND author_name like #{author.name}
  13. </if>
  14. </where>
  15. </select>
复制代码

where 元素只会在子元素返回任何内容的环境 下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
假如 where 元素与你渴望 的不太一样,你也可以通过自定义 trim 元向来 定制 where 元素的功能。比如,和 where 元素等价的自定义 trim 元素为:

  1. <trim prefix="WHERE" prefixOverrides="AND |OR ">
  2. ...
  3. </trim>
复制代码

prefixOverrides 属性会忽略通过管道符分隔的文本序列(留意 此例中的空格是必要的)。上述例子会移除全部 prefixOverrides 属性中指定的内容,并且插入 prefix 属性中指定的内容。
用于动态更新语句的雷同 办理 方案叫做 set。set 元素可以用于动态包含必要 更新的列,忽略别的 不更新的列。比如:

  1. <update id="updateAuthorIfNecessary">
  2. update Author
  3. <set>
  4. <if test="username != null">username=#{username},</if>
  5. <if test="password != null">password=#{password},</if>
  6. <if test="email != null">email=#{email},</if>
  7. <if test="bio != null">bio=#{bio}</if>
  8. </set>
  9. where id=#{id}
  10. </update>
复制代码

这个例子中,set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在利用 条件语句给列赋值时引入的)。
来看看与 set 元素等价的自定义 trim 元素吧:

  1. <trim prefix="SET" suffixOverrides=",">
  2. ...
  3. </trim>
复制代码

留意 ,我们覆盖了后缀值设置,并且自定义了前缀值。

4. foreach

动态 SQL 的另一个常见利用 场景是对集合举行 遍历(尤其是在构建 IN 条件语句的时间 )。比如:

  1. <select id="selectPostIn" resultType="domain.blog.Post">
  2. SELECT *
  3. FROM POST P
  4. WHERE ID in
  5. <foreach item="item" index="index" collection="list"
  6. open="(" separator="," close=")">
  7. #{item}
  8. </foreach>
  9. </select>
复制代码

foreach 元素的功能非常强大 ,它答应 你指定一个集合,声明可以在元素体内利用 的集合项(item)和索引(index)变量。它也答应 你指定开头与末端 的字符串以及集合项迭代之间的分隔符。
这个元素也不会错误地添加多余的分隔符,看它多智能!
提示 你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当利用 可迭代对象或者数组时,index 是当前迭代的序号,
item 的值是本次迭代获取到的元素。当利用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。
至此,我们已经完成了与 XML 设置 及映射文件干系 的讨论。下一章将具体 探究 Java API,以便你能充分利用 已经创建的映射设置 。

到此这篇关于mybatis动态sql总结的文章就先容 到这了,更多干系 mybatis动态sql内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的干系 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 素舒 | 2021-9-23 12:16:10 | 显示全部楼层
看了这么多帖子,第一次看看到这么有内涵的!
回复

使用道具 举报

avatar 见贤思齐380 | 2021-9-24 05:09:36 | 显示全部楼层
精华帖的节奏啊!
回复

使用道具 举报

avatar 秦基兴拍 | 2021-10-1 22:19:46 | 显示全部楼层
在这个版块混了这么久了,第一次看见这么给你的帖子!
回复

使用道具 举报

avatar V刘晨曦 | 2021-10-2 01:04:42 | 显示全部楼层
管它三七二十一!
回复

使用道具 举报

avatar 大嘴997 | 2021-10-2 18:56:07 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,运动刷步数还是免费刷的,QQ和微信都可以刷,特别好用。访问地址:http://yd.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 陆子525630 | 2021-10-5 00:57:58 | 显示全部楼层
十分赞同admin楼主!
回复

使用道具 举报

avatar 散漫竹子 | 2021-10-5 06:06:21 | 显示全部楼层
终于看完了,很不错!
回复

使用道具 举报

avatar 123457839 | 2021-10-6 01:15:33 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的源码论坛他的站点都是商业源码,还是免费下载的那种!特别好用。访问地址:http://www.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 旭日非常 | 2021-10-6 10:39:33 | 显示全部楼层
不是惊喜,是惊吓!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则