映射文件:
<select id="getProductDynamic2" resultMap="get-product-result" parameterClass="product"> <![CDATA[ select * from t_product ]]> <dynamic prepend="WHERE"> <isNotNull prepend="AND" property="price"> prd_price=#price# </isNotNull> <isNotEmpty prepend="AND" property="description"> prd_description=#description# </isNotEmpty> </dynamic> </select>
注意:CDATA不应包括<dynamic>节点,否则标签不起作用!
DAO层:
public List getProductDynamic2(Product product) throws SQLException { init(); List list = (List)sqlMapClient.queryForList("getProductDynamic2", product); return list; }
TEST类:
public void getProductDynamic2() throws SQLException { Product product = new Product(); product.setPrice(206.99d); product.setDescription("basketball"); List list1 = productDao.getProductDynamic2(product); for(Iterator it=list1.iterator(); it.hasNext();) { Product prd = (Product)it.next(); System.out.println(prd); } /** * 注意:product2里的price(是double型,不是Double型)的值没有设置,所以默认为初始化时的值(0),而不是NULL, 传入到sqlmap映射文件时,被包装成Double类型(ibatis中传入参数的都是引用类型),值为0, 这对statement里的动态语句有影响! */ Product product2 = new Product(); product2.setDescription("basketball"); List list2 = productDao.getProductDynamic2(product2); for(Iterator it=list1.iterator(); it.hasNext();) { Product prd = (Product)it.next(); System.out.println(prd); } }
一元判定 是针对属性值本身的判定,如属性是否为NULL,是否为空值等。
<isEmpty>
检查Collection.size()的值,属性的String或String.valueOf()值,是否为null或空(“”或size() < 1)。
二元判定 有两个判定参数,一是属性名,而是判定值,如
<isGreaterThan prepend="AND" property="age" compareValue="18"> (age=#age#) </isGreaterThan>