Mybatis动态SQL简单了解 Mybatis简介(四)

动态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简介(四)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Y大宽

1️⃣序列获取(3):蛋白质序列获取

7510
来自专栏Y大宽

2️⃣ 双序列比对(1):算法及数据库

注意:动态规划和BLAST适用于不同比对情况。前者适合较少量序列间比对,BLAST适合从一组大量序列中搜索与查询相似的序列

24120
来自专栏Kevin-ZhangCG

并发出体验 -- 解决小规模并发下单的问题

  现在有这么一个业务场景,线上通过手机app下单买祈福灯,支付成功后,线下寺庙点亮。存在多个 用户同时选择同一个灯的情况出现,如下图。此时,正常情况应为一个用...

12280
来自专栏Y大宽

1️⃣ 序列获取(2):RNA序列获取

虽不编码蛋白质,但是参与包括染色质结构重建,基因表达层面的转录和翻译调控,亚细胞位置等调控。主要来自于

14720
来自专栏钱塘小甲子的博客

SQL学习笔记(一)

注意到,在创建一个table的时候,我们选择了引擎(engine),通常我们有三种engine,分别是InnoDB,MyISAM和MEMORY。第一个是MySq...

10340
来自专栏Java架构

作为Java程序员,对你影响最大的黄金五年,你准备如何把握好?

在Java业界流行着一种说法——黄金5年,就是从程序员入职时算起,前五年的工作选择直接影响整个职业生涯的职业发展和薪资走向。如何把握这五年,从一个刚入行的菜鸟蜕...

18730
来自专栏钱塘小甲子的博客

python + Mongodb小试

很早就想接触一下NoSql了,苦于一直备考。考完FRM二级之后,开始有时间接触新的东西了。Mongdb的名字一听就比Redis有趣。

12220
来自专栏Kevin-ZhangCG

编码规范 -- 如何应对需求变更

  现在的程序员为什么这么累,其实很大程度上来说是加班原因使编码质量占了大部分因素,但是不少同学都不认为是代码质量导致的加班,都认为是不断的需求改动导致的加班。...

20020
来自专栏钱塘小甲子的博客

Tushare与Mysql在python下的演义

        首先给大家介绍的是一个很强大的财经数据接口库,是专门为python准备的哦。不过唯一的缺点是有比较大的数据缺失,这个库就是Tushare财经数据...

40330
来自专栏Y大宽

2️⃣ 双序列比对(2):BLAST详细操作:web版和linux版

网址:https://blast.ncbi.nlm.nih.gov/Blast.cgi 运行方式:本地或web

40640

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励