动态SQL概况

MyBatis 的强大特性之一便是它的动态 SQL
在Java开发中经常遇到条件判断,比如:
if(x>0){
//执行一些逻辑........
}
 
Mybatis应用中,SQL映射通常位于XML文件内,在执行前需要将XML中的映射转换为最终要执行的SQL
在转换中是否可以根据输入动态的处理SQL?这就是动态SQL,比如
<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
上面的<if test="title != null"> 就是动态SQL处理,将会根据实际传递的title的值,动态的决定SQL的内容,是否包含最后面的AND
Mybatis的动态SQL元素不多,但是简单高效,Mybatis的动态SQL元素类似JSTL
类型主要有三种:
  • 条件判断
  • 内容处理
  • 循环处理

对于每种不同的类型又有各自的格式和属性
 

条件处理

if是最基本的一种形式,语意为:如果xxx就xxx
通过最基本的if可以构造很复杂的条件测试语句,相当于
if(){
}
choose是特殊化的if,相当于
if(){
}else{
}
你可以添加多个if,比如
if(){
}if(){
}if(){
}else{
}
通常对于一个choose是可以拆分为多个if条件的,但是很显然,某些场景下,使用if else的形式比多个if 要更加简单清晰
if和choose里面when后的条件都是使用test进行设置的

内容处理

trim用于动态内容头尾的处理,可以添加前缀prefix或者添加后缀suffix
也可以移除匹配的指定的前缀prefixOverrides,或者移除匹配的指定的后缀suffixOverrides
简言之可以借助于trim对拼接内容的头尾进行处理
where相当于
<trim prefix="WHERE" prefixOverrides="AND |OR ">

表示在最前面添加where,如果最开始是AND 或者OR 将会进行删除

set相当于<trim prefix="SET" suffixOverrides=",">

表示在最前面添加set,如果最后面是一个逗号,   将他删除

循环遍历

foreach用于动态的循环拼接,相当于for循环动态拼接内容
for(int i =0;i<list.size;i++){
String s +=“...”;
}
对于foreach,需要指明需要遍历循环的参数名称,通过collection指定
需要指定循环变量,也就是在循环中使用哪个变量指代,相当于Object o = list.get(i);  使用item指定的就是这个o
还可以指定变量用于记录索引,通过这个索引变量可以获得迭代的次数索引,通过index
对于open, separator, close,就是在字符串拼接的开头,中间,结尾,添加的分割符信息。

总结

在实际项目应用中,总是有很多的查询条件或者关联语句,但是并不是每一次的查询都需要完整的语句,难道每种场景都重新写一个SQL吗?
显然是效率低下的,Mybatis的动态SQL就是解决这种问题的
动态SQL就是根据条件动态的处理SQL语句,进而达到不同场景不同SQL的作用,也就是写一次SQL,然后经过条件分支或者内容的处理,能够在多个场景进行使用
从上面的介绍也可以看得出来,动态SQL的本质在于根据条件,对SQL语句处理,可以理解为文本处理工作
他只是Mybatis一次执行时实际执行的SQL语句,不管是if还是choose 还是where还是trim,再或者是foreach,都是简单的对SQL进行拼接、处理、优化
对于程序员来说,最重要的就是条件的判断,也就是test后面的语句的书写,再就是确认各种条件判断后处理后的SQL语句不会出现什么问题就够了
但是还需要注意,尽管Mybatis有动态SQL功能,可以灵活的拼接SQL,但是也不要滥用,尽可能业务逻辑比较相似的,通过条件进行控制
试想,如果一整个表的所有逻辑全都是一个SQL,通过各种if choose拼接起来,可读性是一个很大的问题,所以也要合理
简单说几点就是:
  • 动态SQL本质就是SQL语句的文本处理工作,无他
  • 要注意条件语句的设置
  • 不要滥用动态SQL,该分开还是得分开
对于动态SQL根本仍旧是SQL的编写,所以需要具有良好的SQL语句编写能力,动态SQL只是可以让他更加灵活,并不能解决你SQL中的任何问题,或者性能问题
要始终记住,他只是处理需要执行的SQL
 

Mybatis动态SQL简单了解 Mybatis简介(四)的更多相关文章

  1. MyBatis 动态SQL(十二)

    动态条件查询 以下是我们数据库表 tb_user 的记录: 假设现在有一个需求,就是根据输入的用户年龄和性别,查询用户的记录信息.你可能会说,这太简单了,脑袋里立马蹦出如下的 SQL 语句: SELE ...

  2. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...

  3. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法   动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...

  4. 自己动手实现mybatis动态sql

    发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...

  5. mybatis原理分析学习记录,mybatis动态sql学习记录

    以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...

  6. mybatis 动态sql和参数

    mybatis 动态sql 名词解析 OGNL表达式 OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性, ...

  7. MyBatis动态sql之${}和#{}区别

    前言 ​ 接触mybatis也是在今年步入社会之后,想想也半年多了,缺没时间去系统的学习,只知道大概,也是惭愧. ​ 不知道有多少刚毕业的同学和我一样,到现在还没仔仔细细去了解你每天都会见到使用到的框 ...

  8. Mybatis 动态Sql语句《常用》

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

  9. mybatis 动态sql语句(3)

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. ...

随机推荐

  1. USACO 邮票 Stamps

    f[x]表示组成 x 最少需要的邮票数量 一一举例 最多贴5张邮票,有三种邮票可用,分别是1分,3分,8分 组成0分需要0张邮票 ——f[0]=0 组成1分需要在0分的基础上加上一张1分邮票 ——f[ ...

  2. centOS7.3安装配置NFS服务

    在安装和运行NFS服务中,发现了一个需要警惕的地方. 运行2个centOS7.3系统.由于前面一篇已经写了使用xshell进行远程,所以,直接远程进行操作: chen-01做为服务端,chen-02做 ...

  3. 洛谷p3799:妖梦切木棒

    题意:任选四段木板拼正三角形 因为是正三角形 所以我们可以想到至少是两个相同的,剩下两个拼成最后一条边 我们只需要枚举边长即可 那么我们对每次读入的x,使他的cnt++ 考虑用一个二重循环 外层枚举边 ...

  4. AWSS3异步等待上传成功返回结果

    /// <summary> /// 流上传文件 /// </summary> /// <param name="data">流内容</pa ...

  5. 常用的Tensor操作

    常用的Tensor操作 1.通过tensor.view方法可以调整tensor的形状,但必须保证调整去前后元素总数一致.view不会修改自身的数据,返回新的tensor与原tensor共享内存,即更改 ...

  6. 使用POST下载文件

    一直以来,JS都没有比较好的可以直接处理二进制的方法.而Blob的存在,允许我们可以通过JS直接操作二进制数据.一.下载util.fetchDownload= function (opt,data) ...

  7. SPA 单页面应用程序。

    看到这个问题,先说下自己的理解到的程度,再去参考做修正,争取这一次弄懂搞清楚 自己的理解: 单页面应用程序,解决浏览器获取数据刷新页面的尴尬,通过ajax请求获取数据达到异步更新视图的按钮,原理的实现 ...

  8. protobuf是什么?

      ProtoBuf (Google Protocol Buffer)是由google公司用于数据交换的序列结构化数据格式,具有跨平台.跨语言.可扩展特性,类型于常用的XML及JSON,但具有更小的传 ...

  9. jsp 表单回显

    1.在表单各个字段中添加value属性,如:value="${user.reloginpass }" 2.在表单提交对应的servlet中封装数据到uer中,如:req.setAt ...

  10. 循环结构for

    教程:高能:语句结构都是由关键字开头,用冒号结束! 一:语句结构 for <variable> in <sequence>:    <statements>else ...