MyBatis 动态SQL的用法

    动态SQL是MyBatis的一个强大的特性。在使用JDBC操作数据时,如果查询条件特别多,将条件串联成SQL字符串是一件痛苦的事情,通常的解决方法是写很多if-else条件语句对字符串进行拼接,并确保不能忘了空格或在字段的最后省略逗号。MyBatis使用一种强大的动态SQL语言来改善这种情形,动态SQL基于OGNL的表达式,可使我们方便的在SQL语句中实现某些逻辑。用于实现动态SQL元素如下:

    if:利用if实现简单的条件选择。

    choose(when,otherwise):相当于Java中的Switch语句,通常与when和otherwise搭配。

    where:简化SQL语句中where条件判断。

    set:解决动态更新的语句。

    trim:可以灵活的去除多余的关键字。

    foreach:迭代一个集合,通常用于in条件。

一:使用 if+where 是许多条件查询

    1.if

        根据业务需求,由于在查询的时候,用户并不一定的完整的输入所有的查询条件,因此使用动态SQL的if元素来实现多条件查询,具体事例如下:

200510_zSao_3455058.png

动态的SQL语句,if来实现多条件查询,测试类代码如下

    200633_K9UW_3455058.png

运行结果如下:

    200718_6LkW_3455058.png

如果条件为空,则查询出全部数据。

2 where

        where元素主要用来简化SQL语句中的where条件判断,并智能的处理and和or,不必担心多余关键字导致的语法错误,看如下示例:

201145_o1O7_3455058.png

测试类

201309_rcOU_3455058.png

201351_ZlVB_3455058.png

查询出以BJ开头的供应商编号。

二 set 和trim动态实现更新的操作

        在数据库中,修改需要 update set 语句,我们通过日志中的SQL语句和参数,我们发现未被设值的参数也进行了set操作。需要使用动态SQL中的set元素处理。

        set元素主要应用于更新操作,它的主要功能和where元素差不多,主要是在包含的语句前输出一个set,若要包含的语句是以逗号结束的,会自动把该逗号省略掉,再配合if元素就可以动态的更新需要修改的字段,而不需要修改的字段,则可以不再被更新。

           我们也可以使用trim元素来替代set元素,并实现与set一样的效果,示例如下:

    080251_Pzm0_3455058.png

    测试类

        080341_QqBB_3455058.png

结果:

        080416_iZpG_3455058.png

当然还有数据库的数据看是否修改成功

        080457_nBez_3455058.png

三 使用foreach完成复杂查询

        我们先了解一下foreach的基本用法和属性,foreach主要用在构建in条件中,它可以在SQL语句中迭代一个集合,它的属性有:

item:表示集合中每一个元素进行迭代时的别名。

index:指定一个名称,用于表示迭代过程中,每次迭代到的位置。

open:表示该语句以什么开始(既然是in条件语句,所以必然是以“(”开始)。

separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是in条件语句,必然是以“,”作为分隔符)。

close:表示该语句以什么结束(既然是in条件语句,所以必然是以“)”结束)。

collection:最关键病最容易出错的属性,需要格外注意,该属性必须指定,不同情况下,该属性的值必须指定,不同情况下,该属性的的值是不一样的。主要有三种情况:

    1:若入参为单参数且参数类型是一个List的时候,collection属性值为list。

    2:若入参为单参数且参数类形式一个数组的时候,collection属性值为array(此处传入参数Integer[] 数组名 为数组类型 ,此处的collection 属性值设为“array”)。

    3:若传入参数为多参数,就需要把它们封装成为一个Map进行处理。

select 中 返回的是一个resultMap,该resultMap也进行了相应的字段映射。

示例如下:

        083732_zOTb_3455058.png

传参数类型为List,collection为了List,接口里定义的是:

        083940_whvO_3455058.png

测试类:

        084018_JcXE_3455058.png

传入一个值,结果如下:

        084149_XwUf_3455058.png

上面示例是入参为List的时候,下面给大家演示入参为Map的时候:

            084358_2JWO_3455058.png

   接口定义为:

                    084446_dj8h_3455058.png     

          测试类:

                   084549_I6Rq_3455058.png

        结果:

            084620_gYu6_3455058.png

四 choose

        对于某些查询需求,虽有多个查询条件,但是我们不想应用所有的条件,只想选择一种情况下的查询结果。其实和Java中Switch语句相似,MyBatis提供choose元素满足这种需求。

        choose元素的作用相当于Java中的switch语句,基本上跟JSTL中choose的作用和用法是一样的,通常都是搭配when、otherwise使用。下面通过一个示例来演示说明其用法:

            090722_v1BY_3455058.png

        测试类

            090756_8MhW_3455058.png

虽然写了四个条件,但满足第一个后就不执行下面的,如果前三个条件都不提供,默认执行最后一个条件

        结果:

                091019_txUR_3455058.png

因为提供了第一个条件,所以就以第一个条件查出相关数据。

    总结

        MyBatis在SQL映射文件中可以使用灵活、智能的动态SQL来实现SQL映射。

              1. if+set:完成更新操作。

              2. if+where:完成多条件查询。

              3. if+trim:完成多条件查询(替代where)或者更新操作 (替代 set)。

              4. choose(when、otherwise):完成条件查询(多条件下,选择其一)。

               5.foreach:完成复杂查询,主要用于in条件查询中,迭代集合。其中最关键的部分是collection属性,根据不同的入参类型,该属性值亦不同。

 

转载于:https://my.oschina.net/u/3455058/blog/1542047

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值