MyBatis动态Sql语句
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MyBatis动态Sql语句
MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法
MyBatis中用于实现动态SQL的元素主要有:
if
choose(when,otherwise)
trim
where
set
foreach
1、if
对属性进行判断,如果不为空则执行判断条件
[html] view plain copy
select * from t_student
where
STU_ID = #{stuId}
and STU_NAME = #{stuName}
and STU_CLASS = #{stuClass}
and STU_SEX=#{stuSex}
and STU_AGE=#{stuAge}
来看看结果:
这是从web页面输入的参数
这是输出的结果
这是打印出来的Sql语句
从结果可以看出,只有在条件不为空的时候,属性才会赋值。
2、where
当where中的条件使用的if标签较多时,这样的组合可能会导致错误。我们以在1中的查
询语句为例子,当输入参数stuId为空时,就会报错
然后是输出的结果:
此时SQL语句变成了select * from t_student where and STU_SEX=?这样会报错
如果上面例子,参数stuId为null,将不会进行STUDENT_NAME列的判断,则会直接导“WHERE AND”关键字多余的错误SQL。这时我们可以使用where动态语句来解决。这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。
可以改成如下:
[html] view plain copy
select * from t_student
STU_ID = #{stuId}
and STU_NAME = #{stuName}
and STU_CLASS = #{stuClass}
and STU_SEX=#{stuSex}
and STU_AGE=#{stuAge}
再来看看,输入查询条件
然后输出结果
打印出来的SQL语句
- ==> Preparing: select * from t_student WHERE STU_SEX=?
==> Parameters: 男(String)
<== Total: 14
说明结果是正确的。如果它包含的标签中有返回值的话就插入一个where。此外如果标签返回的内容是以AND或OR开头的,则它会剔除掉。
3、set
当update语句中没有使用if标签时,如果有一个参数为null,都会导致错误。
当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。
使用if+set标签修改后,如果某项为null则不进行更新,而是保持数据库原值。如下示例:
4、trim
trim是更灵活的去处多余关键字的标签,他可以实践where和set的效果。
[html] view plain copy
select * from t_student
STU_ID = #{stuId}
and STU_NAME = #{stuName}
and STU_CLASS = #{stuClass}
and STU_SEX=#{stuSex}
and STU_AGE=#{stuAge}
首先判断是否需要where,如果需要,它会自动判断如果where后面有and或者or,就自动把它们都去掉。prefix是前置的,还有suffix是后置的。
如下输入查找参数stuclass=2。
看看打印出来的语句
suffix是后置的例子
[html] view plain copy
insert into t_student
STU_ID,