iBatis学习(四)动态Mapped Statement

    技术2022-05-11  18

           直接使用JDBC一个非常普遍的问题是动态SQL。使用参数值、参数本身和数据列都是动态的SQL,通常非常困难。典型的解决方法是,使用一系列if-else条件语句和一连串讨厌的字符串连接。对于这个问题,SQL Map API使用和mapped statement非常相似的结构,提供了较为优雅的方法。这里是一个简单的例子:<select id="dynamicGetAccountList"cacheModel="account-cache"resultMap="account-result" >select * from ACCOUNT<isGreaterThan prepend="and" property="id" compareValue="0">where ACC_ID = #id#</isGreaterThan>order by ACC_LAST_NAME</select>上面的例子中,根据参数bean“id”属性的不同情况,可创建两个可能的语句。如果参数“id”大于0,将创建下面的语句:select * from ACCOUNT where ACC_ID = ?或者,如果“id”参数小于等于0,将创建下面的语句:select * from ACCOUNT在更复杂的例子中,动态Mapped Statement的用处更明显。如下面比较复杂的例子:<statement id="dynamicGetAccountList" resultMap="account-result" >select * from ACCOUNT<dynamic prepend="WHERE"><isNotNull prepend="AND" property="firstName">(ACC_FIRST_NAME = #firstName#<isNotNull prepend="OR" property="lastName">ACC_LAST_NAME = #lastName#</isNotNull>)</isNotNull><isNotNull prepend="AND" property="emailAddress">ACC_EMAIL like #emailAddress#</isNotNull><isGreaterThan prepend="AND" property="id" compareValue="0">ACC_ID = #id#</isGreaterThan></dynamic>order by ACC_LAST_NAME</statement>根据不同的条件,上面动态的语句可以产生16条不同的查询语句。使用if-else结构和字符串,会产生上百行很乱的代码。而使用动态Statement,和在SQL的动态部位周围插入条件标签一样容易。例如:<statement id="someName" resultMap="account-result" >select * from ACCOUNT<dynamic prepend="where"><isGreaterThan prepend="and" property="id" compareValue="0">ACC_ID = #id#</isGreaterThan><isNotNull prepend=”and" property="lastName">ACC_LAST_NAME = #lastName#</isNotNull></dynamic>order by ACC_LAST_NAME</statement>上面的例子中,<dynamic>元素划分出SQL语句的动态部分。动态部分可以包含任意多的条件标签元素,条件标签决定是否在语句中包含其中的SQL代码。所有的条件标签元素将根据传给动态查询Statement的参数对象的情况来工作。<dynamic>元素和条件元素都有“prepend”属性,它是动态SQL代码的一部分,在必要情况下,可以被父元素的“prepend”属性覆盖。上面的例子中,prepend属性“where”将覆盖第一个为“真”的条件元素。这对于确保生成正确的SQL语句是有必要的。例如,在第一个为“真”的条件元素中,“AND”是不需要的,事实上,加上它肯定会出错。以下小节讨论不同的条件元素,包括二元条件元素,一元条件元素和其他动态元素。


    最新回复(0)