本篇第一版本基于有一定了解的哥们准备的。之后有时间会把关联资料补齐,我也在整理学习中。开始转载记录:
<select id="SelectEemployee" parameterClass="string" resultMap = "employee-result"> select * from employee //动态SQL语句 <dynamic prepend="WHERE"> <isParameterPresent> emp_id = #value# </isParameterPresent> </dynamic> </select> </statements> </sqlMap>
补充规范示例:
<isGreaterThan prepend="and" compareValue="-1" property="State"> State = #State# </isGreaterThan> <isNotEqual prepend="and" property="OrderStateTime" compareValue="0001-1-1 0:00:00" > CreateDate>=#OrderStateTime# </isNotEqual> <isNotEqual prepend="and" property="OrderEndTime" compareValue="0001-1-1 0:00:00" > <![CDATA[ CreateDate <= #OrderEndTime#]]> </isNotEqual> <isNotEmpty prepend="and" property="OrderId"> id like '%$OrderId$%' </isNotEmpty>
/*动态SQL的写法:
开始 <dynamic
条件成立时前面要加的字符串 prepend ="字符串">
<属性关键字 (见下表)
prepend="字符串"
判断条件的对象属性名 property="字符串"
如果是属性关键字是比较条件时,字符串存放要比较的值compareValue="字符串">
要显示的条件名
</属性关键字>
结束</dynamic>
*/
/*动态SQL的参数有
属性关键字 |
含义 |
<isEqual> |
如果参数相等于值则查询条件有效。 |
<isNotEqual> |
如果参数不等于值则查询条件有效。 |
<isGreaterThan> |
如果参数大于值则查询条件有效。 |
<isGreaterEqual> |
如果参数等于值则查询条件有效。 |
<isLessEqual> |
如果参数小于值则查询条件有效。如下所示: <isLessEqual prepend = ”AND” property = ”age” compareValue = ”18” > ADOLESCENT = ‘TRUE’ </isLessEqual> |
<isPropertyAvailable> |
如果参数有使用则查询条件有效。 |
<isNotPropertyAvailable> |
如果参数没有使用则查询条件有效。 |
<isNull> |
如果参数为NULL则查询条件有效。 |
<isNotNull> |
如果参数不为NULL则查询条件有效。 |
<isEmpty> |
如果参数为空则查询条件有效。 |
<isNotEmpty> |
如果参数不为空则查询条件有效。参数的数据类型为Collection、String 时参数不为NULL或“”。如下所示: <isNotEmpty prepend=”AND” property=”firstName” > FIRST_NAME=#firstName# </isNotEmpty> |
<isParameterPresent> |
如果参数类不为NULL则查询条件有效。 |
<isNotParameterPresent> |
Checks to see if the parameter object is not present (null). Example Usage: <isNotParameterPresent prepend=”AND”> EMPLOYEE_TYPE = ‘DEFAULT’ </isNotParameterPresent> |
其实在IBATIS中SQL的解析是比较符合常规的数据库的SQL操作的,它的XML解析功能做得是比较实用的,适合用JAVA程序员管用的思维,给一段代码:
<select id="querySysLogList" parameterClass="SystemLogPara" resultMap="SystemLogResult" > select * from ( SELECT r.*,rownum rn from ( select * from AMS_SYSTEM_LOG t <dynamic prepend="where"> <isNotNull prepend="AND" property="userID"> t.UserID like '%$userID$%' </isNotNull> <isNotNull prepend="AND" property="userName"> t.UserName like '%$userName$%' </isNotNull> <isNotNull prepend="AND" property="operObjectName"> t.OperObjectName like '%$operObjectName$%' </isNotNull> <isNotNull prepend="AND" property="theModule"> t.TheModule like '%$theModule$%' </isNotNull> <isNotNull prepend="AND" property="userIP"> t.UserIP like '%$userIP$%' </isNotNull> <isNotNull prepend="AND" property="operResult"> OperResult like '%$operResult$%' </isNotNull> <isNotNull prepend="AND" property="beginTime"> t.OperTime >= #beginTime# </isNotNull> <isNotNull prepend="AND" property="endTime"> <![CDATA[ t.OperTime <= #endTime# ]]> </isNotNull> <isNotNull prepend="AND" property="userGroupList"> <iterate property="userGroupList" open="(" close=")" conjunction="OR"> t.userGroupKey like '%$userGroupList[]$%' </iterate> </isNotNull> </dynamic> order by t.OperTime desc ) r <![CDATA[ ) s where s.rn <= #endRowNum# and s.rn >=#startRowNum# ]]> </select>
仔细看以上的查询配置不难看出,这个SQL提供了动态条件判断的物理分页查询,代码的效率还是不错的。