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