mybatis 之动态 SQL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis 之动态 SQL相关的知识,希望对你有一定的参考价值。

1、动态 SQL 简介:


    动态 SQL 是 MyBatis 强大特性之一。极大的简化我们拼装 SQL 的操作。

    动态 SQL 元素和使用 JSTL 或者其他类似基于 XML 的文本处理器相似。


    MyBatis 采用功能强大的基于 OGNL 的表达式来简化操作。

    - if

    - choose(when,otherwise)

    - trim(where,set)

    - foreach


2、if:判断(要求是携带了哪个字段查询条件,就带上这个字段的值):


    a、创建一个 EmployeeMapperDynamicSQL 接口,并且在这个接口中提供一个 getEmpsByCondictionIf 方法。(该方法中提供一个 Employee 的参数)在EmployeeMapperDynamicSQL.xml 文件中添加 select 标签,并提供相应的 where 子标签和 if 标签的设置。


技术分享

技术分享


    b、可以看到下图的输出结果中,传入的参数是动态变动的。(下图的 sql 语句 会随着传入的对象属性值的不同而发生相应的改变)


技术分享

    

    注:如果第一个 参数不存在,where 标签会在 sql 第二个的参数 and 去掉。


技术分享

 

2、trim:自定义输出 sql 字符串的截取规则:

    

    -  prefix="" :在trim 标签中输出的字符串添加前缀字符。

    -  suffixOverrides="" :在 trim 标签中输出的字符串删除指定的前缀字符。

    -  suffix="" :在trim 标签中输出的字符串添加后缀字符。

    -  prefixOverrides="":在 trim 标签中输出的字符串删除指定的后缀字符。



技术分享


技术分享


技术分享

    

    注:可以看到,以上输出结果中,前缀的 where 字符串被添加,后缀的 and 被删除掉了。


3、choose(when)标签:相当于 javase 中的 switch-case 条件语句:

(有 id 属性值时以 id 查询,有 lastName 属性值时以 lastName 查询,只选其一。)



技术分享


技术分享


技术分享

    注:可以看到打印出来的 sql 语句中传入的实参为 "%i%"。


3、update、set 标签:用于更新操作:


    a、在 EmployeeMapperDynamicSQL 接口中添加 updateEmp 方法,后在 EmployeeMapperDynamicSQL.xml 文件中添加 update 标签以及 set 子标签。


技术分享


技术分享


    b、下图的输出结果中的 sql 语句中可以看到, last_name 后的 ,因为添加了 set 标签而被去掉, 并且在 tbl_employees 后添加了 set 字符串。   


技术分享


4、动态遍历集合:


    a、在 EmployeeMapperDynamicSQL 中添加 getEmpsByConditionForeach 方法,并在 EmployeeMapperDynamicSQL.xml 文件中设置 select 标签。


    -  foreach 标签:循环遍历属性值

    *  collection 属性:指定要遍历的集合。list 类型的参数会特殊处理封装在 map 中,map 的 key 就叫 list

    *  item:将当前遍历出的元素赋值给指定的变量

    *  separator:每个元素之间的分隔符

    *  open:遍历出的结果字符串前加上的开始字符串

    *  close:遍历出的结果字符串前加上的最后字符串

    * index:遍历 list 的时候,index 就是索引,item 就是当前值

             遍历 map 的时候,index 表示 map 的 key,item 就是当前值


技术分享


技术分享


    b、如下图的输出的 sql 语句,会随着集合的元素数量的不同动态修改 in 后的字符串。


技术分享

5、批量保存:使用 foreach 标签:

    

    a、在 EmployeeMapperDynamicSQL 接口中添加 addEmps 方法,并在 EmployeeMapperDynamicSQL.xml 文件中设置 insert 标签以及 foreach 子标签。


技术分享


技术分享


    b、下图的输出结果中可以看到,批量插入成功。


技术分享

    附:

    1、mybatis 中的两个内置参数:

    _parameter:代表整个参数

      单个参数:_parameter 就是这个参数

      多个参数:参数会被封装到一个 map中:_parameter 就是代表这个 map


    _databaseId:如果配置了 databaseIdProvider 标签,_databaseId 就是代表当前数据库的别名 oracle。


    2、抽取可重用的 sql 片段,方便后面引用:

    sql 抽取:经常要查询的列名,或者插入用的列名(抽取出来方便使用)

    include 来引用已经抽取的 sql


技术分享

    

本文出自 “12392717” 博客,请务必保留此出处http://12402717.blog.51cto.com/12392717/1932126

以上是关于mybatis 之动态 SQL的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis动态SQL

Mybatis 动态 SQL

MyBatis 快速入门:动态SQL

MyBatis--动态sql

MyBatis中的动态SQL

MyBatis4:动态SQL