Mybatis_动态SQL

本文详细介绍了Mybatis中的动态SQL,包括if、choose、when、otherwise、where、trim、set、foreach和bind元素的用法,以及它们在处理SQL语句中的作用,如条件判断、循环、去除多余运算符和逗号等。
摘要由CSDN通过智能技术生成

文章目录

动态SQL是MyBatis的强大特性之一,通过动态SQL,MyBatis允许在XML Mapper 定义的SQL语句中使用分支、循环等控制流程,这样就大大扩展了SQL语句的功能。


使用动态SQL只要掌握以下几个元素即可。

  • if:用于为SQL语句增加分支功能。
  • choose(when、otherwise):用于为SQL语句增加分支功能,类似于switch的功能。
  • trim(where、set):主要用于去掉多余的空格等字符。
  • foreach:用于为SQL语句增加循环功能。

1.if元素的用法

使用场景:当程序必须动态判断用户是否填写了查询条件,并根据条件来拼接SQL语句——这是一件非常乏味的事件。使用动态SQL的<if.../>元素可以优雅地解决这个问题,<if.../>元素允许指定一个test属性,当该属性为true时,SQL语句才会自动拼接上<if.../>元素中间的内容。

代码如下(示例):

<if test=" 元素 !=null and 元素!=''">
    ...
</if>

2.choose、when、otherwise元素的用法

与<if.../>元素类似的还有<choose.../>、<when.../>和<otherwise.../>元素,这写元素也可以实现分支,它们的执行流程有点类似于switch语句:这些分支都是排他性的,程序只能执行其中之一。

代码如下(示例):

<choose>
    <!--当元素不为null时,根据对应的when的内容执行-->
    <when test="元素!=null">
        ...
    </when>

    <!--当元素不为null时,根据对应的when的内容执行-->
    <when test="元素!=null">
       ...
    </when>

    <!--否则根据otherwise的内容执行-->
    <otherwise>
       ...
    </otherwise>
</choose>

3.where与trim的用法

在SQL语句的where条件中使用<if.../>或者<choose.../>元素时,其实是有一个陷阱,当元素在where后使用并且元素不为null时,此时我们会发现会多出and、or等运算符,当where后面原来就带有查询条件这个运算符则是必须的,当没有时,这个运算符则是多余的。为了处理and、or等运算符的问题,mybatis提供了<where.../>元素,该元素不需要指定任何属性,它的用法就是"包含"所有的where条件,,而<where.../>元素可以有效的去除where条件中多余的运算符。

代码如下(示例):

<!--if的使用-->
<where>
    <!--当元素不为null时执行-->
    <if test="元素!=null and 元素!=''">
        ...
    </if>
</where>

<!--choose的使用-->
<where>
   <choose>
       <!--当元素不为null时,根据对应的when的内容执行-->
       <when test="元素!=null">
           ...
        </when>

       <!--当元素不为null时,根据对应的when的内容执行-->
       <when test="元素!=null">
            ...
        </when>

        <!--否则根据otherwise的内容执行-->
        <otherwise>
            ...
        </otherwise>
    </choose>
</where>

<where.../>元素的主要作用就是去掉and、or等运算符,而实际上这些功能都是由<trim.../>元素提供的。
<trim.../>元素支持如下4个属性:

  • prefix:该属性指定<trim.../>元素会动态前置(在前面添加)字符串,比如<where.../>元素就需要根据是否有查询条件动态前置"where"关键字,因此prefix属性就应该被指定为"where"。
  • suffix:该属性与prefix属性的作用类似,只不过它指定动态后置(在后面添加)字符串。
  • prefixOverrides:该属性指定<trim.../>元素会动态删除前面不需要的部分,比如<where.../>元素就需要动态删除查询条件之前的and、or等运算符,因此prefixOverrides属性就应该被指定为"and|or"。
  • suffixOverrides:该属性与prefixOverrides属性的作用类似,只不过它指定动态删除后面不需要的内容。

代码如下(示例):

<trim prefix = "where"  prefixOverrides = "and|or">
   ....
</trim>
 
​
 

4.set与trim的用法

当调用<update.../>元素定义的更新方法时,有时候会出现多出一个逗号——update语句要求set更新的列值之间有英文逗号隔开,结尾时不再需要。mybatis提供了<set.../>元素来处理这个"逗号"问题,该元素不需要指定任何属性,它的用法是"包含"所有的"列名=列值"部分,而<set.../>元素可以有效的去除多余的逗号。

代码如下(示例):

<set>
    <!--元素不为null时执行->
    <if test = "元素!=null">
       ...
    </if>
</set>

<set.../>元素的主要作用就是去掉多余的逗号,而实际上这些功能都是由<trim.../>元素提供的。

代码如下(示例):

<trim suffix = "set" suffixOverrides = ",">
   ....
</trim>
 
​

5.使用trim实现动态插入

根据在<where.../>与<set.../>元素中对<trim.../>的了解,在添加时为了避免出现多余的元素可以在<trim.../>元素中的对应属性上添加内容来避免错误的产生。

6.foreach元素的基本用法

<foreach.../>元素的主要作用就是对一个集合进行遍历,SQL语句使用in运算符之后需要一个形如(a,b,c)的集合,此时即可使用<foreach.../>元素进行构建。

<foreach.../>元素的功能非常强大,它可以对任意类型的集合(包括List、Set、Map、数组)进行遍历,它可以支持如下属性:

(1)index:当遍历的对象是 List、Set或数组时,index指定的变量代表当前遍历的次数:当遍
历的对象是Map时,index指定的变量代表当前遍历的key.
(2)item:当遍历的对象是List、Set或数组时,item指定的变量代表当前遍历的元素:当遍历
的对象是 Map时,item指定的变量代表当前遍历的 value。
(3)open:指定在遍历开始处放置的字符串。
(4)close:指定在遍历结束处放置的字符串。
(5)separator:指定在迭代元素之间添加的分隔符。
(6)collection:该属性指定要遍历的集合,该属性必须指定,不同情况下,该属性的值是不一样的。主要有三种情况:

  1. 若入参为单参数且参数类型是一个List的时候,collection属性值为list。
  2. 若入参为单参数且参数类型是一个数组的时候,collection属性值为array(此处传入参数Integer[] rolelds为数组类型,故此处collection属性值设为“array”)。
  3. 若传入参数为多参数,就需要把他们封装为一个Map进行处理。

代码如下(示例):

<foreach collection="传入的参数" item="item" index="index" 
open = "("separator = ","close =")">    
    #{item}
</foreach>

7.bind元素的用法

<bind.../>元素很简单,它的作用就是在XML映射文件中定义一个变量,接下来即可在动态SQL语句中直接复用该变量。
使用<bind.../>元素只要指定如下两个属性:

  • name:该属性指定变量名。
  • value:该属性指定变量值,value指定一个OGNL表达式。

代码如下(示例):

<!--只能在元素内使用-->
<bind name="变量名" value="变量名"/>
<!--举例-->
<bind name="titlePattern" value="'%'+pattern+'%'"/>

使用<bind.../>元素主要有如下两个优势:

  1. 提供复用。例如,以上示例中定义了titlePattern变量之后,接下来即可在动态SQL语句中使用#{变量名}的方式多次复用该变量。
  2. 提高可移植性。当在动态SQL语句中用到一些与数据库特性相关的代码片段时,可以考虑将这部分代码片段提到<bind.../>元素中定义,这样就避免了系统在不同数据库之间移植时修改动态SQL语句,只要修改使用<bind.../>元素定义的代码片段即可。

总结

Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时 只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。

通过 xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。(从执行 sql 到返回 result 的过程)。

Mybaits动态SQL的优点:

  1. 基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任 何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 XML 标签,支持编写动态 SQL 语句,并可重用。
  2. 与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不 需要手动开关连接;
  3. 很好的与各种数据库兼容(因为 MyBatis 使用 JDBC 来连接数据库,所以只要 JDBC 支持的数据库 MyBatis 都支持)。
  4. 能够与 Spring 很好的集成;
  5. 提供映射标签,支持对象与数据库的 ORM 字段关系映射;提供对象关系映射 标签,支持对象关系组件维护。

MyBatis动态SQL的缺点:

  1. SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写 SQL 语句的功底有一定要求。
  2. SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值