一、动态SQL简介

MyBatis的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。有些时候,SQL语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息。使用Oracle的序列、mySQL的函数生成Id。这时我们可以使用动态SQL。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。

MyBatis中用于实现动态SQL的元素主要有:

1、if和where

2、choose(when,otherwise)

3、trim

4、set

5、foreach

下面将逐一进行介绍。

二、动态SQL的元素详解

首先来介绍一下SQL片段,它可以把动态SQL的判断部分独立处理,以便其他查询进行复用。

SQL片段定义方式:

引用SQL片段

1、if和where

if就是简单的条件判断,利用if语句我们可以实现某些简单的条件选择。动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。

使用示例:

查询语句块:

resultType="com.kang.pojo.UserCustom">

SELECT * FROM USER

where元素的作用是会在写入where元素的地方输出一个where,另外一个好处是你不需要考虑where元素里面的条件输出是什么样子的,MyBatis会智能的帮你处理。如果所有的条件都不满足那么MyBatis就会查出所有的记录;如果输出后是and这个单词开头的,MyBatis会把第一个单词and忽略,当然如果是or开头的,MyBatis也会把它忽略。此外,在where元素中你不需要考虑空格的问题,MyBatis会智能的帮你加上。

SQL片段:

and user.sex = #{userCustom.sex}

and user.username LIKE '%${userCustom.username}%'

上述配置意思非常简单,如果你提供了sex参数,那么就要满足sex!=null和sex!=''两个条件,同样如果你提供了username参数的时候,也需要满足相应的条件,之后就是返回满足这些条件的所有user,这是非常有用的一个功能,以往我们使用其他类型框架或者直接使用JDBC的时候, 如果我们要达到同样的选择效果的时候,我们就需要拼SQL语句,这是极其麻烦的,比起来,上述的动态SQL就要简单多了。

如果输入是sex=1和username=null,那么上述配置产生的SQL语句就是:

SELECT * FROM USER where user.sex = #{userCustom.sex}

而不是:

SELECT * FROM USER and user.sex = #{userCustom.sex}

因为where标签自动加入了"where"这个关键字,而且去掉了"and"这个单词,并在where的前后自动加入了空格,最终组合成相应的SQL语句。

2、choose

choose元素的作用就相当于JAVA中的switch语句,基本上跟JSTL中的choose的作用和用法是一样的,通常都是与when和otherwise搭配的。

使用示例:

resultType="com.kang.pojo.UserCustom">

SELECT * FROM USER

and user.sex = #{userCustom.sex}

and user.username LIKE '%${userCustom.username}%'

and user.id = 1

上述配置中,when元素表示当when中的条件满足的时候就输出其中的内容,跟JAVA中的switch效果差不多的是按照条件的顺序,当when中有条件满足的时候,就会跳出choose,即所有的when和otherwise条件中,只有一个会输出,当所有的条件都不满足的时候就输出otherwise中的内容。

3、trim

trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是prefix和suffix;可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOverrides;正因为trim有这样的功能,所以我们也可以非常简单的利用trim来代替where元素的功能。

使用示例:

resultType="com.kang.pojo.UserCustom">

SELECT * FROM USER

and user.sex = #{userCustom.sex}

and user.username LIKE '%${userCustom.username}%'

4、set

set元素主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的,主要是在set标签包含的语句前输出一个set。如果包含的语句是以逗号结束的话将会把该逗号忽略。如果set包含的内容为空的话则会出错。有了set元素我们就可以动态的更新那些修改了的字段,而不用每次更新全部字段。

使用示例:

update user

username=#{username},

birthday=#{birthday},

sex=#{sex},

address=#{address}

where id = #{id}

5、foreach

foreach的主要用在构建in条件中,它可以在SQL语句中迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。

item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束。

collection属性用于指定传入参数的类型。该属性是必须指定的,在不同情况下,该属性的值是不一样的,主要有一下3种情况:

如果传入的是单参数且参数类型是一个List类型的时候,collection属性值为list。

如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array。

如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map。实际上在传入参数的时候,MyBatis也是把它封装成一个Map的,List实例将会以“list”作为键,而数组实例将会以“array”作为键。这个时候collection属性值就是传入的List或array对象在封装自身的map里面中的对应key。

传入List的使用示例:

首先是查询接口:

public List findUserList(List ids);

对应xml文件中的配置:

SELECT * FROM USER WHERE id IN

SQL 拼接语句输出_一文了解Mybatis中动态SQL的实现相关推荐

  1. c++ 传入动态参数_一文了解Mybatis中动态SQL的实现

    一.动态SQL简介 MyBatis的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的 ...

  2. 9、mybatis中动态sql的使用

    对于初学者,如何进行mybatis的学习呢?我总结了几点,会慢慢的更新出来.首先大家需要了解mybatis是什么.用mybatis来做什么.为什么要用mybatis.有什么优缺点:当知道了为什么的时候 ...

  3. Mybatis中动态sql小结

    这篇文章讲述的是Mybatis中动态sql小结,如有错误或不当之处,还望各位大神批评指正. 什么是动态sql MyBatis 的强大特性之一便是它的动态 SQL,它极大的简化了我们拼接SQL的操作. ...

  4. MyBatis中动态sql实现时间范围比较的查询

    场景 前端传递两个时间参数,开始时间和结束时间,然后从数据库中筛选出某个时间属性在此范围的数据. Mybatis的动态sql的写法. 注: 博客: https://blog.csdn.net/bada ...

  5. MyBatis中动态sql的模糊搜索、foreach实现In集合的用法

    场景 在使用MyBatis的动态sql时,常见的是传递一个ID的数组,查询记录的 ID在这个数组中的记录和模糊搜索这两种场景. 注: 博客: https://blog.csdn.net/badao_l ...

  6. Mybatis中动态Sql语句的拼接分析

    一.动态查询 1.方式一: <!--if标签--><!--if中的test属性必须录入,其内部为ognl表达式,不需要#{}.如果test内满足,则主体语句执行--><s ...

  7. MyBatis中动态sql语句标签详解

    动态 SQL 通常写在mapper包下面的地址映射配置文件(.xml)中.根据条件的不同, SQL 语句也会随之动态的改变. MyBatis 中,提供了一组标签用于实现动态 SQL. 动态SQL语句标 ...

  8. mybatis的简单查询用语句吗_面试官:Mybatis中的TypeHandler你用过吗?

    前言 相信大家用Mybatis这个框架至少一年以上了吧,有没有思考过这样一个问题:数据库有自己的数据类型,Java有自己的数据类型,那么Mybatis是如何把数据库中的类型和Java的数据类型对应的呢 ...

  9. MyBatis中动态SQL

    01为什么使用sql语句的动态拼接 目前学习的内容sql语句都是直接写死的,但是在实际的开发过程中很多的sql语句都是根据不同的业务情况进行不同的改变的 02 解决的方案 sql语句的动态拼接 03学 ...

最新文章

  1. StereoDRNet:基于stereo的三维重建网络
  2. 经管资源库项目的总结笔记
  3. cd 在windows下 无法切换盘符目录
  4. 运维:windows+python+route的一次相遇
  5. 转载---sharepoint相关资源
  6. 如何调整Loadrunner中Vuser的数量限制
  7. 从Visual Studio中生成Linux设备
  8. HTTPS下导出excel失败解决办法
  9. ASUS K401L安装Windows8.1注意事项
  10. 将dll制作成控件_案例丨首例将影视作品制作成网络图片集被判侵权案 二审维持原判...
  11. Linux基础命令---显示文本grep
  12. python人机对战的实验步骤_人机对战初体验:Python实现四子棋游戏
  13. bzoj 4556 字符串 —— 后缀数组+主席树
  14. spring cloud互联网分布式微服务云平台规划分析--spring cloud服务监控中心
  15. risksystem_《环境风险评价系统(RiskSystem)》1.1版
  16. 分享活动报名收费的微信小程序制作功能介绍_瑜伽健身房培训报名小程序开发介绍
  17. eclipse上安装并配置tomcat
  18. Excel导入导出功能
  19. 机器学习算法: 朴素贝叶斯算法
  20. java 监控usb端口插拔_监控USB设备插拔

热门文章

  1. SQLServer Profiler 跟踪器
  2. 了解JavaScript中的Memoization以提高性能,再看React的应用
  3. jQuery中的函数汇总1
  4. spring mvc controller json数据
  5. 反复出现的PSW木马, 附日志,请高手指点
  6. ZZULIOJ 1101: 逆序数字(函数专题)
  7. 某公司的雇员分为以下若干类: Employee:这是所有员工总的父类, 属性: 员工的姓名,员工的生日月份。 方法:getSalary(
  8. OJ1085: 求奇数的乘积(多实例测试)(C语言)
  9. 信息学奥赛一本通(1318:【例5.3】自然数的拆分)
  10. 信息学奥赛一本通(1195:判断整除)