该文是对ibatis2开发指南中动态映射章节的总结
参考下面典型查询画面
查询条件有姓名和地址,二者都有为空的可能,如果采用传统的方式,可能需要做下面的查询语句
Select * from t_user;
Select * from t_user where name like ‘%Erica%’ ;
Select * from t_user where address like ‘%Beijing%”;
Select * from t_user where name like ‘%Erica%’ and address like ‘%Beijing%”
如果条件多了,排列组合后,数量几何形式增长。这种工作让人无法忍受。
ibatis的动态查询就是解决上述的问题。直接看下面的列子
<select id="getUsers"
parameterClass="user"
resultMap="get-user-result">
select id, name, sex from t_user
<dynamic prepend="WHERE">
<isNotEmpty prepend="AND" property="name">
(name like #name#)
</isNotEmpty>
<isNotEmpty prepend="AND" property="address">
(address like #address#)
</isNotEmpty>
</dynamic>
</select>
上面的例子,还可以使用嵌套,将address嵌套到name节点中,表明的含义是:只有用户提供了姓名信息时,才能结合地址数据进行查询。
<isNotEmpty prepend="AND" property="name">
( name=#name#
<isNotEmpty prepend="AND" property="address">
address=#address#
</isNotEmpty>
)
</isNotEmpty>
类似isNotEmpty的判断还有下面这些节点
*一元判定
<isPropertyAvailable> 参数类中是否提供了此属性 <isNotPropertyAvailable> 与<isPropertyAvailable>相反 <isNull> 属性值是否为NULL <isNotNull> 与<isNull>相反 <isEmpty>
<isNotEmpty>
*二元判定
<isEqual> 相等。 <isNotEqual> 不等。 <isGreaterThan> 大于 <isGreaterEqual> 大于等于 <isLessThan> 小于 <isLessEqual> 小于等于
二元判断的例子
<isGreaterThan prepend="AND" property="age" compareValue="18"> (age=#age#) </isGreaterThan>