Mybatis动态SQL简单了解 Mybatis简介(四)
程序员文章站
2022-11-22 07:55:22
本文对Mybatis的动态SQL进行了简单介绍,一定要理解动态SQL的本质,那就是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 ">
set相当于<trim prefix="set" suffixoverrides=",">
循环遍历
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
上一篇: 过年了一般你在聚会上都在干什么
下一篇: js 实现二级联动