Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了 解决 拼接SQL语句字符串时的痛点问题。
参考:
参考: mybatis – MyBatis 3 | 动态 SQL
sql片段,可以记录一段公共sql片段,在使用的地方通过include标签进行引入
eid,ename,age,sex,did
select from t_emp
if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中的内容不会执行
where和if一般结合使用:
a、若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字
b、若where标签中的if条件满足,则where标签会自动添加where关键字,并将条件最前方多余的 and去掉
注意:where标签不能去掉条件最后多余的and( 不要把and /or 写在子句的后面)
trim用于去掉或添加标签中的内容
常用属性:
prefix:在trim标签中的内容的前面添加某些内容 // trim和if结合使用,要看清楚trim标签的内容到底是什么
prefixOverrides:在trim标签中的内容的前面去掉某些内容
suffix:在trim标签中的内容的后面添加某些内容
suffixOverrides:在trim标签中的内容的后面去掉某些内容
官网中提到:如果 where 元素与你期望的不太一样,你也可以通过自定义 trim 元素来定制 where 元素的功能。比如,和 where 元素等价的自定义 trim 元素为:
...
prefixOverrides 属性会忽略通过管道符分隔的文本序列(注意此例中的空格是必要的)。上述例子会移除所有 prefixOverrides 属性中指定的内容,并且插入 prefix 属性中指定的内容。
choose、when、 otherwise相当于if...else if..else
官网描述:
有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
还是上面的例子,但是策略变为:传入了 “ename” 就按 “ename” 查找,传入了 “age” 就按 “age” 查找的情形,传入了 “gender” 就按 “gender” 查找的情形,传入了 “email” 就按 “email” 查找的情形,
动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)。
foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。
你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。
insert into t_emp values
(null,#{emp.ename},#{emp.age},#{emp.sex},#{emp.email},null)
delete from t_emp where
eid = #{eid}
delete from t_emp where eid in
#{eid}