一般对于一个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