作者介绍
尹德华软件开发工程师
微软认证开发专家(MCPD),多年企业应用开发经验,精通.Net平台应用软件开发与维护,嘉为科技软件开发工程师。
摘要
MyBatis的强大特性之一便是它的动态SQL。如果你有使用JDBC或其他类似框架的经验,你就能体会到根据不同条件拼接SQL语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态SQL这一特性可以彻底摆脱这种痛苦。
通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种情形,这种语言可以被用在任意的SQL映射语句中。
动态SQL元素和使用JSTL或其他类似基于XML的文本处理器相似。在MyBatis之前的版本中,有很多的元素需要来了解。MyBatis大大提升了它们,现在用不到原先一半的元素就可以了。
·if
·choose(when,otherwise)
·trim(where,set)
正文
if动态SQL通常要做的事情是有条件地包含where子句的一部分。比如:
这条语句提供了一个可选的文本查找类型的功能。如果没有传入“name”,那么所有处于“ACTIVE”状态的parameterType类型数据都会返回;反之若传入了“name”,那么就会把模糊查找“name”内容的数据结果返回。
如果想通过两个不同条件来查询,比如说name和age;
choose,when,otherwise有些时候,我们不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis提供了choose元素。
还是上面的列子,不同的是这次变为了提供了name就按name查询,提供了age就按查询,若两者都没有提供,就返回所有符合条件的Vacation。
trim,where,set前面几个例子已经合宜地解决了一个动态SQL问题。现在考虑回到“if”示例,这次我们将“ACTIVE=1”也设置成动态的条件,看看会发生什么。
如果这些条件一个都没匹配到的话,SQL语句最终会成这样:
SELECT*FROMt_vacationmr
WHERE
这会导致查询失败。如果只是第二个条件匹配又会怎样:
SELECT*FROMt_vacationmr
WHERE
ANDnamelike‘anyname’
这个查询也会失败。这个问题不能简单的用条件句式来解决。
MyBatis有一个简单的处理,这在90%的情况下都会有用。而在不能使用的地方,你可以自定义处理方式来令其正常工作。一处简单的修改就能得到想要的效果:
where元素知道只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的,where元素也知道如何将他们去除。
学领未来
学领未来,嘉为教育旗下泛IT职业发展学习服务平台,专注于提供包括职业发展与成长顾问、能力评测与提升建议、学习资源与学习管理、人才评价与认证服务的立体化学习服务。
学习引领更好的未来!常北京专门治疗白癜风的医院北京白癜风怎么治