MyBatis 动态拼接Sql字符串的问题

 更新时间:2016年08月18日 10:20:29   投稿:mrr  
MyBatis的动态SQL,解决了SQL字符串拼接的痛苦。下文分步骤给大家详细介绍了MyBatis 动态拼接Sql字符串的问题,非常不错,感兴趣的朋友一起看下吧

MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态 SQL 可以彻底处理这种痛苦。

动态SQL

MyBatis的动态SQL,解决了SQL字符串拼接的痛苦。

1.if

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

这条一句会提供一个可选的文本查找功能。如果没有传递title,那么所有激活的博客都会被返回。
如果传递了title,那么就会查找相近的title。

2.choose,when,otherwise

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

注:如果上述条件都没有匹配,则会变成SELECT * FROM BLOG WHERE
如果仅有第二个匹配,则会变成SELECT * FROM BLOG WHERE AND title LIKE somelike
显然这样会查询失败。要解决这个问题,mybatis提供了解决方法。

<select id="findActiveBlogLike"
parameterType="BLOG" resultType="BLOG">
SELECT * FROM BLOG
WHERE
<trim prefix="WHERE" prefixOverrides="AND |OR ">
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND title like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</trim>
</select>

overrides属性采用管道文本分隔符来覆盖,这里的空白是重要的。它的结果就是移除在InnerText中overrides中指定的内容。

3.set

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

同上的问题,优化后:

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

以上所述是小编给大家介绍的MyBatis 动态拼接Sql字符串的问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Mybatis如何获取最新插入数据的id

    Mybatis如何获取最新插入数据的id

    这篇文章主要介绍了Mybatis如何获取最新插入数据的id,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java中this和super关键字的使用详解

    Java中this和super关键字的使用详解

    super 代表父类的存储空间标识(可以理解为父亲的引用)。 this代表当前对象的引用(谁调用就代表谁)。本文将通过简单的示例介绍二者的使用与区别,需要的可以了解一下
    2022-10-10
  • js实现拖拽拼图游戏

    js实现拖拽拼图游戏

    这篇文章主要为大家详细介绍了js实现拖拽拼图游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java动态规划之硬币找零问题实现代码

    Java动态规划之硬币找零问题实现代码

    这篇文章主要介绍了Java动态规划之硬币找零问题实现代码,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java中volatile关键字的作用

    Java中volatile关键字的作用

    这篇文章主要介绍了Java中volatile关键字的作用,文章基于Java的相关资料展开对volatile关键字作用的详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • RocketMQ中的消息发送与消费详解

    RocketMQ中的消息发送与消费详解

    这篇文章主要介绍了RocketMQ中的消息发送与消费详解,RocketMQ是一款高性能、高可靠性的分布式消息中间件,消费者是RocketMQ中的重要组成部分,消费者负责从消息队列中获取消息并进行处理,需要的朋友可以参考下
    2023-10-10
  • Java进阶学习:jar打包详解

    Java进阶学习:jar打包详解

    Java进阶学习:jar打包详解...
    2006-12-12
  • java.io.UnsupportedEncodingException异常的正确解决方法(亲测有效!)

    java.io.UnsupportedEncodingException异常的正确解决方法(亲测有效!)

    这篇文章主要给大家介绍了关于java.io.UnsupportedEncodingException异常的正确解决方法,文中介绍的办法亲测有效,java.io.UnsupportedEncodingException是Java编程语言中的一个异常类,表示指定的字符集不被支持,需要的朋友可以参考下
    2024-02-02
  • SpringCloud注册中心部署Eureka流程详解

    SpringCloud注册中心部署Eureka流程详解

    Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的
    2022-11-11
  • 如何正确控制springboot中bean的加载顺序小结篇

    如何正确控制springboot中bean的加载顺序小结篇

    这篇文章主要介绍了如何正确控制springboot中bean的加载顺序总结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07

最新评论