专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
黑马程序员  ·  2025年,Java开发要起飞了吗? ·  4 天前  
黑马程序员  ·  2025年,Java开发要起飞了吗? ·  4 天前  
芋道源码  ·  如何优雅的将设计模式运用到实际项目中去? ·  4 天前  
芋道源码  ·  秒懂双亲委派机制! ·  5 天前  
51好读  ›  专栏  ›  ImportNew

MyBatis(4):动态SQL

ImportNew  · 公众号  · Java  · 2016-12-22 20:12

正文

(点击上方公众号,可快速关注)


来源:五月的仓颉

链接:www.cnblogs.com/xrq730/p/5289638.html


什么是动态SQL


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


通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种情形,这种语言可以被用在任意映射的SQL语句中。


动态SQL元素和使用JSTL或其它相似的基于XML的文本处理器相似,在MyBatis之前的版本中,有很多元素需要了解,MyBatis3大大地提升了它们,现在用不到原先一半的元素就能工作了,MyBatis采用功能强大的基于OGNL的表达式来消除其他元素。


OK,介绍就到这儿,下面来进入动态SQL的学习吧。


if


在动态SQL中所做的最通用的事情就是包含部分where子句的条件,比如:


   

        select * from student where studentId > #{studentId}

    ]]>

   

        and studentName = #{studentName}

   

   

        and studentAge = #{studentAge};

   


注意一下,能用””尽量还是用,不过只包动态SQL外的内容。


另外,test里面可以判断字符串、整型、浮点型,大胆地写判断条件吧。如果属性是复合类型,则可以使用A.B的方式去获取复合类型中的属性来进行比较。


choose、when、otherwise


有时候我们不想应用所有的应用条件,相反我们想选择很多情况下的一种。和Java中的switch…case…类似,MyBasit提供choose元素。


上面的例子是两种if判断都可能存在,接下来使用choose、when、other做一些修改:


   

        select * from student where

    ]]>

   

        and studentName = #{studentName}

   

   

        and studentAge = #{studentAge};

   


如果所有条件都不匹配,那么生成的SQL语句将是:


select * from student where


这将导致查询失败。即使只满足一个查询条件还是有问题,比如满足studentName那个吧,生成的SQL语句将是:


select * from student where and studentName = #{studentName};


这个查询也会失败。


解决办法也有,一个讨巧的办法是用where 1 = 1的方式,即:


   

        select * from student

    ]]>

   

       

            and studentName = #{studentName}

       

       

            and studentAge = #{studentAge};

       

   


where元素知道如果由被包含的标记返回任意内容,就仅仅插入where。而且,如果以”and”或”or”开头的内容,那么就会跳过where不插入。


如果where元素没有做出你想要的,那么可以使用trim元素来自定义。比如,和where元素相等的trim元素是:



即:


   

        SELECT * FROM POST P WHERE ID in

    ]]>

   

        open="(" separator="," close=")">

        #{item}

   


foreach是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。他也允许你指定开放和关闭字符串,在迭代之间放置分隔符。这个元素是很智能的,它不会偶然地附加多余的分隔符。


本系列:



觉得本文对你有帮助?请分享给更多人

关注「ImportNew」,看技术干货